Forum Dictionary / Programming / Database / Mysql /

MySQL崩潰 - 如何救回資料

New Subject
Random
Previous
Next
|
MySQL崩潰 - 如何救回資料

文章來源 mysql 官方手冊 :

所有MySQL在發布它們之前,在許多平台上被測試。這並不意味著在MySQL中沒有任何錯誤,但是如果有錯誤,它們是很少的並且很能難發現。如果你有一個問題並且如果你嘗試找出究竟是什麼摧毀了你的系統,它將總是有幫助的,因為你將有一個更好機會使得它被快速修複。

首先你應該試著找出問題mysqld守護進程是否死掉或你的問題是否與你的客戶有關。你可以用mysqladmin version檢查你的mysqld服務器正常執行了多長時間,如果mysqld死了,你可以在文件“mysql-data-directory/'hostname'.err”中找到其原因。

因為很難知道一些東西為什麼崩潰,首先試著檢查為其它人工作的東西是否使你崩潰。請嘗試下列事情:

  * 與mysqladmin shutdown停止mysqld守護進程,在所有表上運行myisamchk --silent --force */*.MYI並重啟mysqld守護經進程。這將保証你從一個幹淨的狀態運行。見13 維護MySQL安裝。
  * 使用mysqld --log並且試著從日志信息確定是否是某個特定的查詢殺死了服務器。全部錯誤的95%與特定的查詢有關!通常它是在日志文件中就在MySQL重啟之前的最後查詢之一。你也許可以使用下列過程驗証它:
      o 停止MySQL守護進程(用mysqladmin shutdown)。
      o 在MySQL數據庫目錄下做文件的一個備份。
      o 與myisamchk -s */*.MYI檢查表以驗証所有表是正確的。如果有任何表被損壞,用myisamchk -r path-to-table.MYI修複它。
      o 從MySQL數據目錄刪除(或移走)任何舊的日志文件。
      o 用safe_mysql --log啟動服務器。
      o 如果mysqld現在死掉,你可以通過恢複備份並執行mysql < mysql-log-file來測試問題是否是一個特定的查詢引起的。當然你可以通過用safe_mysqld --data=path-to-backup-directory啟動另一個MySQL服務器,在某個其他目錄而不是標准MySQL數據庫目錄下做後面的測試。
  * 你試用了基准測試嗎?他們應該很好地測試MySQL。你也可以增加代碼模擬你的應用程序!基准程序可在源代碼分發的“bench”目錄下找到,或對二進制分發,在你的MySQL安裝目錄下“sql-bench”目錄。
  * 試一下fork_test.pl和fork2_test.pl。
  * 對任何錯誤檢查文件“mysql-data-directory/'hostname'.err”。
  * 如果你配置MySQL以便調試,如果出錯,收集可能的錯誤信息將更容易。使用--with-debug選項的configure重新配置MySQL然後重新編譯。見G.1 調試一個 MySQL 服務器。
  * 為調試而配置MySQL使它包含一個安全的內存分配器以便能發現一些錯誤。它也提供關于正在發生什麼的大量輸出。
  * 你為你的操作系統使用了最新的補丁嗎?
  * 使用mysql的--skip-locking選項.在一些系統上,lockd鎖管理器不能正確工作;--skip-locking選項告訴mysqld不使用外部鎖。(這意味著你不能在同一個數據上運行兩個mysqld服務器而且如果你使用myisamchk,你一定要小心,但是它對為了測試試用選項可能有益。)
  * 當mysqld好象正在運行但沒有反應時,你嘗試過mysqladmin -u root processlist嗎?有時mysqld不是毫無反應,盡管你可能這樣認為。問題可能是所有在用的連接,或可能用內部鎖定問題。mysqladmin processlist甚至在這些情況下將通常可以進行一個連接,並且能提供有關當前連接數量及其狀態的有用信息。
  * 在你運行其他查詢時,在一個單獨窗口中運行命令mysqladmin -i 5 status,產生統計。
  * 嘗試下列步驟:
      1. 通過gdb(或其他調試器)啟動mysqld。
      2. 運行你的測試腳本。
      3. 當mysqld核心傾倒(core dump),做back(或你調試器中的回溯-backtrace命令)。
  * 嘗試用一個Perl腳本模擬你的應用程序以強制MySQL崩潰或表現不正確。
  * 或發一份正式的錯誤報告。見2.3 如何報告錯誤或問題,但是要不平常更詳細。因為MySQL為很多人的工作,導致崩潰的東西可能只存在于你的計算機上(例如,與你的特定系統庫有關的一個錯誤)。
  * 如果你的問題有具有動態長度行的表有關,並且你不使用BLOB/TEXT列(但是僅VARCHAR列),你可以用ALTER TABLE試著將全部VARCHAR改為CHAR,這將強制MySQL使用固定尺寸的行。固定尺寸的行占據很小的額外空間,但是更能容忍崩潰!當前動態行的代碼在 TCX 至少使用3 年的時間,沒有任何問題,但是從本質上講,動態長度的行對錯誤更敏感,因此如果上述對你有幫助,嘗試一下可能是一個好主意!
  • Keywords : 問題, mysql, 錯誤, 特定, 查詢, 連接, 測試, 服務器, 幫助, 崩潰, mysqladmin, locking選, hostname, directory, bench, MySQL, 首先試, 首先, 額外空, 錯誤報告
0 0
2009-01-21T09:06:41+0000


  • Now, you can post comments by Facebook Account when your Yampiz account was logout or unvariable. whatever, we suggest to post comment by Yampiz Account to get more bounds to join new events of Heyxu
Comment
 
Verify