MySQL數(shù)據(jù)庫(kù)修復(fù)方法(MyISAM/InnoDB)
在網(wǎng)上找了篇MySQL的技術(shù)文章,感覺(jué)不錯(cuò),把它翻譯過(guò)來(lái)共享下。
原文作者:Mike Peters
我整理了7條修復(fù)MySQL數(shù)據(jù)庫(kù)的方法,當(dāng)簡(jiǎn)單的重啟對(duì)數(shù)據(jù)庫(kù)不起作用,或者有表崩潰時(shí)。
簡(jiǎn)單的MySQL重啟:
/usr/local/mysql/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ò)幾次這樣的情況??赡苁且恍┊愊氩坏降腗yISAM 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),開啟數(shù)據(jù)庫(kù),進(jìn)行修改操作。然后將端口修改回來(lái)(master-port = 3306)再重啟。
7、InnoDB表崩潰
InnoDB表是我最鐘愛(ài)的。事物緩存,可靠,不像MyISAM,InnoDB支持對(duì)同一表的并發(fā)寫。
InnoDB的內(nèi)部恢復(fù)機(jī)制也相當(dāng)不錯(cuò)。如果數(shù)據(jù)庫(kù)崩潰,InnoDB將嘗試進(jìn)行修復(fù),通過(guò)從最后一個(gè)時(shí)間戳開始運(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模式下開啟,此時(shí)InnoDB雖開啟了但是將忽略所有更新(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í)。
- MySQL MyISAM 與InnoDB 的區(qū)別
- 簡(jiǎn)單了解mysql InnoDB MyISAM相關(guān)區(qū)別
- MySQL創(chuàng)建數(shù)據(jù)表時(shí)設(shè)定引擎MyISAM/InnoDB操作
- MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別總結(jié)整理
- Mysql更換MyISAM存儲(chǔ)引擎為Innodb的操作記錄總結(jié)
- MySQL存儲(chǔ)引擎中的MyISAM和InnoDB區(qū)別詳解
- mysql更改引擎(InnoDB,MyISAM)的方法
- Mysql InnoDB和MyISAM區(qū)別原理解析
相關(guān)文章
MySQL每晚定時(shí)彈出一個(gè)taskeng.exe的解決方法
這篇文章主要介紹了MySQL每晚定時(shí)彈出一個(gè)taskeng.exe的解決方法,需要的朋友可以參考下2018-07-07MySQL定時(shí)執(zhí)行腳本(計(jì)劃任務(wù))命令實(shí)例
在mysql中我們可以直接進(jìn)行一些參數(shù)設(shè)置讓它成定時(shí)為我們執(zhí)行一些任務(wù)了,這個(gè)雖然可以使用windows或者linux中的計(jì)劃任務(wù)實(shí)現(xiàn),但是mysql本身也能完成2013-10-10mysql8.0.14.zip安裝時(shí)自動(dòng)創(chuàng)建data文件夾失敗服務(wù)無(wú)法啟動(dòng)
這篇文章主要介紹了mysql8.0.14.zip安裝時(shí)自動(dòng)創(chuàng)建data文件夾失敗,導(dǎo)致服務(wù)無(wú)法啟動(dòng)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02mysql報(bào)錯(cuò)RSA?private?key?file?not?found的解決方法
當(dāng)MySQL報(bào)錯(cuò)RSA?private?key?file?not?found時(shí),可能是由于MySQL的RSA私鑰文件丟失或者損壞導(dǎo)致的,此時(shí)可以重新生成RSA私鑰文件,以解決這個(gè)問(wèn)題2023-06-06MySQL系列多表連接查詢92及99語(yǔ)法示例詳解教程
這篇文章主要為大家介紹了MySQL系列多表連接查詢92及99語(yǔ)法示例詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10快速學(xué)習(xí)MySQL基礎(chǔ)知識(shí)
這篇文章主要介紹了MySQL基礎(chǔ)知識(shí)的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù)
這篇文章主要介紹了基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09MySQL replace into 語(yǔ)句淺析(二)
這篇文章主要介紹了MySQL replace into 語(yǔ)句淺析(二),本文著重給出了幾個(gè)特殊案例分析,需要的朋友可以參考下2015-05-05mysql 5.7 數(shù)據(jù)庫(kù)安裝步驟個(gè)人總結(jié)
這篇文章主要介紹了mysql 數(shù)據(jù)庫(kù)安裝步驟個(gè)人總結(jié),需要的朋友可以參考下2017-09-09