当MySQL 5.7的主从架构发生故障,导致从节点数据与主库不一致时,若数据量不大,可通过以下完整的重建流程进行恢复。本方案旨在通过备份恢复与重新同步,确保集群数据最终一致。
环境信息:
| 角色 |
IP |
端口 |
同步用户 |
密码 |
| 主(MASTER) |
192.168.10.1 |
3306 |
repl |
repl@123! |
| 从(SLAVE ) |
192.168.10.2 |
3306 |
|
|
| 从(SLAVE ) |
192.168.10.3 |
3306 |
|
|
1、处理流程图

2、主库数据备份 (192.168.10.1)
首先在主库上执行全量备份,这将作为从库重建的数据源。
# 查询当前数据量
mysql --login-path=default-root -e "select table_schema as '数据库', sum(table_rows) as '记录数', sum(truncate(data_length/1024/1024/1024, 2)) as '数据容量(GB)', sum(truncate(index_length/1024/1024/1024, 2)) as '索引容量(GB)' from information_schema.tables group by table_schema order by sum(data_length) desc, sum(index_length) desc;"
# 备份 mysql
mkdir -p /data/dbbak_$(date +%F)/mysql
ALL_DBS=$(mysql --login-path=default-root -e "show databases;"|grep -Ewv "Database|information_schema|performance_schema|mysql|sys|bksuite_common|*_bkt|test")
for i in ${ALL_DBS[@]}; do
mysqldump --login-path=default-root --skip-opt --create-options --default-character-set=utf8mb4 -R -E -q -e --single-transaction --no-autocommit --master-data=2 --max-allowed-packet=1G --hex-blob --databases $i > /data/dbbak_$(date +%F)/mysql/$i.sql
done
3、从库关闭主从同步 (192.168.10.2、192.168.10.3)
在从库上彻底停止并重置同步链路,为重建做准备,这是典型的MySQL主从配置管理操作。
# 停止IO/SQL线程,清空原有同步配置(关键,避免残留)
# 验证:Slave_IO_Running/Slave_SQL_Running均为No
mysql --login-path=default-root -e " STOP SLAVE; RESET SLAVE ALL; show slave status\G;"
4、从库备份并清除数据 (192.168.10.2、192.168.10.3)
为保险起见,先备份从库现有数据,然后清除所有业务数据。
# 备份数据
mkdir -p /data/dbbakold_$(date +%F)/mysql
ALL_DBS=$(mysql --login-path=default-root -e "show databases;"|grep -Ewv "Database|information_schema|performance_schema|mysql|sys|bksuite_common|*_bkt|test")
for i in ${ALL_DBS[@]}; do
mysqldump --login-path=default-root --skip-opt --create-options --default-character-set=utf8mb4 -R -E -q -e --single-transaction --no-autocommit --master-data=2 --max-allowed-packet=1G --hex-blob --databases $i > /data/dbbakold_$(date +%F)/mysql/$i.sql
done
# 删除数据
ALL_DBS=$(mysql --login-path=default-root -e "show databases;" | egrep -v "Database|information_schema|performance_schema|mysql|sys|bksuite_common")
echo ${ALL_DBS[@]}
for i in ${ALL_DBS[@]};do
mysql --login-path=default-root -e "drop database $i"
done
5、从库导入数据 (192.168.10.2、192.168.10.3)
将主库的备份文件传输到从库并导入,这涉及到Linux系统下的文件传输与数据恢复操作。
# 从主节点复制sql文件到从节点服务器(192.168.10.1)
rsync -a /data/dbbak_$(date +%F)/mysql root@192.168.10.2:/data/dbbak_$(date +%F)/
# 导入 mysql
for i in /data/dbbak_$(date +%F)/mysql/*.sql;do
mysql --login-path=default-root < "$i"
done
6、提取主库 binlog 位点 (192.168.10.2、192.168.10.3)
从主库的备份文件中获取备份时刻的二进制日志位置,用于后续配置同步起点。
cd /data/dbbak_$(date +%F)/mysql
# cat auth.sql | grep -i "master_log_file\|master_log_pos"
grep -i "CHANGE MASTER TO" *.sql | head -n 1
# 输出示例如下:binlog.000003、46089320
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=46089320;
7、创建同步专用用户 (192.168.10.1,若已存在可跳过)
在主库上确保用于复制的账户存在且权限正确。
# 主库创建复制用户(确保从库可连接),不使用‘%’,限制在集群所在网段,例如 192.168.10.%;
mysql --login-path=default-root -e " CREATE USER IF NOT EXISTS 'repl'@'192.168.10.%' IDENTIFIED BY 'repl@123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.%'; FLUSH PRIVILEGES;"
8、从库配置同步并启动 (192.168.10.2、192.168.10.3)
使用获取到的位点信息,在从库上重新配置指向主库的同步链路并启动。
# 登录从库,配置主从同步(替换主库IP、复制密码)
mysql --login-path=default-root -e " CHANGE MASTER TO
MASTER_HOST='主库IP/主机名',
MASTER_USER='repl',
MASTER_PASSWORD='repl@123!',
MASTER_LOG_FILE='binlog.000003',
MASTER_LOG_POS=46089320,
MASTER_CONNECT_RETRY=10;
START SLAVE;
SHOW SLAVE STATUS\G;"
9、检查从库同步状态 (两台从库均执行)
最后,验证同步是否正常运行,并快速核对数据一致性,这是系统管理中故障恢复后的必要检查步骤。
- 执行
SHOW SLAVE STATUS\G 后,必须满足以下条件:
Slave_IO_Running: Yes(IO 线程正常,能读取主库 binlog);
Slave_SQL_Running: Yes(SQL 线程正常,能执行中继日志);
Seconds_Behind_Master: 0(同步延迟为 0);
Last_Error: 空(无同步错误)。
mysql --login-path=default-root -e " SHOW SLAVE STATUS\G "
- 在主库和从库分别执行,抽查几个关键业务库/表的行数是否一致,作为快速完整性检查。
SELECT table_schema, table_name, table_rows
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql','sys','bksuite_common','test')
ORDER BY table_schema, table_name;