mysql主从同步某个表不一致,单表恢复

【1】现有情况

主从同步搭建好了,show slave status 一直报错 说某个表的某行记录找不到!

有很多情况

(1)主库有,从库没有,这次我遇到的就是这个问题

  由于 myisam 备份时没有加 lock-tables(只管MYISAM),导致不一致问题出现;

  就是dump按道理是一个整体时间点;但由于 MYISAM 即没有事务,也没有快照,所以只有轮到它的时候才是实际取数据的时候;

  这就意味着 假设10点做的 Mysqldump,记录的 binlog 位置与 gtid 执行位置是 10点钟的,但某些表(MYISAM)真正 dump 时是 11点钟的;

    (这个看mysqldump原理就好,因为 myisam表不支持快照事务,所以select * from myisam相关的表时,查的并不是快照,而是当前读,假设这个表是在时间点 11点才被 select )

  这就造成了10点的binlog,有些表(MYISAM)数据是11点,那么10点-11点的 binlog重做时,这些表这个时候有什么删除 更新 插入等等 很容易造成 key不存在,或者重复唯一键;

 

(2)那种主从同步的好好的,有人手贱删掉了从库的数据、更新从库数据

  这些可能是几天之前的,你如果用Binlog2sql 等工具,可能需要大量重做、折腾;

  甚至有可能更久远的 Binlog,只是没报错出来;突然报错出来了,但你发现binlog 可能已经被清理掉了;

解决办法见【2】

【2】实际操作

假设是这个表,users_propstime 

【2.1】主库:备份 故障表

# 先停止从库 在从库操作
stop slave;

# 在主库操作:
mysqldump --lock-tables --master-data=2 --set-gtid-purged=off propdb users_propstime > users_propstime.sql

more users_propstime.sql ,找binlog 信息

  

 

 

【2.2】从库:忽略 故障表

change replication filter replication_ignore_table=(db.users_propstime)
change replication filter replication_wild_ignore_table=('db.users_propstime')

【2.3】从库:开启从库知道执行到 指定 master_file 与 master_Postion

start slave until MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=377534137;

start slave until SQL_BEFORE_GTIDS ='96359478-a845-11e6-a3d6-000c296e817a:44' for channel 'master_133070';

主从同步执行到这个点之后,IO线程会继续执行,但SQL线程会自动关闭

【2.4】从库:根据备份文件恢复 故障表

mysql propdb < users_propstime.sql

【2.5】从库:去掉忽略,开始真正的主从同步

stop slave;
change replication fliter replication_ignore_table=()
change replication fliter replication_wild_ignore_table=()
start slave;

至此,完成!

posted @ 2021-08-05 22:15  郭大侠1  阅读(599)  评论(2编辑  收藏  举报