MYSQL 主从同步延迟 Got fatal error 1236

本文详细介绍了MySQL主从同步过程中遇到的常见错误,包括因磁盘空间满导致的日志截断问题,以及如何使用mysqlbinlog工具解析并定位错误。此外,还提供了不停机还原备库的具体步骤,包括备份、恢复和重新搭建从库的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【原因】

由于存储日志的磁盘空间满而导致MYSQL没有将日志完全写入磁盘,binglog event 被截断。slave读取该binlog file时就报以上图片错误

【解决】

利用mysqlbinlog工具还原数据

/usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -vv master-bin.000259 --stop-position=719197584 |tail -20

或者 /usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -vv master-bin.000259 |grep -A 20 '719197584'  

或者 /usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows -vv master-bin.000259 > 259.log

解析binlog日志文件,找到离719197584前后的最近位置的position号719197500

然后登录从库,重新指定主从同步位置

stop slave;

change master to master_log_file='master-bin.000259',master_log_pos=719197500;

start slave;

发现开启还是报错,继续查看master-bin.000256的日志头内容,看下日志开头有没说明是继续上一个binlog的最后一个事务

重新指定日志看是否生效

change master to master_host='',master_port=3306,naster_user='repl_user',master_password='',master_log_file='master-bin.000260',master_log_pos=0;

开启发现报另外一个错误1032,这里使用跳过错误event

先跳过一条错误event,让主从同步恢复正常

stop slave;

set global sql_slave_skip_counter=1;

start slave;

这里环境还是依旧无法跳过,手工跳过几次之后,还是报错。如果你相要你的环境先开启,可以使用修改参数slave_exec_mode

set global slave_exec_mode=IDEMPOTENT;

如果从库状态正常了,跟上了主库的变更,重新设置为原值set global slave_exec_mode=STRICT;

但是现在两边数据是不一致的,接下来就是修复数据了。可以使用pt工具进行修复检查两边哪些表数据不一致;或者重建从库。

因为我数据相差太大了,这里不使用pt工具修复。采用了重新搭建从库方式。

 

不停机还原备库:

1. 重新备份主库

innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=root --password=xxx --port=3306 --backup --stream=tar /data/mysql | gzip -> /nta/alldbfullbackup.tar.gz

# 如果添加--slave-info参数,在备份集中还会包含一个名为xtrabackup_slave_info的文件,这个文件中提供了change master to的语句
备份完成后将主库的备份文件,传输到备库上。

2. 恢复数据库

在备库服务器上,用传输过来的主库备份,恢复数据库。

2.1 停止备库的服务 

stop slave;

reset slave; 

service mysql stop

 2.2恢复数据库

删除备库data目录下的数据库文件

[root@slave /]# cd /data/mysql/
[root@slave mysql]# rm -rf *
解压备份文件,将解压后的文件拷贝到data目录下

[root@slave /]# cd /data/mysql/

[root@slave mysql]# tar -xvf /nta/alldbfullbackup.tar.gz /data/mysql/

注意修改恢复出来的数据文件的属主为mysql用户。

恢复数据库

innobackupex --apply-log /data/mysql/
# 看到completed OK表示正常完成
data目录下解压出来的备份文件中的xtrabackup_info,其中有备份时记录的binlog_pos信息。

得知创建复制环境所需要的日志文件名和日志位置:

- 日志文件名:master-bin.00297      - 日志位置:884129122

2.3 启动数据库

从库的数据文件已经恢复完成,启动从库的服务。
[root@slave data]# service mysql start
Starting MySQL (Percona Server)..... SUCCESS! 

mysql -uroot -pxxx

mysql > change master to master_host='',master_port=3306,naster_user='repl_user',master_password='',master_log_file='master-bin.000297',master_log_pos=884129122;

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

查看从库服务是否正常,如果设置有问题需要重新设置从库,则可以通过“reset slave”命令。

show slave status\G  (Slave_IO_Running和Slave_SQL_Running显示均为“Yes”)

从库同步主库状态正常,后续可测试验证。

 

