解决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...
stack_bottom = 0 thread_stack 0x40000
/www/server/mysql/bin/mysqld(my_print_stacktrace+0x2c)[0x90b51c]
/www/server/mysql/bin/mysqld(handle_fatal_signal+0x357)[0x678097]
/lib64/libpthread.so.0(+0xf630)[0x2ae255f95630]
/lib64/libc.so.6(gsignal+0x37)[0x2ae25770a387]
/lib64/libc.so.6(abort+0x148)[0x2ae25770ba78]
/www/server/mysql/bin/mysqld[0x9fe06b]
/www/server/mysql/bin/mysqld[0x9fea85]
/www/server/mysql/bin/mysqld[0xa0013e]
/www/server/mysql/bin/mysqld[0x9f33a7]
/lib64/libpthread.so.0(+0x7ea5)[0x2ae255f8dea5]
/lib64/libc.so.6(clone+0x6d)[0x2ae2577d2b0d]
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.

解决

进入InnoDB恢复模式

mysqld配置文件mysqld下加入

innodb_force_recovery = 6

如果innodb_force_recovery = 6不生效,则可尝试2——6几个数字。

innodb_force_recovery影响整个InnoDB存储引擎的恢复状况。默认为0,表示当需要恢复时执行所有的恢复操作(即校验数据页/purge undo/insert buffer merge/rolling
back&forward),当不能进行有效的恢复操作时,mysql有可能无法启动,并记录错误日志;
innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。

1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

重启服务

systemctl restart mysqld.service

备份数据库数据

常规方法备份数据库数据,可以尝试删除所有数据库然后退出恢复模式(删除刚刚加的innodb_force_recovery)然后导入数据库,或者升级新版本

Sitemap · Rss

津ICP备2021004480号-3