溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何修復(fù)MySQL數(shù)據(jù)庫(kù)

發(fā)布時(shí)間:2021-12-22 11:51:19 來(lái)源:億速云 閱讀:340 作者:小新 欄目:數(shù)據(jù)庫(kù)

這篇文章主要介紹如何修復(fù)MySQL數(shù)據(jù)庫(kù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!


 
我整理了7條修復(fù)MySQL的方法,當(dāng)簡(jiǎn)單的重啟對(duì)數(shù)據(jù)庫(kù)不起作用,或者有表崩潰時(shí)。 
 
簡(jiǎn)單的MySQL重啟: 
 
/usr/local//bin/mysqladmin -uUSERNAME -pPASSWORD shutdown 
/usr/local/mysql/bin/mysqld_safe & 
 
1、MyISAM表崩潰 
 
MySQL數(shù)據(jù)庫(kù)允許不同的表使用不同的存儲(chǔ)引擎。它用來(lái)存儲(chǔ)與檢索數(shù)據(jù)。較流行的存儲(chǔ)引擎是MyISAM與InnoDB。 
 
MyISAM表最終“將”崩潰。這是個(gè)不爭(zhēng)的事實(shí)。 
 
幸運(yùn)的是,在多數(shù)情況下,MyISAM表崩潰很容易修復(fù)。 
 
修復(fù)單一表,連接你的數(shù)據(jù)庫(kù)執(zhí)行: 
 
repair TABLENAME 
 
修復(fù)所有的表,執(zhí)行: 
 
/usr/local/mysql/bin/mysqlcheck --all-databases -uUSERNAME -pPASSWORD -r 
 
多數(shù)情況,只有當(dāng)你瀏覽日志文件時(shí),才知道MyISAM表崩潰了。 
我強(qiáng)烈建議在你的/etc/my.cnf配置文件中添加此行。一旦表崩潰它將進(jìn)行自動(dòng)修復(fù)。 
 
[mysqld] 
myisam-recover=backup,force 
 
如果這個(gè)也不管用,還有其他的方法可以試試。 
 
2、多實(shí)例MySQL 
 
當(dāng)你重啟MySQL后,進(jìn)程馬上死掉,這很常見(jiàn)。 
查看日志文件,它會(huì)告訴你,另一個(gè)MySQL實(shí)例可能正在運(yùn)行。 
 
停止所有MySQL實(shí)例: 
 
/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown 
killall mysql 
killall mysqld 
 
現(xiàn)在重啟數(shù)據(jù)庫(kù),將只有一個(gè)實(shí)例在運(yùn)行。 
 
3、改變InnoDB日志設(shè)置 
一旦MySQL數(shù)據(jù)庫(kù)有在運(yùn)行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日志文件大小一旦確定就不能修改。如果改變了,數(shù)據(jù)庫(kù)將不能啟動(dòng)。 
 
4、MySQL host表丟失 
 
有見(jiàn)過(guò)幾次這樣的情況。可能是一些異想不到的MyISAM bug。 
 
輕松將其修復(fù)如下: 
 
/usr/local/bin/mysql_install_db 
 
5、不正常的MyISAM自動(dòng)增長(zhǎng)(auto_increment) 
 
如果MyISAM表自增計(jì)數(shù)變得紊亂,你就不能再插入新的紀(jì)錄。 
通常你可以告訴自增計(jì)數(shù)器它現(xiàn)在工作不正常,通過(guò)將最后一條紀(jì)錄的自增字段設(shè)為-1。 
 
解決問(wèn)題-找到最后一條自增記錄的有效值(執(zhí)行如下命令) 
 
SELECT max(id) from tablename 
 
然后更新此表的自增計(jì)數(shù)器,如下: 
 
ALTER TABLE tablename AUTO_INCREMENT = id+1 
 
6、太多連接數(shù) 
 
數(shù)據(jù)庫(kù)變得相當(dāng)繁忙,因?yàn)檫B接數(shù)比它能處理的多。而且現(xiàn)在你都不能連接上你的數(shù)據(jù)庫(kù)。 
首先,停止數(shù)據(jù)庫(kù): 
 
/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown 
 
如果上條命令不管用,可以試試 "killall mysql" 和 "killall mysqld" 
當(dāng)數(shù)據(jù)庫(kù)停止后,編輯/etc/my.cnf文件,增加連接數(shù)。不要癡狂的增加這個(gè)數(shù)字,否則你會(huì)把你的整臺(tái)機(jī)器搞崩。
 
在一臺(tái)專用數(shù)據(jù)庫(kù)機(jī)器上,我們通常用: 
 
max_connections = 200 
wait_timeout = 100 
 
試著重啟數(shù)據(jù)庫(kù)看看是否有幫助。 
如果你被查詢弄的措手不及,需要連接數(shù)據(jù)庫(kù)進(jìn)行表修改操作,那么在/etc/my.cnf文件中設(shè)置一個(gè)不同的端口號(hào),開(kāi)啟數(shù)據(jù)庫(kù),進(jìn)行修改操作。然后將端口修改回來(lái)(master-port = 3306)再重啟。 
 
7、InnoDB表崩潰 
 
InnoDB表是我最鐘愛(ài)的。事物緩存,可靠,不像MyISAM,InnoDB支持對(duì)同一表的并發(fā)寫(xiě)。 
 
