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

8

我正在运行:

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

我之前遇到了一个麻烦的问题:

https://dev59.com/yHnZa4cB1Zd3GeqPkwEH

由于我复制并删除了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修复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个回答

4
最终我无法恢复上述服务器。我尝试逐个禁用网站以防止对受损表的数据库访问。最后,一个数据库包含了问题,并通过禁用该站点,mariadb不再崩溃。
为确保安全,我提取了数据库数据并在新服务器上重新开始。这大约花费了5个小时的工作时间,但之后我对我的设置再次充满信心。
我已经开始恢复受损数据的旧备份,并将从MariaDB切换回Mysql,因为我怀疑MariaDB是罪魁祸首。
所以备份挽救了我的一天......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接