如何防止“ibdata 文件与日志序列号不匹配”?

ck_*_*ck_ 5 mysql innodb percona ibdata

我正在处理一组非常大的数据库,这些数据库都是 innodb。

为了我的舒适,我在 mysql restart 上多次提到这个:

ibdata files do not match the log sequence number

但是,当该消息发生时,我已经清楚地看到 mysql 在重新启动之前正确关闭。

然后它“修复”到原始序列号,没有丢失任何东西。

永久处理和修复此问题的最佳方法是什么?

使用 Percona innodb_file_per_table=1

示例日志:

InnoDB: Initializing buffer pool, size = 80.0G
InnoDB: Completed initialization of buffer pool
InnoDB: Highest supported file format is Barracuda.
InnoDB: The log sequence numbers 475575972691 and 475575972691 in ibdata files do not match the log sequence number 925369860131 in the ib_logfiles!
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages 
InnoDB: from the doublewrite buffer...
InnoDB: 128 rollback segment(s) are active.
InnoDB: Waiting for purge to start
InnoDB: Percona XtraDB started; log sequence number 925369860131
Run Code Online (Sandbox Code Playgroud)

请注意,最终的日志序列号现在如何与最初认为错误的内容相匹配,从而实现了 100% 的恢复?

那么为什么日志序列没有正确写入ibd呢?

是否有可能以某种方式关闭不完整?

谢谢你的任何建议。

附:我总是想知道我应该在 serverfault 上还是在这里问这个?我在这里问可以吗?

小智 0

我也遇到过同样的问题:MySQL重启次数过多,ibdata文件与日志序列号不匹配。

发生这种情况是因为其中一张表已损坏。为了解决此问题,请备份数据库并执行 mysqlcheck 操作:

1.

mysqldump -u root -p dbname > /tmp/dbname.sql  
Run Code Online (Sandbox Code Playgroud)

2.

mysqlcheck -u root -p dbname 
Run Code Online (Sandbox Code Playgroud)

如果您发现损坏的表,则可以将其删除,我知道损坏的表无法删除,但我们可以从相应的生产数据库恢复数据库。