mysql innodb 崩溃断言

mysql innodb 崩溃断言

从周五开始,我的 innodb 数据库就出现了大问题。每当我对某个大约 22GB 的特定表进行某些操作时,mysql 服务器就会崩溃。插入数据可以正常工作,对其他表的所有其他操作也都可以正常工作。

根据“innochecksum”,所有页面都正常。我已经尝试使用 force_innodb_recovery <= 4,但服务器崩溃了,在转储行“6199219”处的表时,我收到丢失连接错误。即使在一些正常查询中也会发生崩溃。行号始终相同。

以下是我的错误日志中关于崩溃的内容:

sr@kirk:~$ sudo mysqld --console --verbose
150215 19:20:15 [注意] 插件‘FEDERATED’已被禁用。
150215 19:20:15 InnoDB:InnoDB 内存堆已禁用
150215 19:20:15 InnoDB:互斥锁和 rw_locks 使用 GCC 原子内置函数
150215 19:20:15 InnoDB:压缩表使用 zlib 1.2.3.4
150215 19:20:15 InnoDB:初始化缓冲池,大小 = 20.0G
150215 19:20:18 InnoDB:缓冲池初始化完成
150215 19:20:18 InnoDB:支持的最高文件格式是 Barracuda。
150215 19:20:22 InnoDB:等待后台线程启动
150215 19:20:23 InnoDB:5.5.41 已启动;日志序列号 80382959696
150215 19:20:23 [注意] 服务器主机名(绑定地址):'0.0.0.0';端口:3306
150215 19:20:23 [注意] - '0.0.0.0' 解析为 '0.0.0.0';
150215 19:20:23 [注意] 在 IP '0.0.0.0' 上创建服务器套接字。
150215 19:20:23 [警告] 未使用 --relay-log 或 --relay-log-index;因此当此 MySQL 服务器充当从属服务器且其主机名发生更改时,复制可能会中断!!请使用“--relay-log=mysqld-relay-bin”来避免此问题。
150215 19:20:23 [错误] 未设置服务器 ID,不会启动从属服务器
150215 19:20:23 [错误] 无法创建从属线程
150215 19:20:23 [注意] 事件调度程序:已加载 0 个事件
150215 19:20:23 [注意] mysqld:已准备好连接。
版本:'5.5.41-0ubuntu0.12.04.1' 套接字:'/var/run/mysqld/mysqld.sock' 端口:3306(Ubuntu)
150215 19:22:28 InnoDB:文件 btr0pcur.c 第 428 行中线程 140612062639872 中的断言失败
InnoDB:断言失败:page_is_comp(next_page) == page_is_comp(page)
InnoDB:我们故意产生一个内存陷阱。
InnoDB:向 http://bugs.mysql.com 提交详细的错误报告。
InnoDB:如果你反复遇到断言失败或崩溃,即使
InnoDB:mysqld 启动后,可能会出现
InnoDB:InnoDB 表空间损坏。请参阅
InnoDB:http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB:关于强制恢复。
18:22:28 UTC — mysqld 收到信号 6;
这可能是因为你遇到了 bug。这个二进制文件也可能
或者它所链接的某个库已损坏、构建不正确,
或配置错误。此错误也可能由硬件故障引起。
我们将尽力收集一些信息,希望能有所帮助
诊断问题,但由于我们已经崩溃,
肯定有什么地方出了问题,这可能会失败。

密钥缓冲区大小=16777216
读取缓冲区大小=131072
最大使用连接数=142
最大线程数=151
线程数=142
连接数=142
mysqld 可能会使用最多
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 1274444 K 字节内存
希望没问题;如果不行,请减少等式中的一些变量。

线程指针:0x7fe83528e930
尝试回溯。您可以使用以下信息来查找
mysqld 死机了。如果此后没有看到任何消息,则表示发生了一些问题
大错特错……
堆栈底部 = 7fe2cc0b6e60 线程堆栈 0x30000
mysqld(my_print_stacktrace + 0x29)[0x7fe814a2bd79]
mysqld(handle_fatal_signal + 0x483)[0x7fe8148f0923]
/lib/x86_64-linux-gnu/libpthread.so.0(+0xfcb0)[0x7fe81361fcb0]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0x35)[0x7fe812c860d5]
/lib/x86_64-linux-gnu/libc.so.6(中止+0x17b)[0x7fe812c8983b]
mysqld (+0x63ddbd)[0x7fe814b0ddbd]
mysqld (+0x5f7eee)[0x7fe814ac7eee] 复制代码
mysqld (+0x5dae0c)[0x7fe814aaae0c] 复制代码
mysqld(_Z13rr_sequentialP11READ_RECORD+0x19)[0x7fe8149c4e59]
mysqld(_Z10sub_selectP4JOINP13st_join_tableb + 0x71)[0x7fe8147f5bf1]
mysqld (+0x336914)[0x7fe814806914] 复制代码
mysqld(_ZN4JOIN4execEv + 0xc03)[0x7fe814816563]
mysqld(_Z12mysql_selectP3THDPPP4ItemP10TABLE_LISTjR4ListIS1_ES2_jP8st_orderSB_S2_SB_yP13select_resultP18st_select_lex_unitP13st_select_lex+0x130)[0x7fe814811cb0]
mysqld(_Z13handle_selectP3THDP3LEXP13select_resultm + 0x17c)[0x7fe814817cdc]
mysqld (+0x2fb9b4)[0x7fe8147cb9b4] 复制代码
mysqld(_Z21mysql_execute_commandP3THD+0x16a6)[0x7fe8147d3a06]
mysqld(_Z11mysql_parseP3THDPcjP12Parser_state+0x10f)[0x7fe8147d8c1f]
mysqld(_Z16dispatch_command19enum_server_commandP3THDPcj + 0x1f26)[0x7fe8147dac16]
mysqld(_Z24do_handle_one_connectionP3THD + 0x1bd)[0x7fe81488198d]
mysqld(handle_one_connection + 0x50)[0x7fe8148819f0]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x7fe813617e9a]
/lib/x86_64-linux-gnu/libc.so.6(克隆+0x6d)[0x7fe812d442ed]

尝试获取一些变量。
一些指针可能无效并导致转储中止。
查询(7fe268004b60):是无效的指针
连接ID(线程ID):14
状态:NOT_KILLED

http://dev.mysql.com/doc/mysql/en/crashing.html 上的手册页包含
这些信息应该可以帮助您找出导致崩溃的原因。

我的系统是 ubuntu 12.04,32GB RAM

你知道我可以尝试什么来解决这个问题吗?我备份了所有数据。

提前非常感谢您,抱歉我的英语不好。

答案1

这是一种腐败。

查看失败的断言 - page_is_comp(next_page) == page_is_comp(page)。它检查下一页的格式是否与当前页相同(紧凑或冗余)。

InnoDB索引可以是任意一种格式,但是不能混合。

因此,继续使用 innodb_force_recovery=1,2,3,4,5,6(尝试每个值直到 MySQL 启动),转储数据库并从头开始重新创建 InnoDB 表空间。

如果 MySQL 甚至在 innodb_force_recovery=6 的情况下也无法启动,或者在查询时崩溃(顺便说一下,在 mysqldump 中添加选项 --skip-lock-tables 有时会有所帮助),那么请查看https://twindb.com/recover-corrupt-mysql-database/

相关内容