最近,使用mysql主从的时候,发现主库修改的数据没有同步到从库。
立马开发排查。
- 首先连接从库
show slave status\G;
查看从库的信息。
从上面箭头的两处,我们可以看到是 x_daily_shares 表出了问题,以及是 mysql-bin.000009 文件对应的 end_log_pos 。
- 连接主库所在的服务器(不是连接数据库)
首先我们要知道mysql binlog的日志位置,所以我们先需要知道mysql配置文件的位置
which mysql
/usr/local/mysql/bin/mysql
/usr/local/mysql/bin/mysql --verbose --help | grep -A 1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
cat /etc/my.cnf
innodb_data_home_dir = /usr/local/mysql/data
- 主库查询对应的binlog记录
cd /usr/local/mysql/data
mysqlbinlog -v --stop-position=241735305 mysql-bin.000009 > /tmpbinlog.log;
- 查询记录
end_log_pos=241735305 所在位置,找到对应出错的语句
cat /tmpbinlog.log | awk '/end_log_pos 241735305/ {print NR}'
cat /tmpbinlog.log | awk 'NR==15798800,NR==15798850'
这里的第一个字段 @1是 主键,拿该条件来查询即可
select * from x_daily_shares;
Empty set (0.00 sec)
- 数据修复
如果是数据是特别简单的,可以直接写 insert 语句在从库插入,当然,从库一般都是只读的。
set global read_only=0;
如果较为复杂,则在主库创建临时表并 dump ,在从库执行 dump 文件中的 insert 语句。
mysqldump -h127.0.0.1 -uroot -p -t infzm x_daily_shares
参数如下:
dump 完,直接找到相关的 sql 语句在从库执行即可
INSERT INTO `infzm_x`.`x_daily_shares` (`id`, `content_id`, `date`) VALUES (208810, 147176, '2021-12-27 00:00:00');
- 恢复同步
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
start slave;
show slave status\G;
如果没有其他问题,同步成功。
|