MySQL数据快速迁移mydumper 和 mydumper

 

 

mydumper 采用多线程导入导出,并对过程进行优化,速度较快,并且导出的是sql,可以兼容不同版本的数据库。

 

#安装依赖
yum install -y pcre2 epel-release libzstd 
#下载(找对应版本)
wget https://github.com/maxbube/mydumper/releases/download/v0.19.3-1/mydumper-0.19.3-1.el8.x86_64.rpm
# 安装
rpm -ivh mydumper-0.19.3-1.el8.x86_64.rpm
# 导出 /home/test/test1/backup
mydumper -u root -p 'root' -B arfdata -o /home/test/test1/backup   -v 3
# 导入 (导入时会先导入数据,再创建索引)
myloader -h 192.168.10.19 -u root -p '123456'  -B arfdata -d /home/test/test1/backup -t 8 -v 3 --overwrite-tables

 

 

备份脚本:先导出SQL,再执行SQL把数据传输到另外MySQL 上最后删除上次备份。结合 crontab 实现每日备份

#!/bin/bash

# 数据库备份与传输脚本
# 功能:按日期备份数据库并使用 myloader -B 参数指定别名导入到远程服务器
# 改进:每个数据库单独处理,备份、传输后立即删除该数据库的旧备份
# 本地MySQL  --->  远程MySQL
# 备份成功会自动删除上一天备份文件

# 配置参数
BACKUP_BASE_DIR="/home/mydumper/backup"
LOG_FILE="$BACKUP_BASE_DIR/xtrabackup.log"
#远程mysql
REMOTE_HOST="192.168.10.19"
REMOTE_USER="root"
REMOTE_PASSWORD="123456"
#本地mysql
MYSQL_USER="root"
MYSQL_PASS="root"
THREADS=8

# 生成日期目录
TODAY=$(date +%Y%m%d)
YESTERDAY=$(date -d "yesterday" +%Y%m%d)

# 数据库列表及别名映射(格式:数据库名=别名)
DATABASE_ALIASES=(
#  "arfdata=backarf_arfdata"
  "xxl_job=backarf_xxl_job"
)

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# 解析数据库别名
get_database_alias() {
  local db=$1
  for alias in "${DATABASE_ALIASES[@]}"; do
    local db_name=$(echo $alias | cut -d'=' -f1)
    local db_alias=$(echo $alias | cut -d'=' -f2)
    if [ "$db_name" == "$db" ]; then
      echo $db_alias
      return 0
    fi
  done
  # 默认别名格式
  echo "backarf_$db"
}

# 备份单个数据库
backup_database() {
  local db=$1
  local backup_dir="${BACKUP_BASE_DIR}/${db}_${TODAY}"
  
  log "开始备份数据库: ${db}"
  
  # 创建备份目录
  mkdir -p "${backup_dir}"
  
  # 执行备份
  mydumper -u ${MYSQL_USER} -p "${MYSQL_PASS}" -B ${db} -o ${backup_dir}  -v 3
  
  if [ $? -eq 0 ]; then
    log "数据库 ${db} 备份成功,保存至: ${backup_dir}"
    return 0
  else
    log "数据库 ${db} 备份失败"
    return 1
  fi
}

# 传输备份到远程服务器并使用别名导入
transfer_backup() {
  local db=$1
  local db_alias=$(get_database_alias $db)
  local backup_dir="${BACKUP_BASE_DIR}/${db}_${TODAY}"
  
  log "开始使用别名 ${db_alias} 导入数据库 ${db} 到远程服务器"
  
  # 执行 myloader 导入(-B 参数指定别名)
  myloader -h ${REMOTE_HOST} -u ${REMOTE_USER} -p "${REMOTE_PASSWORD}" \
    -B ${db_alias} -d ${backup_dir} -t ${THREADS} -v 3 \
    --optimize-keys=AFTER_IMPORT_ALL_TABLES --overwrite-tables
  
  if [ $? -eq 0 ]; then
    log "数据库 ${db} 已使用别名 ${db_alias} 成功导入到远程服务器"
    return 0
  else
    log "数据库 ${db} 导入到远程服务器失败"
    return 1
  fi
}

# 清理指定数据库的旧备份
clean_database_backup() {
  local db=$1
  local old_backup_dir="${BACKUP_BASE_DIR}/${db}_${YESTERDAY}"
  
  log "开始清理数据库 ${db} 的旧备份"
  
  # 检查旧备份目录是否存在
  if [ -d "${old_backup_dir}" ]; then
    # 删除旧备份目录
    rm -rf "${old_backup_dir}"
    
    if [ $? -eq 0 ]; then
      log "已成功删除数据库 ${db} 的旧备份: ${old_backup_dir}"
      return 0
    else
      log "删除数据库 ${db} 的旧备份失败"
      return 1
    fi
  else
    log "数据库 ${db} 的旧备份不存在: ${old_backup_dir}"
    return 0
  fi
}

# 主函数
main() {
  log "开始数据库备份与传输任务"
  
  local all_success=true
  
  # 备份并传输每个数据库
  for alias in "${DATABASE_ALIASES[@]}"; do
    local db=$(echo $alias | cut -d'=' -f1)
    
    log "开始处理数据库: ${db}"
    
    # 备份当前数据库
    backup_database ${db}
    if [ $? -ne 0 ]; then
      log "数据库 ${db} 备份失败,跳过后续操作"
      all_success=false
      continue
    fi
    
    # 传输当前数据库备份
    transfer_backup ${db}
    if [ $? -ne 0 ]; then
      log "数据库 ${db} 传输失败,跳过删除旧备份操作"
      all_success=false
      continue
    fi
    
    # 清理当前数据库的旧备份
    clean_database_backup ${db}
    if [ $? -ne 0 ]; then
      log "清理数据库 ${db} 的旧备份失败"
      all_success=false
    fi
    
    log "数据库 ${db} 处理完成"
    echo
  done
  
  if [ "${all_success}" = true ]; then
    log "所有数据库备份、传输和清理操作成功完成"
  else
    log "数据库操作过程中出现错误,请检查日志"
  fi
}

# 执行主函数
main    

 

posted @ 2025-06-24 13:45  一文搞懂  阅读(76)  评论(0)    收藏  举报