Mysql
Mysql崩潰了,無法啟動
我們的生產 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/:
- 停止
mysqld
(service mysql stop
)。- 備份
/var/lib/mysql/ib*
- 將以下行添加到
/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