1、MySQL主库发生内存溢出,并自动重启,通过如下日志可以看出: [chenzx@MySQL02 ~]$tail /var/log/messages Aug 28 20:23:33 MySQL02 kernel: Out of memory: Kill process 26033 (mysqld) score 751 or sacrifice child
2、由于管理员在外面吃饭,21:20才登陆到数据库服务器定位原因,意识到内存溢出,就在线调整了主库innodb_buffer_pool的大小,从100G缩小为90G: mysql>set global innodb_buffer_pool_size=90G;
3、过了几分钟,管理员就收到nagios告警,说两个slave库停止复制了,登陆两个slave库一看,均报错如下: slave1: mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.19.20.111 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binglog.001503 Read_Master_Log_Pos: 834920825 Relay_Log_File: relaylog.000283 Relay_Log_Pos: 321413 Relay_Master_Log_File: binglog.001501 Slave_IO_Running: Yes Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1032 Last_Error: Could not execute Delete_rows event on table condb.rundetails; Can't find record in 'rundetails', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log binglog.001501, end_log_pos 321522 Skip_Counter: 0 Exec_Master_Log_Pos: 321204 Relay_Log_Space: 9694583059 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 1032 Last_SQL_Error: Could not execute Delete_rows event on table condb.rundetails; Can't find record in 'rundetails', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log binglog.001501, end_log_pos 321522 Replicate_Ignore_Server_Ids: Master_Server_Id: 111 Master_UUID: a8beebcf-cb3f-11e7-858b-005056b85344 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: 180829 08:41:14 Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
slave2: mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.19.20.111 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binglog.001503 Read_Master_Log_Pos: 739719811 Relay_Log_File: relaylog.004380 Relay_Log_Pos: 321413 Relay_Master_Log_File: binglog.001501 Slave_IO_Running: Yes Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1032 Last_Error: Could not execute Delete_rows event on table condb.rundetails; Can't find record in 'rundetails', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log binglog.001501, end_log_pos 321522 Skip_Counter: 0 Exec_Master_Log_Pos: 321204 Relay_Log_Space: 9599382409 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 1032 Last_SQL_Error: Could not execute Delete_rows event on table condb.rundetails; Can't find record in 'rundetails', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log binglog.001501, end_log_pos 321522 Replicate_Ignore_Server_Ids: Master_Server_Id: 111 Master_UUID: a8beebcf-cb3f-11e7-858b-005056b85344 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: 180828 20:28:04 Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
4、我的MySQL版本是5.7.22的,请问是什么原因导致的我两个备库数据和主库不一致的。谢谢大家。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的信息,MySQL主库因为内存溢出自动重启,并且在之后调整了innodb_buffer_pool_size
的大小。接着,两个从库(Slave)停止了复制,报错显示为“Could not execute Delete_rows event...; Can't find record in 'rundetails'...”,这表明在执行删除操作时,从库在表condb.rundetails
中找不到相应的记录,导致SQL线程无法继续运行。
这个问题可能由以下几个原因引起:
数据不一致:在主库发生内存溢出并重启之前,可能有事务已经提交到二进制日志(binlog),但这些事务对数据的修改由于内存溢出没有完全写入到磁盘或者回滚,导致主库和从库间的数据不一致。当从库尝试应用这部分不完整或已丢失的事务时,就会出现找不到对应记录的错误。
主库重启与缓冲池缩小的影响:MySQL重启后,InnoDB缓冲池中的数据会清空,而随后你又手动减小了innodb_buffer_pool_size
。虽然这个操作本身不会直接导致数据不一致,但如果在减小缓冲池大小前,缓冲池中包含了那些未持久化到磁盘的变更数据,则重启和缓冲池尺寸调整可能会间接暴露之前存在的数据一致性问题。
事务隔离级别和并发操作:如果在主库上存在并发事务,并且使用了特定的事务隔离级别(如READ COMMITTED或REPEATABLE READ),某些情况下可能会影响数据的一致性视图,尤其是在主库异常重启的情况下。
解决此问题的步骤建议如下:
检查主库数据完整性:首先确认主库上的数据是否完整无误,可以考虑使用checksum等方法来验证数据一致性。
跳过错误:如果确定数据不一致是暂时且可接受的,可以在从库上使用SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
命令跳过当前错误,然后START SLAVE;
恢复复制。但这仅是临时解决方案,潜在的数据不一致问题仍然需要被彻底解决。
修复数据:对于缺失的数据记录,如果能够确定丢失的具体内容,可以在从库上手动插入或修复,确保数据与主库一致后再启动复制。
预防措施:增强监控,确保及时发现和处理内存溢出等问题;考虑使用更稳健的硬件配置和优化数据库参数设置,比如合理设置innodb_buffer_pool_size
以避免内存溢出;定期进行数据备份和一致性检查。
升级MySQL版本:虽然您的问题是基于MySQL 5.7.22,但考虑到安全性和稳定性,评估升级到更高版本的MySQL(如8.x系列),新版本可能包含更多防止此类问题的机制和改进。
最后,针对这类涉及数据一致性的复杂问题,建议在采取任何重大操作前,先在测试环境中复现并验证解决方案,以减少生产环境的风险。您也可以通过ECS一键诊断全面排查并修复ECS问题。
你好,我是AI助理
可以解答问题、推荐解决方案等