mysql主从重新同步教程
一.从库MySQL运行停止同步:
STOP SLAVE;
二.新建脚本mysql_backup_with_gtid.sh
宝塔计划
运行
/bin/bash mysql_backup_with_gtid.sh
mysql_backup_with_gtid.sh:
#!/bin/bash
# ================== 配置区 ==================
DB_USER="root" # 数据库用户名
DB_PASS="密码" # 数据库密码
DB_NAME="www_xxx_net" # 要备份的数据库名
BACKUP_DIR="/www/backup/mysql" # 备份文件存放目录
# ========================================
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
DATE=$(date +%Y%m%d_%H%M%S)
SQL_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql"
ZIP_FILE="$SQL_FILE.zip"
echo "开始备份数据库: $DB_NAME"
# 执行备份
mysqldump -u$DB_USER -p$DB_PASS \
--single-transaction \
--set-gtid-purged=ON \
--routines \
--triggers \
--events \
$DB_NAME > $SQL_FILE
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功: $SQL_FILE"
# 压缩 SQL 文件为 .zip
echo "正在压缩: $ZIP_FILE"
zip -j $ZIP_FILE $SQL_FILE
if [ $? -eq 0 ]; then
echo "压缩成功: $ZIP_FILE"
# 删除原始 .sql 文件(可选,如需保留可注释下一行)
rm -f $SQL_FILE
echo "已删除原始 SQL 文件: $SQL_FILE"
else
echo "压缩失败,保留原始 SQL 文件"
exit 1
fi
else
echo "备份失败, 请检查错误信息"
exit 1
fi
# 可选: 自动删除 7 天前的备份文件(同时匹配 .sql 和 .sql.zip)
find $BACKUP_DIR -name "${DB_NAME}_*.sql*" -type f -mtime +7 -exec rm {} \;
三.传送文件到从库的目录/www/backup/database/:
scp /www/backup/mysql/www_xxx_net_20260522_065306.sql.zip root@从库IP:/www/backup/database/
四.导入数据
1.从库准备:清空旧数据,重置复制状态
-- 先停掉复制
STOP SLAVE;
RESET SLAVE ALL;
-- 删除旧数据库(确保干净导入)
DROP DATABASE IF EXISTS www_xxx_net;
-- 彻底清空本地的 GTID 执行记录
RESET MASTER;
2. 重新创建库并导入(这次一定成功)
{
echo "SET SESSION SQL_LOG_BIN=0;"
echo "CREATE DATABASE IF NOT EXISTS www_xxx_net;"
echo "USE www_xxx_net;"
cat /www/backup/database/www_xxx_net_20260522_065306.sql
} | mysql -uroot -ph数据库密码
3. 重建主从关系,启动复制
CHANGE MASTER TO MASTER_HOST = '主库IP', MASTER_USER = '从库用户.xxx_slave', MASTER_PASSWORD = '密码', MASTER_PORT = 3306, MASTER_AUTO_POSITION = 1; START SLAVE; SHOW SLAVE STATUS\G
4.如果链接失败:
主库查询:
SELECT user, host FROM mysql.user WHERE user = '从库用户.xxx_slave';
主库修改密码
ALTER USER '从库用户.xxx_slave'@'从库IP' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;
修改完毕 从库停止
STOP SLAVE;
重启主从:
START SLAVE;
检查状态
SHOW SLAVE STATUS\G