Mysql 崩溃,无法启动

til*_*ryj 23 mysql innodb crash

我们的生产 mysql 服务器刚刚崩溃并且无法恢复。它给出了段错误。我尝试了重新启动,只是不知道还能尝试什么。这是堆栈跟踪:

140502 14:13:05 [注意] 插件“联邦”被禁用。
InnoDB:日志扫描已通过检查点 lsn 108 1057948207
140502 14:13:06 InnoDB:数据库没有正常关闭!
InnoDB:启动崩溃恢复。
InnoDB:从 .ibd 文件中读取表空间信息...
InnoDB:从双写恢复可能的半写入数据页
InnoDB:缓冲...
InnoDB:进行恢复:扫描到日志序列号 108 1058059648
InnoDB:必须回滚或清理的 1 个事务
InnoDB:总共需要撤消 15 行操作
InnoDB:Trx id 计数器为 0 562485504
140502 14:13:06 InnoDB:开始将一批日志记录应用到数据库...
InnoDB:百分比进度:4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 4 3 4 3 4 3 4 3 4 3 4 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
InnoDB:应用批处理已完成
InnoDB:在后台启动未提交事务的回滚
140502 14:13:06 InnoDB:回滚 ID 为 0 562485192 的 trx,要撤消 15 行
140502 14:13:06 InnoDB:开始;日志序列号 108 1058059648
140502 14:13:06 InnoDB:文件 ../../../storage/innobase/fsp/fsp0fsp.c 行 1593 中的线程 1873206128 中的断言失败
InnoDB:失败断言:frag_n_used > 0
InnoDB:我们故意生成一个内存陷阱。
InnoDB:向 http://bugs.mysql.com 提交详细的错误报告。
InnoDB:如果你重复断言失败或崩溃,即使
InnoDB:在mysqld启动后,可能会出现
InnoDB:InnoDB 表空间损坏。请参阅
InnoDB:http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB:关于强制恢复。
140502 14:13:06 - mysqld 得到信号 6 ;
这可能是因为您遇到了错误。这个二进制文件也有可能
或者它链接的库之一已损坏,构建不当,
或配置错误。此错误也可能由硬件故障引起。
我们将尽最大努力收集一些信息,希望能帮助诊断
问题,但既然我们已经崩溃了,肯定是出了什么问题
这可能会失败。

key_buffer_size=16777216
read_buffer_size=131072
max_used_connections=0
最大线程数=151
线程连接=0
mysqld 最多可以使用 
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 345919 K
内存字节
希望没问题;如果不是,减少方程中的一些变量。

第:0x0
试图回溯。您可以使用以下信息来了解
mysqld 死的地方。如果您在此之后没有看到任何消息,则说明发生了一些事情
大错特错...
stack_bottom = (nil) thread_stack 0x30000
140502 14:13:06 [注意] 事件调度程序:加载了 0 个事件
140502 14:13:06 [注意] /usr/sbin/mysqld:准备好连接。
版本:'5.1.41-3ubuntu12.10' 套接字:'/var/run/mysqld/mysqld.sock' 端口:3306 (Ubuntu)
/usr/sbin/mysqld(my_print_stacktrace+0x2d) [0xb7579cbd]
/usr/sbin/mysqld(handle_segfault+0x494) [0xb7245854]
[0xb6fc0400]
/lib/tls/i686/cmov/libc.so.6(abort+0x182) [0xb6cc5a82]
/usr/sbin/mysqld(+0x4867e9) [0xb74647e9]
/usr/sbin/mysqld(btr_page_free_low+0x122) [0xb74f1622]
/usr/sbin/mysqld(btr_compress+0x684) [0xb74f4ca4]
/usr/sbin/mysqld(btr_cur_compress_if_useful+0xe7) [0xb74284e7]
/usr/sbin/mysqld(btr_cur_pessimistic_delete+0x332) [0xb7429e72]
/usr/sbin/mysqld(btr_node_ptr_delete+0x82) [0xb74f4012]
/usr/sbin/mysqld(btr_discard_page+0x175) [0xb74f41e5]
/usr/sbin/mysqld(btr_cur_pessimistic_delete+0x3e8) [0xb7429f28]
/usr/sbin/mysqld(+0x526197) [0xb7504197]
/usr/sbin/mysqld(row_undo_ins+0x1b1) [0xb7504771]
/usr/sbin/mysqld(row_undo_step+0x25f) [0xb74c210f]
/usr/sbin/mysqld(que_run_threads+0x58a) [0xb74a31da]
/usr/sbin/mysqld(trx_rollback_or_clean_all_without_sess+0x3e3) [0xb74ded43]
/lib/tls/i686/cmov/libpthread.so.0(+0x596e) [0xb6f9f96e]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e) [0xb6d65a4e]
http://dev.mysql.com/doc/mysql/en/crashing.html 的手册页包含
应该可以帮助您找出导致崩溃的原因的信息。

有什么建议吗?

小智 29

哎哟。

InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: about forcing recovery.
Run Code Online (Sandbox Code Playgroud)

检查建议的网页:http : //dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html

基本上,尝试以恢复模式启动 MySQL 服务器并备份崩溃的表

编辑您的/etc/my.cnf并添加:

 innodb_force_recovery = 1
Run Code Online (Sandbox Code Playgroud)

...查看是否可以进入数据库并获取数据/找到损坏的表。

通常,发生这种情况时是重新构建(至少是损坏的一两个表)。

http://chepri.com/mysql-innodb-corruption-and-recovery/

  1. 停止mysqld( service mysql stop)。
  2. 备份 /var/lib/mysql/ib*
  3. 将以下行添加到/etc/my.cnf

    innodb_force_recovery = 1
    
    Run Code Online (Sandbox Code Playgroud)

    (他们建议 4,但最好从 1 开始,如果不开始则递增)

  4. 重新启动mysqld( service mysql start)。

  5. 转储所有表: mysqldump -A > dump.sql
  6. 删除所有需要恢复的数据库。
  7. 停止mysqld( service mysql stop)。
  8. 消除 /var/lib/mysql/ib*
  9. 注释掉innodb_force_recovery/etc/my.cnf
  10. 重新启动mysqld。查看mysql错误日志。默认情况下,应该/var/lib/mysql/server/hostname.com.err查看它如何创建新ib*文件。
  11. 从转储中恢复数据库: mysql < dump.sql

  • 我知道这是一个旧线程,但是否详细说明了确定哪些数据库需要恢复? (2认同)