修復MySQL資料庫 MyISAM InnoDB

2021-12-29 20:05:59 字數 4479 閱讀 3334

在網上找了篇mysql的技術文章,感覺不錯,把它翻譯過來共享下。 

原文作者:mike peters 

我整理了7條修復mysql資料庫的方法,當簡單的重啟對資料庫不起作用,或者有表崩潰時。 

簡單的mysql重啟: 

/usr/local/mysql/bin/mysqladmin -uusername -ppassword shutdown 

/usr/local/mysql/bin/mysqld_safe & 

1、myisam表崩潰 

mysql資料庫允許不同的表使用不同的儲存引擎。它用來儲存與檢索資料。較流行的儲存引擎是myisam與innodb。 

myisam表最終「將」崩潰。這是個不爭的事實。 

幸運的是,在多數情況下,myisam表崩潰很容易修復。 

修復單一表,連線你的資料庫執行: 

repair tablename 

修復所有的表,執行: 

/usr/local/mysql/bin/mysqlcheck --all-databases -uusername -ppassword -r 

多數情況,只有當你瀏覽日誌檔案時,才知道myisam表崩潰了。 

我強烈建議在你的/etc/my.cnf配置檔案中新增此行。一旦表崩潰它將進行自動修復。 

[mysqld] 

myisam-recover=backup,force 

如果這個也不管用,還有其他的方法可以試試。 

2、多例項mysql 

當你重啟mysql後,程序馬上死掉,這很常見。 

檢視日誌檔案,它會告訴你,另乙個mysql例項可能正在執行。 

停止所有mysql例項: 

/usr/local/mysql/bin/mysqladmin -uusername -ppassword shutdown 

killall mysql 

killall mysqld 

現在重啟資料庫,將只有乙個例項在執行。 

3、改變innodb日誌設定 

一旦mysql資料庫有在執行innodb引擎,你就一定不能修改/etc/my.cnf檔案中如下幾行: 

datadir = /usr/local/mysql/data 

innodb_data_home_dir = /usr/local/mysql/data 

innodb_data_file_path = ibdata1:10m:autoextend 

innodb_log_group_home_dir = /usr/local/mysql/data 

innodb_log_files_in_group = 2 

innodb_log_file_size = 5242880 

innodb日誌檔案大小一旦確定就不能修改。如果改變了,資料庫將不能啟動。 

4、mysql host表丟失 

有見過幾次這樣的情況。可能是一些異想不到的myisam bug。 

輕鬆將其修復如下: 

/usr/local/bin/mysql_install_db 

5、不正常的myisam自動增長(auto_increment) 

如果myisam表自增計數變得紊亂,你就不能再插入新的紀錄。 

通常你可以告訴自增計數器它現在工作不正常,通過將最後一條紀錄的自增欄位設為-1。 

解決問題-找到最後一條自增記錄的有效值(執行如下命令) 

select max(id) from tablename 

然後更新此表的自增計數器,如下: 

alter table tablename auto_increment = id+1 

6、太多連線數 

資料庫變得相當繁忙,因為連線數比它能處理的多。而且現在你都不能連線上你的資料庫。 

首先,停止資料庫: 

/usr/local/mysql/bin/mysqladmin -uusername -ppassword shutdown 

如果上條命令不管用,可以試試 "killall mysql" 和 "killall mysqld" 

當資料庫停止後,編輯/etc/my.cnf檔案,增加連線數。不要痴狂的增加這個數字,否則你會把你的整台機器搞崩。

在一台專用資料庫機器上,我們通常用: 

max_connections = 200 

wait_timeout = 100 

試著重啟資料庫看看是否有幫助。 

如果你被查詢弄的措手不及,需要連線資料庫進行表修改操作,那麼在/etc/my.cnf檔案中設定乙個不同的埠號,開啟資料庫,進行修改操作。然後將埠修改回來(master-port = 3306)再重啟。 

7、innodb表崩潰 

innodb表是我最鍾愛的。事物快取,可靠,不像myisam,innodb支援對同一表的併發寫。 

innodb的內部恢復機制也相當不錯。如果資料庫崩潰,innodb將嘗試進行修復,通過從最後乙個時間戳開始執行日誌檔案。大多數情況都會成功,整個過程是透明的。 

不過,如果innodb自行修復失敗,那麼「整個」資料庫將不能啟動。mysql將會發出乙個錯誤資訊並退出,你的整個庫將處於離線狀態。你可以不斷嘗試重啟資料庫,但是如果修復程序失敗,資料庫將拒絕啟動。 

