无法启动:InnoDB:页面损坏...找不到表空间

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)

然后重新导入转储的数据。

我假设您在转储单个表和导入转储文件方面不需要帮助。


回复您的评论:

看起来你有更广泛的腐败。我建议采取以下步骤:

  1. 启动 MySQL 服务器 innodb_force_recovery=6
  2. 使用mysqldump转储的所有数据。
  3. 关闭 MySQL 服务器。
  4. 备份 datadir 的内容,以防万一您想获得专业帮助,看看他们是否可以恢复更多数据。试试https://twindb.com,他们是 MySQL 数据库恢复的最佳专家。
  5. 初始化一个新的数据目录(我会使用一个新的磁盘设备,并停止使用旧的,因为它现在有未知的损坏)。
  6. 恢复您创建的数据转储mysqldump