通过shell脚本对数据库进行覆盖式备份/迁移,简单方便,适合需要快速同步某个库结构和数据到目标库的场景。
通过AI调试了好些次得到能用的脚本,本文主要是做一个对该脚本的记录
| 安装依赖
# 安装进度条库
sudo apt install pv
注:如果脚本运行所在环境需要先安装mysql-client
(安装mysql时自带),则需要先安装才能使用mysqldump
命令
| 数据库全量同步脚本
将配置部分带<>的内容改为实际的数据库配置,内容保存为sync_data.sh
,然后chmod +x sync_data.sh
给予权限
#!/bin/bash# MySQL全量同步脚本
# 功能:同步源数据库的结构和数据到目标数据库(覆盖模式)# 配置源数据库信息
SRC_HOST="<ipaddress>"
SRC_PORT="<port>"
SRC_USER="<username>"
SRC_PASS="<password>"
SRC_DB="<dbname>"# 配置目标数据库信息
DST_HOST="<ipaddress>"
DST_PORT="<port>"
DST_USER="<username>"
DST_PASS="<password>"
DST_DB="<dbname>"DUMP_FILE="/tmp/mysql_dump.sql"
SUCCESS_FLAG="/tmp/dump_success.flag"# 清除密码命令行警告的安全封装函数
safe_mysql_cmd() {local pass_file=$(mktemp)echo "[client]" > $pass_fileecho "password=$SRC_PASS" >> $pass_filechmod 600 $pass_filemysqldump --defaults-extra-file=$pass_file \-h$SRC_HOST -P$SRC_PORT -u$SRC_USER \--ssl=0 \--single-transaction \--quick \--skip-add-locks \--no-tablespaces \--routines \--events \--triggers \--set-gtid-purged=OFF \--databases $SRC_DB 2>/dev/nullrm -f $pass_file
}progress_bar() {pv -N "$1" -pet -W --rate -i 5
}# 断点续传逻辑
if [[ -f $DUMP_FILE && -f $SUCCESS_FLAG ]]; thenecho "检测到已有导出文件,跳过导出直接导入..."
elseecho "开始全量导出..."# 通过临时密码文件执行安全导出safe_mysql_cmd | progress_bar "导出进度" > $DUMP_FILEif [ ${PIPESTATUS[0]} -eq 0 ]; thentouch $SUCCESS_FLAGecho "导出完成,文件大小: $(du -sh $DUMP_FILE | awk '{print $1}')"elseecho "导出失败,请检查参数!"rm -f $DUMP_FILEexit 1fi
fi# 数据导入
echo "开始全量导入..."
{echo "SET FOREIGN_KEY_CHECKS=0;"echo "DROP DATABASE IF EXISTS $DST_DB;"echo "CREATE DATABASE $DST_DB;"echo "USE $DST_DB;"cat $DUMP_FILE
} | progress_bar "导入进度" | mysql -h$DST_HOST -P$DST_PORT -u$DST_USER -p$DST_PASS \--ssl=0 \--max_allowed_packet=512M \--net_buffer_length=16K \--compress \--show-warningsif [ $? -eq 0 ]; thenrm -f $SUCCESS_FLAG $DUMP_FILEecho "同步成功!"
elseecho "导入失败,请检查目标库权限!下次执行将自动续传"exit 1
fi
运行./sync_data.sh
,等待完成即可。