服务器配置好的Mysql主从复制,已经稳定运行一个多月了,今日突然发现,同步报错卡在了昨天上午的日志记录处了
1.查询相关错误信息
mysql> select * from performance_schema.replication_applier_status_by_worker\G
Worker 1 failed executing transaction 'ANONYMOUS' at master log WIN-H7TETN00JMA-bin.000438, end_log_pos 1068165654; Could not execute Update_rows event on table ave_remoteservice.samples; Can't find record in 'samples', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log WIN-H7TETN00JMA-bin.000438, end_log_pos 1068165654
推测是之前同步过程遗漏的差异数据?
通过 mysqlbinlog 查询主从同步错误日志
mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS WIN-H7TETN00JMA-bin.000438 | grep -A '20' 1068165654
#230509 20:28:09 server id 1 end_log_pos 1068165654 CRC32 0x87637247 Update_rows: table id 477 flags: STMT_END_F
### UPDATE `ave_remoteservice`.`samples`
### WHERE
### @1=8990932 /* INT meta=0 nullable=0 is_null=0 */
### @2=897 /* INT meta=0 nullable=0 is_null=0 */
### @3='2023-02-24 00:00:00' /* DATETIME(0) meta=0 nullable=0 is_null=0 */
### @4=2 /* TINYINT meta=0 nullable=1 is_null=0 */
### @5=0 /* TINYINT meta=0 nullable=1 is_null=0 */
### @6='2023-02-25 11:49:22' /* DATETIME(0) meta=0 nullable=1 is_null=0 */
### @7=0 /* INT meta=0 nullable=1 is_null=0 */
### @8='系统管理员' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
### @9='20230224000055' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */
update时,从库没有这条记录,然后给从库补上了这条记录
重新开启从库同步
mysql> stop slave;
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
差异数据过多时,能排查处理则排查处理,不能的,考虑重新配置主从同步(数据库很大很耗时)
或者使用数据库同步工具同步
Ibbackup热备份工具,是付费的。xtrabackup是免费的,功能上一样。
Ibbackup备份期间不锁表,备份时开启一个事务(相当于做一个快照),然后会记录一个点,之后数据的更改保存在ibbackup_logfile文件里,恢复时把ibbackup_logfile 变化的数据再写入到ibdata里。
Ibbackup 只备份数据( ibdata、.ibd ),表结构.frm不备份。