Fel*_*nso 7 mysql innodb crash mysql-5.7
服务器崩溃(Ubuntu 16.04)后,当我尝试使用innodb_force_recovery=0它启动 Mysql(Mysql 5.7)时,它不会启动并且 error.log 显示:
InnoDB: Checksum mismatch in datafile: ./panel_financiero_v2/kpis_analytics.ibd, Space ID:93, Flags: 33. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html for how to resolve the issue.
InnoDB: Corrupted page [page id: space=93, page number=0] of datafile './panel_financiero_v2/kpis_analytics.ibd' could not be found in the doublewrite buffer.
InnoDB: Tablespace 93 was not found at ./panel_financiero_v2/kpis_analytics.ibd.
InnoDB: Set innodb_force_recovery=1 to ignore this and to permanently lose all changes to the tablespace.
InnoDB: Cannot continue operation.
Run Code Online (Sandbox Code Playgroud)
我只能使用启动 Mysql innodb_force_recovery=6(我无法使用 innodb_force_recovery=1 启动 Mysql,因为错误消息建议)。问题表的.ibd和.frm文件在正确的目录下(没有空文件);我什至尝试(以防万一,没有真正的希望)删除这两个文件(将它们移动到另一个目录),但它也不起作用。
有什么方法可以修复或恢复表(请记住,innodb_force_recovery=6 以只读模式启动 Mysql,我什至无法创建新表)?无论如何,至少可以正常启动mysql(使用innodb_force_recovery=0)甚至丢失那个有问题的表的信息?
Bil*_*win 10
https://dev.mysql.com/doc/refman/5.7/en/repair-table.html说:
REPAIR TABLE 适用于 MyISAM、ARCHIVE 和 CSV 表。
换句话说,REPAIR TABLE 对 InnoDB 没有任何作用。InnoDB 有它自己的自动崩溃恢复,它在启动时运行。
但是 InnoDB 崩溃恢复仅适用于崩溃时正在进行的丢失更改。它使用重做日志和双写缓冲区来重建丢失的脏页。此过程无法重建静态损坏的数据。
错误消息实际上告诉您该怎么做:
InnoDB:设置 innodb_force_recovery=1 以忽略这一点并永久丢失对表空间的所有更改。
在https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html阅读更多详细信息:
1 (SRV_FORCE_IGNORE_CORRUPT) 允许服务器运行,即使它检测到损坏的页面。试图让 SELECT * FROM tbl_name 跳过损坏的索引记录和页面,这有助于转储表。
innodb_force_recovery=1将表空间文件移回它们所属的位置后启动服务器。
然后你可以使用 转储表mysqldump,它应该读取它可以读取的页面,跳过损坏的页面。然后您可以创建一个新表以从转储中导入:
CREATE TABLE mytable_new LIKE mytable;
RENAME TABLE mytable TO mytable_bad, mytable_new TO mytable;
Run Code Online (Sandbox Code Playgroud)
然后重新导入转储的数据。
我假设您在转储单个表和导入转储文件方面不需要帮助。
回复您的评论:
看起来你有更广泛的腐败。我建议采取以下步骤:
innodb_force_recovery=6 mysqldump转储的所有数据。mysqldump。