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

浙公网安备 33010602011771号