Mysql修復損壞表並寫腳本自動修復

  轉載請聯繫 [email protected]
 
腳本由來

     公司mysql服務器,其中一塊硬盤壞掉了,導致數據表不能更新。最後換上新的硬盤之後導致數據庫一些表損壞,不能更新、插入數據。就要修復表,但是表損 壞不止一個表,是很多表如果全部修復(數據庫很大需要很長的時間)那如果檢查整個庫在複製命令一個一個修復也浪費時間,最後寫個腳本修復數據庫。

    Mysql 數據庫 相信很多地方 都在用,在用的時候避免不了出現表的損壞,損壞之後我們就要修復。如果是單張表,我們使用命令輕易的修復。如果是其中 的一部分表那?最重要的是還不知道具體的那些表。如果 全庫修復那花費很長很長的時間。下面就是我寫的一個自動化修復腳本。

mysql 進程在一個寫入中被殺死、計算機意外關閉、硬件錯誤都能造成mysql表損壞 。
mysql 修復表的各種方法
1、mysqlcheck 進行表修復
使用mysqlcheck 命令對錶進行修復

 

#mysqlcheck -uuser -ppassword database  table  -c  #檢查單個表是否損壞
#mysqlcheck -uuser -ppassword database  -c  #檢查整個庫那些表損壞
首先檢查數據庫的那些表損壞,如果能定位到那張表損壞可以直接對錶修復

 

 #mysqlcheck -uuser -ppassword database  table  -r # 修復數據表
#mysqlcheck -uuser -ppassword database   -r # 修復整個數據庫
更多參數 查看 mysqlcheck –help
 
2、myisamchk 修復mysql表
 
Myisamchk是MyISAM表維護的一個非常實用的工具。可以使用myisamchk實用程序來獲得有關數據庫表的信息或檢查、修復、優化他們。myisamchk適用MyISAM表(對應.MYI和.MYD文件的表)。
Myisamchk 選項解釋

–debug=debug_options, -# debug_options
輸出調試記錄文件。debug_options字符串經常是’d:t:o,filename’。

–silent,-s
沉默模式。僅當發生錯誤時寫輸出。

–wait, -w
如果表被鎖定,不是提示錯誤終止,而是在繼續前等待到表被解鎖。
如果不使用–skip-external-locking,可以隨時使用myisamchk來檢查表。當檢查表時,所有嘗試更新表的客戶端將等待,直到myisamchk準備好可以繼續。
請注意如果用–skip-external-locking選項運行mysqld,只能用另一個myisamchk命令鎖定表。

–var_name=value
可以通過–var_name=value選項設置下面的變量:

–check, -c
檢查表的錯誤。如果你不明確指定操作類型選項,這就是默認操作。

–check-only-changed, -C
只檢查上次檢查後有變更的表。

–extend-check, -e
非常仔細地檢查表。如果表有許多索引將會相當慢。

–fast,-F
只檢查沒有正確關閉的表。

–force, -f
如果myisamchk發現表內有任何錯誤,則自動進行修復。

–information, -i
打印所檢查表的統計信息。

–medium-check, -m
比–extend-check更快速地進行檢查。只能發現99.99%的錯誤

–update-state, -U
將信息保存在.MYI文件中,來表示表檢查的時間以及是否表崩潰了。該選項用來充分利用–check-only-changed選項,
但如果mysqld服務器正使用表並且正用–skip-external-locking選項運行時不應使用該選項。

–read-only, -T
不要將表標記爲已經檢查。如果你使用myisamchk來檢查正被其它應用程序使用而沒有鎖定的表很有用

–backup, -B
將.MYD文件備份爲file_name-time.BAK

–character-sets-dir=path
字符集安裝目錄。

–correct-checksum
糾正表的校驗和信息。

–data-file-length=len, -D len
數據文件的最大長度

–extend-check,-e
進行修復,試圖從數據文件恢復每一行。一般情況會發現大量的垃圾行。不要使用該選項,除非你不顧後果。

–force, -f
覆蓋舊的中間文件(文件名類似tbl_name.TMD),而不是中斷

–keys-used=val, -k val
對於myisamchk,該選項值爲位值,說明要更新的索引。選項值的每一個二進制位對應表的一個索引,其中第一個索引對應位0。
選項值0禁用對所有索引的更新,可以保證快速插入。通過myisamchk -r可以重新激活被禁用的索引。

–parallel-recover, -p
與-r和-n的用法相同,但使用不同的線程並行創建所有鍵。

–quick,-q
不修改數據文件,快速進行修復。

–recover, -r
可以修復幾乎所有一切問題,除非唯一的鍵不唯一時(對於MyISAM表,這是非常不可能的情況)。如果你想要恢復表,
這是首先要嘗試的選項。如果myisamchk報告表不能用-r恢復,則只能嘗試-o。
在不太可能的情況下-r失敗,數據文件保持完好)。

–safe-recover, -o
使用一個老的恢復方法讀取,按順序讀取所有行,並根據找到的行更新所有索引樹。這比-r慢些,
但是能處理-r不能處理的情況。該恢復方法使用的硬盤空間比-r少。一般情況,你應首先用-r維修,如果-r失敗則用-o。

–sort-recover, -n
強制myisamchk通過排序來解析鍵值,即使臨時文件將可能很大。

–analyze,-a
分析鍵值的分佈。這通過讓聯結優化器更好地選擇表應該以什麼次序聯結和應該使用哪個鍵來改進聯結性能。
要想獲取分佈相關信息,使用myisamchk –description –verbose tbl_name命令或SHOW KEYS FROM tbl_name語句。

–sort-index, -S
以從高到低的順序排序索引樹塊。這將優化搜尋並且將使按鍵值的表掃描更快。

–set-auto-increment[=value], -A[value]
強制從給定值開始的新記錄使用AUTO_INCREMENT編號(或如果已經有AUTO_INCREMENT值大小的記錄,應使用更高值)。
如果未指定value,新記錄的AUTO_INCREMENT編號應使用當前表的最大值加上1。

–description, -d
打印出關於表的描述性信息。

檢查表
  [root@nagios test]# myisamchk -e wpusers.MYI
Checking MyISAM file: wpusers.MYI
Data records:       1   Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check data record references index: 2
- check data record references index: 3
- check records and index references

 

 

myisanchk修復表
  [root@nagios test]# myisamchk -r wpusers.MYI
- recovering (with sort) MyISAM-table ‘wpusers.MYI’
Data records: 1
- Fixing index 1
- Fixing index 2
- Fixing index 3

 

我只是加了一個參數,可以根據自己的需求添加參數。使用myisam --help參看詳細的參數

3、自動修復mysql 表腳本

 

 

#!/bin/bash
#This script edit by badboy connect [email protected]
#This script used by repair tables
mysql_host=localhost
mysql_user=root
mysql_pass=123456   #密碼如果帶特殊字符如分號可以這麼寫  root\;2010就可以了
database=test

tables=$(mysql -h$mysql_host -u$mysql_user -p$mysql_pass $database -A -Bse “show tables”)
for arg in $tables
do
check_status=$(mysql -h$mysql_host -u$mysql_user -p$mysql_pass $database -A -Bse “check table $arg” | awk ‘{ print $4 }’)
if [ "$check_status" = "OK" ]
then
echo “$arg is ok”
else
echo $(mysql -h$mysql_host -u$mysql_user -p$mysql_pass $database -A -Bse “repair table $arg”)

fi
echo $(mysql -h$mysql_host -u$mysql_user -p$mysql_pass $database -A -Bse “optimize table $arg”)
done

希望能幫助大家,如果文章中有錯誤的請指出 。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章