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

Son*_*cFC 5 mysql database corruption mariadb

我在跑:

MariaDB 10.0.5
Ubuntu 12.04 LTS
Both up to the latest patch level as per last Friday
Run Code Online (Sandbox Code Playgroud)

我之前的问题已经变得非常糟糕:

http://stackoverflow.com/questions/19910996/mysql-connect-headers-and-client-library-minor-version-mismatch-library10000
Run Code Online (Sandbox Code Playgroud)

这导致了大量的损坏,因为我复制并删除了我的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
Run Code Online (Sandbox Code Playgroud)

幸运的是(幸运的是)我的大型制作客户网站的数据仍然完好无损且网站在线.虽然该DB中至少有一个损坏的表.现在恢复我所有其他网站的数据库.

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

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

http://dev.mysql.com/doc/refman/5.0/en/forcing-innodb-recovery.html
Run Code Online (Sandbox Code Playgroud)

但那没有效果.之后我尝试使用Mysql升级工具强制查看是否可以修复表:

mysql_upgrade --password --force
FATAL ERROR: Upgrade failed
Run Code Online (Sandbox Code Playgroud)

所以这并没有告诉我任何事情.接下来我使用了REPAIR TABLE和ALTER TABLE ENGINE命令:

http://dev.mysql.com/doc/refman/5.0/en/rebuilding-tables.html
Run Code Online (Sandbox Code Playgroud)

改变发动机:

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

修理台:

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)
Run Code Online (Sandbox Code Playgroud)

所以这一切都归结为将表信息反馈到引擎表中.https://mariadb.com/kb/en/mariadb-storage-engines/上的文档说明有两个存储引擎,我默认使用这两个存储引擎:

Aria
MyISAM
Run Code Online (Sandbox Code Playgroud)

当在其中一个未损坏的表上执行SHOW CREATE TABLE函数时,我得到以下结果:

ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 |
Run Code Online (Sandbox Code Playgroud)

所以我的MyISAM就是谷歌搜索'mysql repair myisam'引导我到以下网站:

Note: Would Aria have protected me against this issue?

http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html
Run Code Online (Sandbox Code Playgroud)

这产生了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
Run Code Online (Sandbox Code Playgroud)

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

我现在发布这个是为了看看你是否有任何有用的评论,我会同时继续我的分析并更新帖子,如果我得到更多.

提前致谢!

Son*_*cFC 4

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

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

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

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