【问题标题】:MySQL Databases CorruptedMySQL 数据库损坏
【发布时间】:2014-03-17 07:05:27
【问题描述】:

我们在 Windows Server 2008 R2 KVM VPS 上运行 MySQL Database 5.5 服务器,我们的系统会根据需要自动为客户设置新数据库。昨天,一个完全独立的驱动器/分区空间不足(没有与 MySQL 数据库关联的文件),但似乎损坏了 MySQL 数据库。

在查看日志文件时,我可以看到 InnoDB 已损坏,但无法确定问题所在或如何解决问题。谁能帮助解释这些错误是什么意思,以便我可以修复它?

Thread pointer: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
00000001401198BD    mysqld.exe!my_osmaperr()
000000014011E79A    mysqld.exe!my_osmaperr()
0000000140159697    mysqld.exe!my_osmaperr()
0000000140159F53    mysqld.exe!my_osmaperr()
00000001400F05AD    mysqld.exe!my_osmaperr()
00000001400F07C8    mysqld.exe!my_osmaperr()
00000001400F105C    mysqld.exe!my_osmaperr()
00000001400F4FB3    mysqld.exe!my_osmaperr()
00000001400DA97C    mysqld.exe!my_osmaperr()
00000001400C338C    mysqld.exe!my_osmaperr()
0000000076C0652D    kernel32.dll!BaseThreadInitThunk()
0000000076D3C541    ntdll.dll!RtlUserThreadStart()

InnoDB: Thread 408 stopped in file hash0hash.c line 146

http://justpaste.it/efuh

【问题讨论】:

    标签: mysql sql database innodb corrupt-data


    【解决方案1】:

    严重错误是

    140217 18:51:48  InnoDB: Assertion failure in thread 2052 in file btr0cur.c line 270
    InnoDB: Failing assertion: btr_page_get_next(get_block->frame, mtr) == page_get_page_no(page)
    

    这意味着在叶子 B+树索引页中指向下一页的指针指向了错误的页。每个页面的页眉都有自己的 page_id。

    要修复它,请使用 innodb_force_recovery=4 启动 MySQL,并使用 mysqldump 转储所有表,以便从头开始重新创建 InnoDB 表空间。 mysqldump 很可能会在某些表中失败(因为没有一致的页指针列表)。在这种情况下,在 PK 范围内转储表格或使用类似 this 的脚本

    更新:数据恢复工具包移至GitHub

    【讨论】:

    • 我能够以 innodb_force_recovery=4 启动它,并且现在运行 mysqldump,将所有数据库导出到“database.sql”。由于我不清楚最后的说明,一旦完成,我应该设置一个新的 MYSQL 数据库(全新安装 VPS)并导入此 SQL 吗?
    • mysqldump 似乎仍在运行,但为 mysqld 打开的另一个控制台窗口刚刚开始向 InnoDB 发送有关“可能已复制表空间但未复制日志文件”的垃圾邮件
    • InnoDB 将数据存储在 B+tree 索引的叶子页中。叶页以两个方向的列表连接。您的 MySQL 崩溃了,因为此列表因某些索引而损坏。 mysqldump 必须扫描一个表,即遵循指针列表。这就是为什么我怀疑 mysqldump 可能会使某些表上的 mysqld 崩溃。如果发生这种情况,将表转储到主键范围内。假设该表以 id 作为主键。 id 介于 1 和 1000 之间。如果“select * from table”使 mysqld 崩溃,那么“select * from table where id
    • 忘了说 - 最好分别转储每个表
    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多