Mysql

Mysql崩潰了,無法啟動

  • October 30, 2019

我們的生產 mysql 伺服器剛剛崩潰並且不會恢復。它給出了一個段錯誤。我嘗試重新啟動,只是不知道還能嘗試什麼。這是堆棧跟踪:

140502 14:13:05 [注意] 外掛 'FEDERATED' 已禁用。
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 34 35 36 37 38 39 40 451 42 473 4 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
讀取緩衝區大小=131072
max_used_connections=0
最大執行緒數=151
執行緒連接=0
mysqld 可能最多可以使用
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 345919 K
記憶體字節
希望沒關係;如果不是,減少方程中的一些變數。

thd: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(中止+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(複製+0x5e) [0xb6d65a4e]
http://dev.mysql.com/doc/mysql/en/crashing.html 的手冊頁包含
可以幫助您找出導致崩潰的原因的資訊。

有什麼建議嗎?

哎喲。

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.

檢查建議的網頁:http ://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html 。

基本上,嘗試以恢復模式啟動 MySQL 伺服器並備份崩潰的表

編輯您的/etc/my.cnf並添加:

innodb_force_recovery = 1

…看看您是否可以進入數據庫並獲取數據/找到損壞的表。

通常,當這種情況發生時,它會重新建構(至少是一個或兩個損壞的表)。

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

(他們建議 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

引用自:https://serverfault.com/questions/592793