MariaDB 崩溃:引擎中不存在表 && 无法恢复表

Posted

技术标签:

【中文标题】MariaDB 崩溃:引擎中不存在表 && 无法恢复表【英文标题】:MariaDB crash: Table doesn't exist in engine && can't recover tables 【发布时间】:2013-11-24 11:04:58 【问题描述】:

我在跑步:

MariaDB 10.0.5
Ubuntu 12.04 LTS
Both up to the latest patch level as per last Friday

我对上一期很感兴趣:

http://***.com/questions/19910996/mysql-connect-headers-and-client-library-minor-version-mismatch-library10000

这导致了大量损坏,因为我复制并删除了我的 ibdata1、ib_logfile0 和 ib_logfile1 以解决上述问题的症状。我想,当我下次启动 mariadb 服务时,这个问题就开始了。当我尝试选择一个受影响的表或运行 mysqldump 时,我得到以下信息:

mysqldump -u backupusr -p'somepass' --all-databases > dump.sql

mysqldump: Got error: 1932: "Table 'some_db.dw_commentmeta' doesn't exist in engine" when using LOCK TABLES

幸运的是(非常幸运)我的大型生产客户网站的数据仍然完好无损,并且该网站在线。尽管该数据库中也至少有一个损坏的表。现在恢复我所有其他网站的数据库。

我还有原始的 ibdata1、ib_logfile0 和 ib_logfile1 文件。当我将这些文件移回 /var/lib/mysql/ 时,mariaDB 服务无法启动。

我尝试过的其中一件事是按照以下方式强制 InnoDB 恢复:

http://dev.mysql.com/doc/refman/5.0/en/forcing-innodb-recovery.html

但这没有任何效果。之后我尝试强制使用 Mysql 升级工具,看看它是否可以修复表:

mysql_upgrade --password --force
FATAL ERROR: Upgrade failed

所以这并不能告诉我任何事情。接下来我使用了 REPAIR TABLE & ALTER TABLE ENGINE 命令:

http://dev.mysql.com/doc/refman/5.0/en/rebuilding-tables.html

修改引擎:

MariaDB [sictnl_db]> ALTER TABLE si_users ENGINE = MyISAM;
ERROR 1932 (42S02): Table 'sictnl_db.si_users' doesn't exist in engine

修复表:

MariaDB [sictnl_db]> REPAIR TABLE si_users;
+--------------------+--------+----------+----------------------------------------------------+
| Table              | Op     | Msg_type | Msg_text                                           |
+--------------------+--------+----------+----------------------------------------------------+
| sictnl_db.si_users | repair | Error    | Table 'sictnl_db.si_users' doesn't exist in engine |
| sictnl_db.si_users | repair | status   | Operation failed                                   |
+--------------------+--------+----------+----------------------------------------------------+
2 rows in set (0.00 sec)

所以这一切都归结为将表信息返回到引擎的表中。 https://mariadb.com/kb/en/mariadb-storage-engines/ 的文档指出,我默认使用两个存储引擎:

Aria
MyISAM

在未损坏的表之一上执行 SHOW CREATE TABLE 函数时,我得到以下信息:

ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 |

MyISAM 就是这样,谷歌搜索“mysql repair myisam”将我带到以下站点:

Note: Would Aria have protected me against this issue?

http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html

这产生了 myisamchk 命令,它需要指向表的本地存储,如下所示:

myisamchk /var/lib/mysql/sictnl_db/*


myisamchk: error: '/var/lib/mysql/sictnl_db/db.opt' is not a MyISAM-table
---------
myisamchk: error: '/var/lib/mysql/sictnl_db/si_commentmeta.frm' is not a MyISAM-table
---------
myisamchk: error: '/var/lib/mysql/sictnl_db/si_commentmeta.ibd' is not a MyISAM-table

所以该工具似乎缺少 .MYI 文件,但这些文件在 shell 中不存在。

我现在发布这个是为了看看你是否有任何有用的评论,同时我会继续我的分析,如果我有任何进一步的信息,我会更新帖子。

提前致谢!

【问题讨论】:

【参考方案1】:

最后我无法恢复上述服务器。我尝试一次禁用一个站点以防止对损坏的表进行数据库访问。最后一个数据库包含了问题,并且通过禁用站点 mariadb 不再崩溃。

为了确保我提取了数据库数据并在新服务器上重新开始。那是大约 5 个小时的工作,但在那之后我再次对自己的设置充满信心。

我已经开始恢复损坏数据的旧备份,我还从 MariaDB 切换回 Mysql,因为我怀疑 MariaDB 是罪魁祸首。

所以备份在这里拯救了我的一天......

【讨论】:

以上是关于MariaDB 崩溃:引擎中不存在表 && 无法恢复表的主要内容,如果未能解决你的问题,请参考以下文章

phpMyAdmin 错误:引擎中不存在表

phpMyAdmin 错误:引擎中不存在表

如何修复 #1932 - 引擎中不存在表

#1932 - 表 'xxx.xxxx' 在引擎中不存在,更改 php mysql xampp 版本

MAC 上 XAMPP 中 PhpMyAdmin 的引擎中不存在表 'phpmyadmin.pma__column_info'

(XAMPP) Linux :MySQL 说:文档 #1932 - 表 'phpmyadmin.pma__column_info' 在引擎中不存在