建立MySQL數(shù)據(jù)庫(kù)日常維護(hù)規(guī)范
相關(guān)文章:
如何進(jìn)行MySQL數(shù)據(jù)庫(kù)表的故障檢測(cè)
如何修復(fù)MySQL數(shù)據(jù)庫(kù)表
如何對(duì)MySQL數(shù)據(jù)庫(kù)表進(jìn)行鎖定
如何對(duì)MySQL數(shù)據(jù)庫(kù)日志文件進(jìn)行維護(hù)
建立一個(gè)數(shù)據(jù)庫(kù)表維護(hù)規(guī)范
在一個(gè)定期基礎(chǔ)而非等到問(wèn)題出現(xiàn)才實(shí)施數(shù)據(jù)庫(kù)表的檢查是一個(gè)好主意。應(yīng)該考慮到建立一個(gè)預(yù)防性維護(hù)的時(shí)間表,以協(xié)助自動(dòng)問(wèn)題,是你可以采取措施進(jìn)行修正:
執(zhí)行常規(guī)的數(shù)據(jù)庫(kù)備份并允許更新日志。
安排定期的常規(guī)表檢查。通過(guò)檢查表,將減少使用備份的機(jī)會(huì)。這個(gè)工作,在Windows下使用計(jì)劃任務(wù),Unix使用cron作業(yè)(一般從運(yùn)行服務(wù)器所示用的該帳號(hào)的crontab文件中調(diào)用),并且很容易實(shí)現(xiàn)。
例如,你作為mysql用戶運(yùn)行服務(wù)器,則可以從mysql的crontab文件中建立定期檢查。如果你不知道如何使用cron,應(yīng)使用下列命令查看相關(guān)的Unix手冊(cè)頁(yè):
$man cron $man crontab |
作為服務(wù)器啟動(dòng)前的系統(tǒng)引導(dǎo)期間檢查數(shù)據(jù)庫(kù)表。及其可能會(huì)因早期的崩潰而重新啟動(dòng)。如果這樣的花,數(shù)據(jù)庫(kù)表可能已被毀壞,應(yīng)該對(duì)它進(jìn)行徹底檢查。
創(chuàng)建一個(gè)適用于定期維護(hù)的腳本
為了運(yùn)行自動(dòng)的表檢查,可以編寫(xiě)一個(gè)腳本,將目錄改變?yōu)榉?wù)器數(shù)據(jù)目錄并對(duì)所有的數(shù)據(jù)庫(kù)表進(jìn)行myisamchk和isamchk。如果你只有MyISAM表或者只有ISAM表,則只需要其中一個(gè)程序,可以將無(wú)關(guān)的那個(gè)程序從腳本中注釋掉。
該教本可以被cron調(diào)用,或者在系統(tǒng)啟動(dòng)期間被調(diào)用。
為維護(hù)目的,你能使用myisamchk -s檢查桌子。-s,--silent選項(xiàng)使myisamchk和isamchk以沉默模式運(yùn)行,只有當(dāng)錯(cuò)誤出現(xiàn)時(shí),才僅僅打印消息。另外myisamchk支持--fast選項(xiàng),該選項(xiàng)允許程序跳過(guò)自上次檢查以來(lái)沒(méi)有被修改過(guò)的人和表。
1. 一個(gè)簡(jiǎn)單的腳本
例如,一個(gè)較為容易理解的簡(jiǎn)單腳本,它在服務(wù)器目錄中檢查所有表(DATADIR應(yīng)該修改成對(duì)應(yīng)你系統(tǒng)的合適的值):
#!/bin/sh |
2. 一個(gè)較為復(fù)雜的腳本
實(shí)用此腳本的一個(gè)潛在的問(wèn)題時(shí):如果有許多表,通配符模式‘*/*.MYI’和‘*/*.ISM’可能會(huì)由于“too many arguments(參數(shù)過(guò)多)”或者命令行超過(guò)shell允許的長(zhǎng)度而無(wú)法使用。腳本可以進(jìn)一步修改為(同樣,DATADIR修改為適合你系統(tǒng)上的值):
#!/bin/sh |
當(dāng)然你也可以在腳本中指定多個(gè)數(shù)據(jù)庫(kù)目錄。
3. 如何執(zhí)行腳本
假定你將腳本存為check_tables,應(yīng)該確保它是可執(zhí)行的,當(dāng)然建議你首先切換到專(zhuān)用戶mysql:
$su mysql |
手工執(zhí)行,檢測(cè)你的腳本是否有錯(cuò)誤:
$check_tables |
在理想情況下應(yīng)該沒(méi)有輸出結(jié)果。如果系統(tǒng)不支持外部鎖定,游客蒽那個(gè)服務(wù)器將在你檢查表時(shí)改變它。此時(shí),腳本可能會(huì)把實(shí)際沒(méi)有問(wèn)題的表報(bào)告呈有問(wèn)題的。如果系統(tǒng)能夠支持外部鎖定,則該問(wèn)題就不會(huì)出現(xiàn)。
#p#
在unix中用cron定期檢查表
以下將說(shuō)明如何建立腳本,使它通過(guò)cron并在系統(tǒng)啟動(dòng)期間執(zhí)行。在這小節(jié)的例子中,筆者假定把腳本安裝在/usr/local/mysql/bin中,你需要修改該過(guò)程來(lái)檢查每個(gè)服務(wù)器數(shù)據(jù)目錄中的表。你可以使用不同的check_tables拷貝來(lái)進(jìn)行,或者通過(guò)修改它來(lái)接受一個(gè)命令行參數(shù)進(jìn)行,該參數(shù)指定了想要檢查的數(shù)據(jù)目錄。
假定對(duì)mysql用戶從crontab文件中調(diào)用腳本check_tables。
1. 首先用該用戶的身份注冊(cè)
$su mysql |
2. 生成一個(gè)臨時(shí)文件,捕獲已經(jīng)調(diào)度的任務(wù)
$crontab –l>/tmp/entries |
3. 在生成的文件最后一行添加內(nèi)容
把這一行0 0 * * 0 /usr/local/mysql/bin/check_tables加到臨時(shí)文件的最后一行:
$echo “0 0 * * 0 /usr/local/mysql/bin/check_tables” >>/tmp/entries |
它告訴cron在每個(gè)星期日的凌晨0時(shí)運(yùn)行此選項(xiàng)。可以按要求改變時(shí)間或安排。有關(guān)這些選項(xiàng)的格式,參閱crontab的手冊(cè)頁(yè)。
4. 重新安排調(diào)度
$crontab /tmp/entries |
如果檢查后有任何信息,cron作業(yè)通常生成一個(gè)郵件消息給用戶。由于使用--silent選項(xiàng),只有表存在錯(cuò)誤時(shí),才會(huì)有輸出,也才會(huì)有郵件信息,因此不會(huì)產(chǎn)生大量無(wú)用郵件信息。(你現(xiàn)在應(yīng)該明白,腳本采用--silent選項(xiàng)的原因)
對(duì)于這樣定期的維護(hù),你的服務(wù)器最好支持外部鎖定,這樣在檢查表時(shí),就不會(huì)發(fā)生訪問(wèn)沖突的情況。如果無(wú)法做到這一點(diǎn),你最好在沒(méi)有用戶使用服務(wù)器的時(shí)候維護(hù),例如凌晨。
在系統(tǒng)啟動(dòng)期間檢查表
如果你使用的是BSD風(fēng)格的系統(tǒng),例如OpenBSD,F(xiàn)reeBSD等,并且已經(jīng)將服務(wù)器的啟動(dòng)命令增加到/etc/rc.local,要在啟動(dòng)期間檢查表,可以在啟動(dòng)服務(wù)器前從相應(yīng)的文件中調(diào)用check_tables。
如果對(duì)于使用Sytem V風(fēng)格的啟動(dòng)方法的系統(tǒng),例如,大多數(shù)的商業(yè)Unix系統(tǒng),其啟動(dòng)方法是從/etc/rc.d目錄之一調(diào)用mysql.server腳本,則在數(shù)據(jù)庫(kù)啟動(dòng)前檢查表的過(guò)程比較復(fù)雜,因?yàn)檫@些目錄中的腳本必須理解start和stop參數(shù)。
例如,象這樣編寫(xiě)腳本,取名mysql.check當(dāng)參數(shù)時(shí)start時(shí)調(diào)用check_tables,當(dāng)參數(shù)是stop時(shí)什么也不做:
#!/bin/sh |
現(xiàn)在你可以安裝mysql.check了,該過(guò)程類(lèi)似乎在第二章介紹的讓服務(wù)器自動(dòng)啟動(dòng)的安裝mysql.server的過(guò)程。必須給mysql.check一個(gè)運(yùn)行級(jí)目錄中較低的前綴號(hào),才能使它在mysql.server前運(yùn)行。例如,如果在運(yùn)行級(jí)目錄中以S99mysql.server連接到mysql.server,則應(yīng)該以S98mysql.check鏈接到mysql.check。
由于Linux集中了BSD和Sytem V系統(tǒng)的優(yōu)點(diǎn),所以,上面兩種方法完全適用于Linux。為了簡(jiǎn)便起見(jiàn),一般使用第一個(gè)方法。
【編輯推薦】