InnoDB的內(nèi)部恢復(fù)機(jī)制也相當(dāng)不錯(cuò)。如果數(shù)據(jù)庫(kù)崩潰,InnoDB將嘗試進(jìn)行修復(fù),通過(guò)從最后一個(gè)時(shí)間戳開(kāi)始運(yùn)行日志文件。大多數(shù)情況都會(huì)成功,整個(gè)過(guò)程是透明的。 
 
不過(guò),如果InnoDB自行修復(fù)失敗,那么“整個(gè)”數(shù)據(jù)庫(kù)將不能啟動(dòng)。MySQL將會(huì)發(fā)出一個(gè)錯(cuò)誤信息并退出,你的整個(gè)庫(kù)將處于離線狀態(tài)。你可以不斷嘗試重啟數(shù)據(jù)庫(kù),但是如果修復(fù)進(jìn)程失敗,數(shù)據(jù)庫(kù)將拒絕啟動(dòng)。 
 
這就是為什么需要運(yùn)行master/master當(dāng)使用InnoDB時(shí)——當(dāng)一個(gè)master宕掉時(shí),還有一臺(tái)冗余master做后備。 
 
在繼續(xù)操作前,先瀏覽下MySQL的日志文件,確定數(shù)據(jù)庫(kù)不是因?yàn)镮nnoDB表的崩潰而崩潰。 
 
有一種方法是更新InnoDB的日志文件計(jì)數(shù)器以跳過(guò)引起崩潰的查詢,但是經(jīng)驗(yàn)告訴我們這不是個(gè)好方法。這種情況下,將造成數(shù)據(jù)的不一致性而且會(huì)經(jīng)常使主從復(fù)制中斷。 
 
一旦因InnoDB崩潰造成數(shù)據(jù)庫(kù)無(wú)法啟動(dòng),你就應(yīng)該按如下五個(gè)步驟處理問(wèn)題: 
 
第一:添加此行到/etc/my.cnf文件中: 
 
[mysqld] 
innodb_force_recovery = 4 
 
第二:重啟MySQL。你的數(shù)據(jù)庫(kù)現(xiàn)在將啟動(dòng),但是在innodb_force_recovery參數(shù)作用下,所有的插入與更新操作將被忽略。 
 
第三:導(dǎo)出所有的表(Dump all tables) 
 
第四:關(guān)閉數(shù)據(jù)庫(kù),刪除所有的數(shù)據(jù)文件。運(yùn)行mysql_install_db 創(chuàng)建默認(rèn)MySQL表。 
 
第五:從/etc/my.cnf文件中去掉innodb_force_recovery參數(shù),重啟數(shù)據(jù)庫(kù)。(庫(kù)現(xiàn)在應(yīng)該能正常啟動(dòng)) 
 
第六:從備份文件中恢復(fù)所有數(shù)據(jù)。 
 
續(xù): 
最近遇到了個(gè)讓人棘手的任務(wù)——修復(fù)一個(gè)失敗的InnoDB數(shù)據(jù)庫(kù)。這個(gè)數(shù)據(jù)庫(kù)因崩潰而無(wú)法啟動(dòng)。 
 
第一步將InnoDB在force-recovery模式下開(kāi)啟,此時(shí)InnoDB雖開(kāi)啟了但是將忽略所有更新(UPDATEs)與插入(INSERTs)操作。 
 
在/etc/my.cnf文件中添加此行: 
 
innodb_force_recovery = 2 
 
現(xiàn)在重啟數(shù)據(jù)庫(kù): 
 
/usr/local/bin/mysqld_safe & 
 
(注意:如果MySQL沒(méi)有啟動(dòng),繼續(xù)增加 innodb_force_recovery 的數(shù)值直到將參數(shù)值設(shè)為8( innodb_force_recovery =) 
 
將所有數(shù)據(jù)保存到臨時(shí)文件alldb.sql(下個(gè)命令需要花一定時(shí)間): 
 
mysqldump --force --compress --triggers --routines --create-options -uUSERNAME -pPASSWORD --all-databases > /usr/alldb.sql 
 
再次關(guān)閉數(shù)據(jù)庫(kù): 
 
mysqladmin -uUSERNAME -pPASSWORD shutdown 
 
刪除數(shù)據(jù)庫(kù)目錄。(注意:我的數(shù)據(jù)目錄在/usr/local/var下。你的設(shè)置有可能不同,確保刪除的是正確的文件夾。) 
 
rm -fdr /usr/local/var 
 
 
重建數(shù)據(jù)庫(kù)文件夾,安裝MySQL基礎(chǔ)表 
 
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 ,重啟數(shù)據(jù)庫(kù): 
 
/usr/local/bin/mysqld_safe & 
 
 
導(dǎo)入所有備份文件(下一命令需要花一段時(shí)間): 
 
mysql -uroot --compress < /usr/alldb.sql 
 
 
最后,刷新MySQL的權(quán)限(因?yàn)槲覀円哺铝薓ySQL的表) 
 
/usr/local/bin/mysqladmin -uroot flush-privileges 
 
注意:為了得到最好的結(jié)果,添加port=8819(或任何其他隨機(jī)端口)到/etc/my.cnf文件中在重啟MySQL之前,然后將--port=8819添加到mysqldump命令中。這種方法避免了MySQL數(shù)據(jù)庫(kù)過(guò)于系繁忙當(dāng)修復(fù)進(jìn)程正在進(jìn)行時(shí)。 
 

以上是“如何修復(fù)MySQL數(shù)據(jù)庫(kù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI