《MYSQL教程MySQL數(shù)據(jù)庫修復(fù)方法(MyISAM/InnoDB)》要點(diǎn):
本文介紹了MYSQL教程MySQL數(shù)據(jù)庫修復(fù)方法(MyISAM/InnoDB),希望對您有用。如果有疑問,可以聯(lián)系我們。
在網(wǎng)上找了篇MySQL的技術(shù)文章,感覺不錯,把它翻譯過來共享下.
?
原文作者:Mike Peters
?
我整理了7條修復(fù)MySQL數(shù)據(jù)庫的方法,當(dāng)簡單的重啟對數(shù)據(jù)庫不起作用,或者有表崩潰時.
?
簡單的MySQL重啟:
?
/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown
/usr/local/mysql/bin/mysqld_safe &?
?
1、MyISAM表崩潰?
?
MySQL數(shù)據(jù)庫允許不同的表使用不同的存儲引擎.它用來存儲與檢索數(shù)據(jù).較流行的存儲引擎是MyISAM與InnoDB.
?
MyISAM表最終“將”崩潰.這是個不爭的事實(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)你瀏覽日志文件時,才知道MyISAM表崩潰了.
我強(qiáng)烈建議在你的/etc/my.cnf配置文件中添加此行.一旦表崩潰它將進(jìn)行自動修復(fù).
?
[mysqld]
myisam-recover=backup,force
?
如果這個也不管用,還有其他的方法可以試試.?
?
2、多實(shí)例MySQL?
?
當(dāng)你重啟MySQL后,進(jìn)程馬上死掉,這很常見.
查看日志文件,它會告訴你,另一個MySQL實(shí)例可能正在運(yùn)行.
?
停止所有MySQL實(shí)例:
?
/usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown
killall mysql
killall mysqld
?
現(xiàn)在重啟數(shù)據(jù)庫,將只有一個實(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ù)庫將不能啟動.?
?
4、MySQL host表丟失?
?
有見過幾次這樣的情況.可能是一些異想不到的MyISAM bug.
?
輕松將其修復(fù)如下:
?
/usr/local/bin/mysql_install_db?
?
5、不正常的MyISAM自動增長(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ù).不要癡狂的增加這個數(shù)字,否則你會把你的整臺機(jī)器搞崩.
?
在一臺專用數(shù)據(jù)庫機(jī)器上,我們通常用:
?
max_connections = 200
wait_timeout = 100
?
試著重啟數(shù)據(jù)庫看看是否有幫助.
如果你被查詢弄的措手不及,需要連接數(shù)據(jù)庫進(jìn)行表修改操作,那么在/etc/my.cnf文件中設(shè)置一個不同的端口號,開啟數(shù)據(jù)庫,進(jìn)行修改操作.然后將端口修改回來(master-port = 3306)再重啟.?
?
7、InnoDB表崩潰?
?
InnoDB表是我最鐘愛的.事物緩存,可靠,不像MyISAM,InnoDB支持對同一表的并發(fā)寫.
?
InnoDB的內(nèi)部恢復(fù)機(jī)制也相當(dāng)不錯.如果數(shù)據(jù)庫崩潰,InnoDB將嘗試進(jìn)行修復(fù),通過從最后一個時間戳開始運(yùn)行日志文件.大多數(shù)情況都會成功,整個過程是透明的.
?
不過,如果InnoDB自行修復(fù)失敗,那么“整個”數(shù)據(jù)庫將不能啟動.MySQL將會發(fā)出一個錯誤信息并退出,你的整個庫將處于離線狀態(tài).你可以不斷嘗試重啟數(shù)據(jù)庫,但是如果修復(fù)進(jìn)程失敗,數(shù)據(jù)庫將拒絕啟動.
?
這就是為什么需要運(yùn)行master/master當(dāng)使用InnoDB時――當(dāng)一個master宕掉時,還有一臺冗余master做后備.
?
在繼續(xù)操作前,先瀏覽下MySQL的日志文件,確定數(shù)據(jù)庫不是因?yàn)镮nnoDB表的崩潰而崩潰.
?
有一種方法是更新InnoDB的日志文件計(jì)數(shù)器以跳過引起崩潰的查詢,但是經(jīng)驗(yàn)告訴我們這不是個好方法.這種情況下,將造成數(shù)據(jù)的不一致性而且會經(jīng)常使主從復(fù)制中斷.
?
一旦因InnoDB崩潰造成數(shù)據(jù)庫無法啟動,你就應(yīng)該按如下五個步驟處理問題:
?
第一:添加此行到/etc/my.cnf文件中:
?
[mysqld]
innodb_force_recovery = 4
?
第二:重啟MySQL.你的數(shù)據(jù)庫現(xiàn)在將啟動,但是在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)該能正常啟動)
?
第六:從備份文件中恢復(fù)所有數(shù)據(jù).
?
續(xù):
最近遇到了個讓人棘手的任務(wù)――修復(fù)一個失敗的InnoDB數(shù)據(jù)庫.這個數(shù)據(jù)庫因崩潰而無法啟動.
?
第一步將InnoDB在force-recovery模式下開啟,此時InnoDB雖開啟了但是將忽略所有更新(UPDATEs)與插入(INSERTs)操作.
?
在/etc/my.cnf文件中添加此行:
?
innodb_force_recovery = 2
?
現(xiàn)在重啟數(shù)據(jù)庫:
?
/usr/local/bin/mysqld_safe &
?
(注意:如果MySQL沒有啟動,繼續(xù)增加 innodb_force_recovery 的數(shù)值直到將參數(shù)值設(shè)為8( innodb_force_recovery =)
?
將所有數(shù)據(jù)保存到臨時文件alldb.sql(下個命令需要花一定時間):
?
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)入所有備份文件(下一命令需要花一段時間):
?
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)行時.MYSQL學(xué)習(xí)
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/6667.html