《MYSQL教程MySQL數(shù)據(jù)庫(kù)修復(fù)方法(MyISAM/InnoDB)》要點(diǎn):
本文介紹了MYSQL教程MySQL數(shù)據(jù)庫(kù)修復(fù)方法(MyISAM/InnoDB),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
在網(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ò)幾次這樣的情況.可能是一些異想不到的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)專(zhuān)用數(shù)據(jù)庫(kù)機(jī)器上,我們通常用:
?
max_connections = 200
wait_timeout = 100
?
試著重啟數(shù)據(jù)庫(kù)看看是否有幫助.
如果你被查詢(xún)弄的措手不及,需要連接數(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ù)將處于離線(xiàn)狀態(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ò)引起崩潰的查詢(xún),但是經(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í).MYSQL學(xué)習(xí)
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/6667.html