【问题标题】:How to solve a data corruption issue? Cannot run any SQL queries on table如何解决数据损坏问题?无法对表运行任何 SQL 查询
【发布时间】:2016-07-05 19:06:36
【问题描述】:

我正在开发一个查询具有两个表的数据库的 Web 应用程序。我认为我有数据损坏的问题。我的一张桌子很好,我已经把它倒掉并备份了。我使用 python 脚本解析的一些 MongoDB 数据填充了数据库。

我正在使用 HeidiSQL 处理我的数据库,除非我在 my.ini 中指定“innodb_force_recovery = 4”(我相信它会创建一个只读版本的表),否则我无法查看损坏的表。即便如此,在我指定该条件后,我还是无法对表执行 mysqldump。

然后我想,也许是 HeidiSQL 的问题。不是。即使从命令行 mysqld,我也无法对损坏的数据库执行任何操作。下面我显示了我收到的错误消息。

Error message in mysqld as viewed via command line

即使是 XAMPP 控制面板在启动时也会抛出以下错误:

160705 14:41:34 [错误] mysqld 出现异常 0x80000003 ; 这可能是因为您遇到了错误。这个二进制文件也有可能 或者它所链接的库之一已损坏,构建不当, 或配置错误。此错误也可能是由硬件故障引起的。

所以。此时,我可以重新运行我的 python 脚本,但我认为我会遇到同样的错误。

你建议我如何处理这个问题?

【问题讨论】:

    标签: mysql innodb mysqldump corruption


    【解决方案1】:

    表空间已损坏,您的最终目标是进行转储并从头开始重新创建 InnoDB 表空间。

    当您以innodb_force_recovery=4 开始时,一张一张地转储所有表。编写一个循环遍历所有数据库和所有表的脚本。将--skip-lock-tables 添加到mysqldump,有时会有所帮助。

    然后尝试更高的 innodb_force_recovery 值:5 和 6。尝试使用 innodb_force_recovery=4 转储导致 MySQL 崩溃的剩余表。

    如果您仍然无法转储表,请搜索“percona 数据恢复工具包”或“undrop-for-innodb”。这些工具都适用于低级别的 InnoDB 表空间,并允许从跳过损坏区域的 InnoDB 页面中获取记录。

    当您拥有所有转储时,删除所有 innodb 文件(ibdata1、ib_logfile* 和 *.ibd,如果有的话)并导入转储。

    【讨论】:

    • 感谢您的回复。我从来没有在 MySQL 中编写过脚本,所以我会在以后尝试一下:)。我怀疑 mysqldump 是否会起作用,仅仅是因为我无法以任何容量访问该表——mysqld 立即崩溃。我将研究“percona 数据恢复工具包”和“undrop-for-innodb”
    • 我的意思是,一个shell脚本。类似for d in $(mysql -NBe 'show databases'); do for t in $(mysql -NBe 'show tables' $d); do mysqldump --skip-lock-tables $d $t > $d-$t.sql; done; done。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2019-11-11
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多