<think>好的,我现在需要解决用户提到的MySQL主从复制中由于二进制日志被清除导致的致命错误1236问题。用户提到的是在GTID复制环境下出现的这个问题。首先,我应该回忆一下相关知识,并结合提供的引用内容来找出解决方案。 根据用户提供的引用,特别是引用[4]和[5],错误1236通常和主从日志同步问题有关。用户的问题具体是由于主库的二进制日志被清除,导致从库无法找到所需的日志文件,从而中断复制。这时候,从库的IO线程会报错,指出无法获取指定的日志文件或位置。 首先,我需要确认错误的具体表现。根据引用[4]中的日志,错误信息是“Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids”,不过用户现在的问题是关于binlog被清除,所以可能更相关的引用是引用[5]提到的“mysql gtid 1236错误”,其中提到当主库的binlog被清理后,从库无法继续同步,因为所需的GTID事务已经不存在于主库的日志中。 在GTID复制中,每个事务都有一个全局唯一的标识符(GTID),从库会记录已经执行过的GTID集合。如果主库的binlog被清除,而从库需要获取某个GTID对应的事务,但主库已经没有这个日志,就会导致错误1236。这时候,传统的解决办法可能需要重新同步数据,但用户可能希望在不重建整个从库的情况下解决。 根据引用[2],提到了一种快速但不安全的方法,比如跳过错误,但可能导致数据不一致。而引用[3]中的操作是针对组复制的,可能不适用于传统的主从复制。引用[1]中提到的设置server_id和跳过错误的方法可能相关,但需要具体分析。 解决这个问题的步骤可能包括: 1. 检查当前主从状态,确认错误确实是由于缺失的binlog导致。可以使用`SHOW SLAVE STATUS\G`查看具体的错误信息,确认Last_IO_Error是否指出无法找到binlog文件或位置。 2. 如果确认是binlog被清除,可以考虑重新配置从库,使其从主库当前的位置开始复制。但这需要从库和主库的数据一致,否则需要重新同步。 3. 在GTID模式下,可以尝试使用`CHANGE MASTER TO`命令,设置自动获取位置,或者手动指定需要开始复制的GTID集合,跳过已经不存在的事务。例如,设置从库的gtid_purged变量,使得从库忽略那些已经被清除的GTID事务。 4. 另一种方法是重建从库,使用主库的最新备份重新做一次全量同步,然后启动复制,这样从库会从最新的binlog位置开始同步,避免缺失日志的问题。 不过具体操作中需要注意,比如在设置gtid_purged时需要确保数据的一致性,否则可能导致数据错误。此外,使用备份恢复从库可能是比较安全但耗时的办法,而手动调整GTID位置可能更快但有风险。 参考引用[2]中提到,如果使用了GTID,可以尝试通过备份恢复从库,这可能是一个可靠的方法。另外,引用[5]可能提供了相关解决方案,比如调整主从的日志位置或者使用GTID跳过某些事务。 总结可能的解决步骤: - 检查主从状态,确认错误详情。 - 如果数据允许不一致,可以尝试重置从库的复制位置,使用主库当前的binlog位置重新开始同步,但这可能需要重新同步数据。 - 或者,手动设置从库的GTID执行位置,跳过缺失的事务,但这需要谨慎处理,可能导致数据不一致。 - 如果其他方法不可行,建议使用备份重建从库,并重新配置复制,确保主库保留足够的binlog以供从库同步。 在操作过程中需要注意的事项包括:确保server_id设置正确(引用[4]提到的server_id冲突问题)、正确设置GTID参数,以及处理可能的日志位置冲突。此外,使用`SET GLOBAL sql_slave_skip_counter`可能不适用于GTID模式,此时可能需要使用其他方法如设置gtid_next来跳过特定事务。</think>### 逐步解决方案:解决MySQL主从复制错误1236(Binlog被清除导致GTID同步失败) #### 1. **确认错误原因** 通过`SHOW SLAVE STATUS\G`查看`Last_IO_Error`字段,确认错误是否为: ```sql Fatal error: The slave I/O thread stops because log <...> was purged and is required for replication ``` 这表明从库请求的GTID对应的事务在主库的binlog中已被清除[^5]。 --- #### 2. **临时应急:跳过错误(不推荐)** **适用场景**:测试环境或允许数据不一致的临时修复。 ```sql STOP SLAVE; SET GTID_NEXT='<缺失的GTID>'; -- 例如:'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1' BEGIN; COMMIT; SET GTID_NEXT=AUTOMATIC; START SLAVE; ``` **注意**:此操作会导致数据不一致,需谨慎使用[^2]。 --- #### 3. **推荐方法:重建从库(数据一致性强)** **步骤**: 1. **主库备份**: ```bash mysqldump --all-databases --single-transaction --triggers --routines --master-data=2 -u root -p > master_dump.sql ``` 2. **从库恢复备份**: ```bash mysql -u root -p < master_dump.sql ``` 3. **重置GTID信息**(从库执行): ```sql RESET SLAVE ALL; RESET MASTER; -- 清除从库原有GTID记录 ``` 4. **重新配置复制链路**: ```sql CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='repl_user', MASTER_PASSWORD='密码', MASTER_AUTO_POSITION=1; -- 启用GTID自动定位 START SLAVE; ``` **原理**:通过全量备份恢复数据,并基于GTID自动同步[^2][^5]。 --- #### 4. **手动调整GTID集合(需严格操作)** **适用场景**:主从数据差异较小且明确缺失的GTID范围。 1. **从库执行**: ```sql STOP SLAVE; -- 查看已执行的GTID集合 SELECT @@GLOBAL.GTID_EXECUTED; ``` 2. **手动设置`gtid_purged`**: ```sql -- 假设主库缺失的GTID为 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-100' SET GLOBAL GTID_PURGED = '+aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-100'; ``` 3. **重新启动复制**: ```sql START SLAVE; ``` **注意**:需确保`gtid_purged`与主库的`gtid_executed`无冲突。 --- #### 5. **预防措施** - **延长主库binlog保留时间**: ```sql SET GLOBAL binlog_expire_logs_seconds = 1209600; -- 14天 ``` - **启用自动备份binlog**:通过工具定期备份binlog文件。 - **监控复制延迟**:避免从库长时间未同步导致binlog被清理。 --- ### 相关问题 1. **如何监控MySQL主从复制的健康状态?** 2. **GTID复制与传统基于binlog位置的复制有何优劣?** 3. **MySQL中如何安全清理不再需要的binlog文件?** [^1]: 快速修复可能需跳过错误,但需权衡数据一致性风险。 [^2]: 全量备份恢复是可靠但耗时的解决方案。 : 调整GTID集合需严格匹配主库状态,否则可能导致数据损坏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值