MySQL服务器崩溃,表空间边界外的InnoDB

时间:2016-07-07 12:50:54

标签: mysql windows innodb

我有一个C#应用程序在MySQL 5.7服务器上执行一些数据库操作。一旦完整的系统出现问题,我就不得不重新设置它。现在,当涉及到特定的表读/写操作时,数据库服务器崩溃了。 Windows日志显示

InnoDB: Trying to access page number 286720 in space 29, 
space name myInstance/myTable, which is outside the tablespace bounds.
Byte offset 0, len 16384, i/o type read. 

我尝试使用mysqlcheck --repair,但由于note : The storage engine for the table doesn't support repair而失败了。

我已经阅读了一些建议,说我应该以恢复模式启动MySQL,所以我添加了

[mysqld]
innodb_force_recovery=4

my.ini配置文件,我应该可以使用mysqldump导出受影响的数据库表。但不幸的是,我不是。

mysqldump: Error 2013: Lost connection to MySQL server 
during query when dumping table `myTable` at row: 1246

修改

我再次检查错误日志,发现有很多条目说

[ERROR] C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe: 
The table 'myTable' is full

我在带有NTFS格式化分区的Windows 32位操作系统上运行服务器。 myTable.ibd文件大小约为4.5 GB,检查C.10.3 Limits on Table Size表示Win32 w / NTFS的文件大小限制为“2TB(可能更大)”。 在检查我的错误原因时,我发现唯一可能的原因是一个完整的InnoDB表空间。解决方案可能是“更改InnoDB重做日志文件的数量或大小”,尽管连贯性对我来说有点模糊。尽管如此,我还是将重做日志文件的大小从48M增加到了100M。但没有改变。

如果我执行SQL select * from myTable order by Id desc,服务器会立即崩溃。错误日志条目与上面完全相同。

我也检查了章节15.7.1 Resizing the InnoDB System Tablespace,发现innodb_data_file_path未明确指定。

我现在可以做些什么?非常感谢!

2 个答案:

答案 0 :(得分:0)

InnoDB无法修复表空间中的损坏。这从未实施过,mysqlcheck无论如何都无法提供帮助。

损坏在空间id 29中,即表myInstance.myTable。要修复它,您需要使用innodb_force_recovery从此表中转储所有记录。尝试从4到6的所有值,直到MySQL没有崩溃。然后删除表并重新加载转储。

如果MySQL甚至与innodb_force_recovery=6崩溃,则从备份恢复该表。

如果您没有备份 - 请使用脚本http://bazaar.launchpad.net/~percona-dev/percona-data-recovery-tool-for-innodb/trunk/view/head:/fetch_data.sh。它将尽可能多地获取记录。

答案 1 :(得分:0)

一个可能的原因可能是ib_logfile*文件已损坏。

要解决此问题,请使用rm ib_logfile*删除这些文件。

这些文件在哪里? 这些文件位于mysql datadir中。 datadir的位置取决于操作系统。在osx中​​选中my.cnf中的/usr/local/etc