這就是為什麼需要執行master/master當使用innodb時——當乙個master宕掉時,還有一台冗餘master做後備。 

在繼續操作前,先瀏覽下mysql的日誌檔案,確定資料庫不是因為innodb表的崩潰而崩潰。 

有一種方法是更新innodb的日誌檔案計數器以跳過引起崩潰的查詢,但是經驗告訴我們這不是個好方法。這種情況下,將造成資料的不一致性而且會經常使主從複製中斷。 

一旦因innodb崩潰造成資料庫無法啟動,你就應該按如下五個步驟處理問題: 

第一:新增此行到/etc/my.cnf檔案中: 

[mysqld] 

innodb_force_recovery = 4 

第二:重啟mysql。你的資料庫現在將啟動,但是在innodb_force_recovery引數作用下,所有的插入與更新操作將被忽略。 

第三:匯出所有的表(dump all tables) 

第四:關閉資料庫,刪除所有的資料檔案。執行mysql_install_db 建立預設mysql表。 

第五:從/etc/my.cnf檔案中去掉innodb_force_recovery引數,重啟資料庫。(庫現在應該能正常啟動) 

第六:從備份檔案中恢復所有資料。 

續: 最近遇到了個讓人棘手的任務——修復乙個失敗的innodb資料庫。這個資料庫因崩潰而無法啟動。 

第一步將innodb在force-recovery模式下開啟,此時innodb雖開啟了但是將忽略所有更新(updates)與插入(inserts)操作。 

在/etc/my.cnf檔案中新增此行: 

innodb_force_recovery = 2 

現在重啟資料庫: 

/usr/local/bin/mysqld_safe & 

(注意:如果mysql沒有啟動,繼續增加 innodb_force_recovery 的數值直到將引數值設為8( innodb_force_recovery =) 

將所有資料儲存到臨時檔案alldb.sql(下個命令需要花一定時間): 

mysqldump --force --compress --triggers --routines --create-options -uusername -ppassword --all-databases > /usr/alldb.sql 

再次關閉資料庫: 

mysqladmin -uusername -ppassword shutdown 

刪除資料庫目錄。(注意:我的資料目錄在/usr/local/var下。你的設定有可能不同,確保刪除的是正確的資料夾。) 

rm -fdr /usr/local/var   

重建資料庫資料夾,安裝mysql基礎表 

mkdir /usr/local/var 

chown -r mysql:mysql /usr/local/var 

/usr/local/bin/mysql_install_db 

chown -r mysql:mysql /usr/local/var   

從/etc/my.cnf檔案中刪除innodb_force_recovery ,重啟資料庫: 

/usr/local/bin/mysqld_safe &   

匯入所有備份檔案(下一命令需要花一段時間): 

mysql -uroot --compress < /usr/alldb.sql   

最後,重新整理mysql的許可權(因為我們也更新了mysql的表) 

/usr/local/bin/mysqladmin -uroot flush-privileges 

注意:為了得到最好的結果,新增port=8819(或任何其他隨機埠)到/etc/my.cnf檔案中在重啟mysql之前,然後將--port=8819新增到mysqldump命令中。這種方法避免了mysql資料庫過於系繁忙當修復程序正在進行時。   

作者 mushme

MySQL資料庫InnoDB與MyISAM區別

特點 行級鎖,支援事務處理,支援外來鍵,行鎖實現,根據索引條件檢索資料使用行鎖。表鎖,支援全文索引。表鎖,分為表共享鎖和表獨佔鎖。讀和讀之間使用共享鎖,讀寫之間使用獨佔鎖。b樹,又稱多路平衡查詢樹。所有節點中孩子節點的最大值為此樹的階 用m表示 每個節點關鍵字的個數最少有 m 2 1 個,最多有 m...

修復MYSQL資料庫

whereis mysql cd usr local mysql mysqlcheck u root p auto repair check optimize all databases 修復後看看大小 四種在mysql中修改root密碼的方法,可能對大家有所幫助 方法1 用set password...

修復mysql語句 mysql修復資料庫

1.如果資料庫龐大讀寫非常慢的時候,精簡優化sql語句效果不是很明顯的時候,一定試試這個語句 mysqlcheck a o r p 並輸入mysql的root密碼,逐個修復所有資料庫 2.優化 optimize table name 個人感覺效果不是太好 3.只是對某個表進行修復可以用 myisam...