MySQL 主从同步集群在生成环境使用过程中, 如果主从服务器之间网络通信条件差或者数据库数据量非常大, 容易导致 MySQL 主从同步延迟.
MySQL 主从产生延迟之后, 一旦主库宕机, 会导致部分数据没有及时同步至丛库, 重新启动主库, 会导致丛库与主库同步错误, 如何快速恢复主从同步关系呢, 如下有两种方法:
1, 忽略错误后, 继续同步 (只有一次错误)
此种方法适用于主从库数据内容相差不大, 或者要求数据可以不完全统一的情况, 数据要求不严格的情况.
Master 端执行如下命令, 将数据库设置全局读锁, 不允许写入新数据:
flush tables with read lock;
Slave 端停止 Slave I/O 及 sql 线程, 同时将同步错误的 SQL 跳过 1 次, 跳过会导致数据不一致, 最后启动 start slave, 同步状态恢复, 命令如下:
- stop slave;
- set global sql_slave_skip_counter =1;
- start slave;
2, 重新做主从同步, 完全同步:(主从数据差别大)
此种方法适用于主从库数据内容相差很大, 或者要求数据完全统一的情况, 数据需完全保持一致.
1) 在 master 进行锁表
flush tables with read lock;
注意: 该处是锁定为只读状态, 语句不区分大小写
2) 进行数据备份
mysqldump -uroot -p -hlocalhost --all-databases> MySQL.sql (--all-databases 表示所有数据库)
这里注意一点: 数据库备份一定要定期进行, 可以用 shell 脚本或者 Python 脚本, 都比较方便, 确保数据万无一失
3) 查看 master 状态:
show master status;
4) 把 MySQL 备份文件传到从库机器, 进行数据恢复:
scp MySQL.sql root@10.6.97.134:/tmp/
5) 停止从库的状态, 导入数据备份
- MySQL> stop slave;
- MySQL> source /tmp/MySQL.sql;
6) 设置从库同步, 并开启 slave;
- change master to master_host = '10.6.97.133', master_user = 'tongbu',master_password='123456', master_log_file = 'mysql-bin.000003', master_log_pos= 34427537;
- start slave;
- show slave status\G;
7) 在 master 上解锁:
unlock tables;
来源: http://www.linuxidc.com/Linux/2018-11/155422.htm