通过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_file
echo "password=$SRC_PASS" >> $pass_file
chmod 600 $pass_file
mysqldump --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/null
rm -f $pass_file
}
progress_bar() {
pv -N "$1" -pet -W --rate -i 5
}
# 断点续传逻辑
if [[ -f $DUMP_FILE && -f $SUCCESS_FLAG ]]; then
echo "检测到已有导出文件,跳过导出直接导入..."
else
echo "开始全量导出..."
# 通过临时密码文件执行安全导出
safe_mysql_cmd | progress_bar "导出进度" > $DUMP_FILE
if [ ${PIPESTATUS[0]} -eq 0 ]; then
touch $SUCCESS_FLAG
echo "导出完成,文件大小: $(du -sh $DUMP_FILE | awk '{print $1}')"
else
echo "导出失败,请检查参数!"
rm -f $DUMP_FILE
exit 1
fi
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-warnings
if [ $? -eq 0 ]; then
rm -f $SUCCESS_FLAG $DUMP_FILE
echo "同步成功!"
else
echo "导入失败,请检查目标库权限!下次执行将自动续传"
exit 1
fi
运行./sync_data.sh
,等待完成即可。