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

為邛崍等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及邛崍網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、邛崍網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
我整理了7條修復(fù)MySQL的方法,當(dāng)簡單的重啟對數(shù)據(jù)庫不起作用,或者有表崩潰時(shí)。
簡單的MySQL重啟:
/usr/local//bin/mysqladmin -uUSERNAME -pPASSWORD shutdown
/usr/local/mysql/bin/mysqld_safe &
1、MyISAM表崩潰
MySQL數(shù)據(jù)庫允許不同的表使用不同的存儲(chǔ)引擎。它用來存儲(chǔ)與檢索數(shù)據(jù)。較流行的存儲(chǔ)引擎是MyISAM與InnoDB。
MyISAM表最終“將”崩潰。這是個(gè)不爭的事實(shí)。
幸運(yùn)的是,在多數(shù)情況下,MyISAM表崩潰很容易修復(fù)。
修復(fù)單一表,連接你的數(shù)據(jù)庫執(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)程馬上死掉,這很常見。
查看日志文件,它會(huì)告訴你,另一個(gè)MySQL實(shí)例可能正在運(yùn)行。
停止所有MySQL實(shí)例:
/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown
killall mysql
killall mysqld
現(xiàn)在重啟數(shù)據(jù)庫,將只有一個(gè)實(shí)例在運(yùn)行。
3、改變InnoDB日志設(shè)置
一旦MySQL數(shù)據(jù)庫有在運(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ù)庫將不能啟動(dòng)。
4、MySQL host表丟失
有見過幾次這樣的情況。可能是一些異想不到的MyISAM bug。
輕松將其修復(fù)如下:
/usr/local/bin/mysql_install_db
5、不正常的MyISAM自動(dòng)增長(auto_increment)
如果MyISAM表自增計(jì)數(shù)變得紊亂,你就不能再插入新的紀(jì)錄。
通常你可以告訴自增計(jì)數(shù)器它現(xiàn)在工作不正常,通過將最后一條紀(jì)錄的自增字段設(shè)為-1。
解決問題-找到最后一條自增記錄的有效值(執(zhí)行如下命令)
SELECT max(id) from tablename
然后更新此表的自增計(jì)數(shù)器,如下:
ALTER TABLE tablename AUTO_INCREMENT = id+1
6、太多連接數(shù)
數(shù)據(jù)庫變得相當(dāng)繁忙,因?yàn)檫B接數(shù)比它能處理的多。而且現(xiàn)在你都不能連接上你的數(shù)據(jù)庫。
首先,停止數(shù)據(jù)庫:
/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown
如果上條命令不管用,可以試試 "killall mysql" 和 "killall mysqld"
當(dāng)數(shù)據(jù)庫停止后,編輯/etc/my.cnf文件,增加連接數(shù)。不要癡狂的增加這個(gè)數(shù)字,否則你會(huì)把你的整臺(tái)機(jī)器搞崩。
在一臺(tái)專用數(shù)據(jù)庫機(jī)器上,我們通常用:
max_connections = 200
wait_timeout = 100
試著重啟數(shù)據(jù)庫看看是否有幫助。
如果你被查詢弄的措手不及,需要連接數(shù)據(jù)庫進(jìn)行表修改操作,那么在/etc/my.cnf文件中設(shè)置一個(gè)不同的端口號,開啟數(shù)據(jù)庫,進(jìn)行修改操作。然后將端口修改回來(master-port = 3306)再重啟。
7、InnoDB表崩潰
InnoDB表是我最鐘愛的。事物緩存,可靠,不像MyISAM,InnoDB支持對同一表的并發(fā)寫。
InnoDB的內(nèi)部恢復(fù)機(jī)制也相當(dāng)不錯(cuò)。如果數(shù)據(jù)庫崩潰,InnoDB將嘗試進(jìn)行修復(fù),通過從最后一個(gè)時(shí)間戳開始運(yùn)行日志文件。大多數(shù)情況都會(huì)成功,整個(gè)過程是透明的。
不過,如果InnoDB自行修復(fù)失敗,那么“整個(gè)”數(shù)據(jù)庫將不能啟動(dòng)。MySQL將會(huì)發(fā)出一個(gè)錯(cuò)誤信息并退出,你的整個(gè)庫將處于離線狀態(tài)。你可以不斷嘗試重啟數(shù)據(jù)庫,但是如果修復(fù)進(jìn)程失敗,數(shù)據(jù)庫將拒絕啟動(dòng)。
這就是為什么需要運(yùn)行master/master當(dāng)使用InnoDB時(shí)——當(dāng)一個(gè)master宕掉時(shí),還有一臺(tái)冗余master做后備。
在繼續(xù)操作前,先瀏覽下MySQL的日志文件,確定數(shù)據(jù)庫不是因?yàn)镮nnoDB表的崩潰而崩潰。
有一種方法是更新InnoDB的日志文件計(jì)數(shù)器以跳過引起崩潰的查詢,但是經(jīng)驗(yàn)告訴我們這不是個(gè)好方法。這種情況下,將造成數(shù)據(jù)的不一致性而且會(huì)經(jīng)常使主從復(fù)制中斷。
一旦因InnoDB崩潰造成數(shù)據(jù)庫無法啟動(dòng),你就應(yīng)該按如下五個(gè)步驟處理問題:
第一:添加此行到/etc/my.cnf文件中:
[mysqld]
innodb_force_recovery = 4
第二:重啟MySQL。你的數(shù)據(jù)庫現(xiàn)在將啟動(dòng),但是在innodb_force_recovery參數(shù)作用下,所有的插入與更新操作將被忽略。
第三:導(dǎo)出所有的表(Dump all tables)
第四:關(guān)閉數(shù)據(jù)庫,刪除所有的數(shù)據(jù)文件。運(yùn)行mysql_install_db 創(chuàng)建默認(rèn)MySQL表。
第五:從/etc/my.cnf文件中去掉innodb_force_recovery參數(shù),重啟數(shù)據(jù)庫。(庫現(xiàn)在應(yīng)該能正常啟動(dòng))
第六:從備份文件中恢復(fù)所有數(shù)據(jù)。
續(xù):
最近遇到了個(gè)讓人棘手的任務(wù)——修復(fù)一個(gè)失敗的InnoDB數(shù)據(jù)庫。這個(gè)數(shù)據(jù)庫因崩潰而無法啟動(dòng)。
第一步將InnoDB在force-recovery模式下開啟,此時(shí)InnoDB雖開啟了但是將忽略所有更新(UPDATEs)與插入(INSERTs)操作。
在/etc/my.cnf文件中添加此行:
innodb_force_recovery = 2
現(xiàn)在重啟數(shù)據(jù)庫:
/usr/local/bin/mysqld_safe &
(注意:如果MySQL沒有啟動(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ù)庫:
mysqladmin -uUSERNAME -pPASSWORD shutdown
刪除數(shù)據(jù)庫目錄。(注意:我的數(shù)據(jù)目錄在/usr/local/var下。你的設(shè)置有可能不同,確保刪除的是正確的文件夾。)
rm -fdr /usr/local/var
重建數(shù)據(jù)庫文件夾,安裝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ù)庫:
/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ù)庫過于系繁忙當(dāng)修復(fù)進(jìn)程正在進(jìn)行時(shí)。
以上是“如何修復(fù)MySQL數(shù)據(jù)庫”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當(dāng)前名稱:如何修復(fù)MySQL數(shù)據(jù)庫
文章來源:http://www.chinadenli.net/article12/gidhdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)公司、、關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)