我有一个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
未明确指定。
我现在可以做些什么?非常感谢!
答案 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
。