[root@localhost mysqlbinlog-test]# mysqlbinlog -vv mysql-binlog.000002
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#241111 15:55:17 server id 1  end_log_pos 123 CRC32 0x11f8b607  Start: binlog v 4, server v 5.7.44-log created 241111 15:55:17 at startup
ROLLBACK/*!*/;
BINLOG '
ZbgxZw8BAAAAdwAAAHsAAAAAAAQANS43LjQ0LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABluDFnEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AQe2+BE=
'/*!*/;
ERROR: Error in Log_event::read_log_event(): 'Found invalid event in binary log', data_len: 31, event_type: 35
ERROR: Could not read entry at offset 123: Error in log format or read error.
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

上述这个错误表明 MySQL 二进制日志文件已损坏。错误信息显示在偏移量 123 处发现了无效的事件(event_type: 35),导致 mysqlbinlog 无法正确解析。

问题分析

错误的关键信息:

  • Found invalid event in binary log:二进制日志中存在无效事件
  • data_len: 31, event_type: 35:事件数据长度31,事件类型35
  • Could not read entry at offset 123:在偏移量123处读取失败

解决方案

1. 尝试使用不同的恢复方法

# 尝试跳过错误继续读取
mysqlbinlog --force-if-open mysql-binlog.000002

# 或者指定从某个位置开始读取(跳过损坏部分)
mysqlbinlog --start-position=200 mysql-binlog.000002

# 尝试忽略错误
mysqlbinlog --no-defaults mysql-binlog.000002

2. 使用专业的二进制日志分析工具

# 安装并使用 mysqlbinlogrollback 工具
yum install percona-toolkit
# 或
apt-get install percona-toolkit

# 尝试修复和分析
pt-table-checksum

3. 从备份恢复

如果二进制日志损坏严重,建议:

  1. 使用最近的完整备份恢复数据库
  2. 应用备份后生成的完整二进制日志

4. 检查磁盘和文件系统

# 检查磁盘错误
fsck /dev/your_mysql_disk_device

# 检查文件完整性
md5sum mysql-binlog.000002
cmp mysql-binlog.000002 mysql-binlog.000003

5. 预防措施

-- 定期刷新和清理二进制日志
FLUSH BINARY LOGS;
PURGE BINARY LOGS BEFORE '2024-11-11 00:00:00';

-- 设置合理的二进制日志过期时间
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7天

-- 监控二进制日志状态
SHOW BINARY LOGS;
SHOW MASTER STATUS;

如果数据非常重要

如果损坏的二进制日志中包含关键数据,可以考虑:

  1. 联系专业的数据恢复服务
  2. 使用十六进制编辑器手动分析(仅建议专家操作)
  3. 检查是否有其他副本或备份中的二进制日志

建议操作顺序

  1. 首先尝试 --force-if-open 参数
  2. 如果失败,检查磁盘健康状态
  3. 从备份恢复并应用完好的二进制日志
  4. 加强监控和备份策略

最安全的做法是直接使用备份恢复,因为损坏的二进制日志可能包含不完整或错误的数据。