mysql主从同步某个表不一致,单表恢复
2023-09-11 14:21:08 时间
【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 fliter replication_ignore_table=(db.users_propstime ) change replication fliter 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;
主从同步执行到这个点之后,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;
至此,完成!
相关文章
- 【MySQL高级】MySql中常用工具及Mysql 日志
- MySQL组合两个表的三种方式
- MySQL 解压包 安装
- mysql远程连接 Host * is not allowed to connect to this MySQL server
- mysql 配置,还得多看看~
- 【MySQL进阶-04】深入理解mysql事务本质(超级详解)
- mysql 索引
- mysql 同步机制概念
- Mysql命令mysql:连接Mysql数据库
- mysql远程连接 Host is not allowed to connect to this MySQL server
- CentOS 安装MySQL 8.0.22
- MySQL存储过程详解 mysql 存储过程
- mysql—MySQL数据库中10位或13位时间戳和标准时间相互转换
- Mysql主从同步(1)-主从/主主环境部署梳理
- mysql数据库中不能插入0000-00-00 00:00:00日期数据(报错Invalid datetime format: 1292 Incorrect datetime value: '0000-00-00 00:00:00')
- Mysql_mysql多个TimeStamp设置
- 【转】MySQL Utilities,mysql工具包
- mysql 查询数据库中所有表名称
- MySQL计划任务(事件调度器)(Event Scheduler) 创建时 会执行一次
- Mysql与Redis的同步实践
- MySQL数据分组Group By 和 Having
- Eclipse中使用MySql遇到:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading o
- MySQL 教程(基础篇)第04话:mysqld 和 mysql 命令的区别