找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1426

积分

0

好友

208

主题
发表于 前天 18:25 | 查看: 4| 回复: 0

当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、处理流程图

image-20251218145345251

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、检查从库同步状态 (两台从库均执行)

最后,验证同步是否正常运行,并快速核对数据一致性,这是系统管理中故障恢复后的必要检查步骤。

  1. 执行 SHOW SLAVE STATUS\G 后,必须满足以下条件:
    1. Slave_IO_Running: Yes(IO 线程正常,能读取主库 binlog);
    2. Slave_SQL_Running: Yes(SQL 线程正常,能执行中继日志);
    3. Seconds_Behind_Master: 0(同步延迟为 0);
    4. Last_Error: 空(无同步错误)。
      mysql --login-path=default-root -e " SHOW SLAVE STATUS\G "
  2. 在主库和从库分别执行,抽查几个关键业务库/表的行数是否一致,作为快速完整性检查。
    
    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;



上一篇:FEVM FA-EX9 迷你主机评测:AMD Strix Halo 架构与128GB内存驱动AI大模型本地化
下一篇:OceanBase物化视图实战指南:原理、创建与电商宽表性能优化
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 22:55 , Processed in 0.199315 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表