WIKI使用導(dǎo)航
站長(zhǎng)百科導(dǎo)航
站長(zhǎng)專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營(yíng)銷
- 虛擬主機(jī)管理系統(tǒng)
- 開放平臺(tái)
- WIKI程序與應(yīng)用
- 美國(guó)十大主機(jī)
Discuz:MySQL備份、優(yōu)化與故障處理
導(dǎo)航: 上一級(jí) | Discuz | 首頁 | PhpWind | 動(dòng)網(wǎng)論壇 | vBulletin | phpBB | MolyX | Discuz!NT
MySQL 是一種高效快速的中小型數(shù)據(jù)庫系統(tǒng),這套系統(tǒng)的讀寫速度,尤其是讀速度可以媲美和超過很多昂貴的商業(yè)數(shù)據(jù)庫系統(tǒng),同時(shí)其功能也完全可以滿足一般網(wǎng)絡(luò)應(yīng)用軟件的需要,適合為論壇等軟件構(gòu)建的數(shù)據(jù)庫支撐環(huán)境。Discuz! 的 MySQL 版本充分可以充分發(fā)揮該數(shù)據(jù)庫軟件的優(yōu)勢(shì),更加優(yōu)化的進(jìn)行數(shù)據(jù)庫操作,最大限度的保證了系統(tǒng)的穩(wěn)定。然而,在實(shí)際使用中,為了使得數(shù)據(jù)庫服務(wù)器運(yùn)行在最佳狀態(tài),您可能仍然需要做一些優(yōu)化,或在故障時(shí)進(jìn)行必要的維修操作。本文將對(duì) MySQL 系統(tǒng)的日常使用、常規(guī)優(yōu)化方案和故障恢復(fù)作以簡(jiǎn)要說明。
數(shù)據(jù)備份與恢復(fù)
- 最快的備份方法:直接文件復(fù)制
MySQL 的數(shù)據(jù)庫文件支持直接復(fù)制(Hot-copy),您在任意類型操作系統(tǒng)的服務(wù)器中將數(shù)據(jù)文件復(fù)制下來,拷貝到另外的一臺(tái)服務(wù)器的 MySQL 數(shù)據(jù)目錄,只要數(shù)據(jù)庫軟件版本不相差太多(例如不是 3.22 和 3.23/4.0),您可以立即直接使用復(fù)制過來的完整數(shù)據(jù)文件?;谶@種特性您可以使用最短的時(shí)間完成數(shù)據(jù)備份。
按照常見的安裝習(xí)慣,Unix 版本的 MySQL 數(shù)據(jù)目錄通常可能為(不限于下列):
/var/lib/mysql/ /usr/local/mysql/data/ /usr/local/mysql/var/
Windows 版本的 MySQL 數(shù)據(jù)目錄通??赡転椋ú幌抻谙铝校?
c:\mysql\data\ d:\mysql\data\ x:\mysql\data\
在數(shù)據(jù)目錄下,可能有多個(gè)以數(shù)據(jù)庫名命名的子目錄,將建議您在直接復(fù)制(Hot-copy)的時(shí)候盡量把數(shù)據(jù)庫服務(wù)器停止,這樣備份的數(shù)據(jù)會(huì)較少出錯(cuò)。如果不方便停止服務(wù)器,又恰好在某一文件的某一部分上,備份和數(shù)據(jù)庫服務(wù)器寫入同時(shí)進(jìn)行,則可能造成拷貝下來的數(shù)據(jù)文件存在錯(cuò)誤。但這種錯(cuò)誤通常不致命,可以經(jīng)過修復(fù)而恢復(fù),修復(fù)的方法將在后面的部分作以說明。
如果需要恢復(fù)某些數(shù)據(jù)表,只需先把數(shù)據(jù)庫停止,把備份的文件拷貝到原有的目錄中覆蓋即可。注意在 Unix 系統(tǒng)中,需要檢查覆蓋后的文件屬性和屬主,以免無法被 MySQL 讀取而報(bào)錯(cuò)。
本方法只適合擁有獨(dú)立服務(wù)器的用戶使用,虛擬主機(jī)用戶不在此列。
- 較快而安全的備份方法:mysqldump
MySQL 軟件本身提供了將數(shù)據(jù)內(nèi)容導(dǎo)出為 SQL 文件的工具——mysqldump。通過這一方法備份和恢復(fù),較直接文件復(fù)制來說更為安全,但速度慢一些,數(shù)據(jù)表大則更是如此。您可以在 MySQL 程序文件目錄找到備份使用的工具 mysqldump 及恢復(fù)使用的工具 mysql。按照常見的安裝習(xí)慣,Unix 版本的 MySQL 程序文件目錄通??赡転椋ú幌抻谙铝校?/p>
/usr/bin/ /usr/local/mysql/bin/
Windows 版本的 MySQL 程序文件目錄通??赡転椋ú幌抻谙铝校?
c:\mysql\bin\ d:\mysql\bin\ x:\mysql\bin\
備份和恢復(fù)的命令分別為(其中斜體字表示需要替換相關(guān)的內(nèi)容):
備份:mysqldump --force --add-drop-table --extended-insert -h"數(shù)據(jù)庫主機(jī)名" -u"用戶名" -p"密碼" "數(shù)據(jù)庫名" > 備份數(shù)據(jù)文件名 恢復(fù):mysql -h"數(shù)據(jù)庫主機(jī)名" -u"用戶名" -p"密碼" "數(shù)據(jù)庫名" < 備份數(shù)據(jù)文件名
Discuz! 在系統(tǒng)設(shè)置中已經(jīng)設(shè)計(jì)了此種備份模式(Shell 方式),速度與直接在服務(wù)器終端操作是完全一致的,但不需要記憶命令與參數(shù),只需通過 web 界面修改操作即可。此功能需要備份出,和恢復(fù)到的服務(wù)器上的 PHP 具有 Shell 權(quán)限,您可以嘗試一下即知。
- 兼容性最好的備份方法:Discuz! 分卷備份
早在 Discuz! 的初期版本就率先在論壇軟件中內(nèi)置了支持大量數(shù)據(jù)備份與恢復(fù)的分卷備份功能,此種方法雖然速度最慢,但具有良好的兼容性,可以在幾乎所有服務(wù)器環(huán)境,包括虛擬主機(jī)環(huán)境成功的備份大量數(shù)據(jù)。
分卷備份的使用簡(jiǎn)單,您只需在 Discuz! 系統(tǒng)設(shè)置中選擇分卷備份,按照提示進(jìn)行即可。
在進(jìn)行數(shù)據(jù)恢復(fù)時(shí),尤其是將備份的數(shù)據(jù)恢復(fù)到另外的服務(wù)器、或另外的數(shù)據(jù)庫中時(shí),您需要事先安裝一個(gè)與備份數(shù)據(jù)版本相同的空論壇,確保該空論壇使用和備份數(shù)據(jù)中相同的數(shù)據(jù)表前綴(即 config.inc.php 中的 $tablepre 設(shè)置),同時(shí)在設(shè)置管理員時(shí),使用與備份數(shù)據(jù)中相同的一個(gè)管理員用戶名、密碼和安全提問,這樣才能保證分卷備份數(shù)據(jù)的導(dǎo)入連貫和成功。
導(dǎo)入前,把備份數(shù)據(jù)文件完整的上傳到服務(wù)器論壇目錄中的 ./forumdata 下,在 系統(tǒng)設(shè)置 的 數(shù)據(jù)庫恢復(fù) 功能中選擇第一卷的文件名,點(diǎn)導(dǎo)入鏈接,之后相關(guān)的分卷數(shù)據(jù)會(huì)被自動(dòng)導(dǎo)入。
同時(shí)我們提供了一個(gè)數(shù)據(jù)庫恢復(fù)程序,詳情請(qǐng)見《Discuz!工具箱》里面的數(shù)據(jù)恢復(fù)工具。
常規(guī)優(yōu)化方案
- 建議使用的版本
通常情況下,Unix 類操作系統(tǒng)用戶可以直接使用 MySQL 官方提供的已經(jīng)編譯好的軟件包,可以避免可能的兼容性問題。如果對(duì)一些特殊參數(shù)有要求,也可以自行編譯源碼,但僅建議有豐富經(jīng)驗(yàn)的用戶使用,如果發(fā)現(xiàn)有不穩(wěn)定或不兼容現(xiàn)象,請(qǐng)檢查相關(guān)的編譯參數(shù)是否存在問題。
目前我們建議使用的 MySQL 版本為 4.0.x 版,相對(duì) 3.23 系列,4.0.x 同樣穩(wěn)定和安全,不僅提供了更多的功能、更好的兼容性,而且修復(fù)了很多 3.23 系列的 BUG。在 Windows 系統(tǒng)中,請(qǐng)使用 mysqld-nt(NT/2000/2003 系統(tǒng))作為服務(wù)器,mysqld-max-nt 只有在需要用到 bdb 等功能的時(shí)候才需要。
- 數(shù)據(jù)庫的常規(guī)優(yōu)化
MySQL 本身的配置文件 my.cnf(或 my.ini)中的相關(guān)參數(shù),對(duì)整個(gè)數(shù)據(jù)庫系統(tǒng)來說尤為重要。針對(duì)不同的服務(wù)器內(nèi)存容量,MySQL 程序包中提供了 my-small.cnf、my-medium.cnf、my-large.cnf、my-huge.cnf 四個(gè)分別適用于服務(wù)器內(nèi)存不低于 64M、256M、512M、1G 情況下的參數(shù)設(shè)置,您可以根據(jù)自身機(jī)器的實(shí)際情況,數(shù)據(jù)庫應(yīng)用所占比重,在上述四個(gè)文件中提供的參數(shù)基礎(chǔ)上對(duì)配置文件進(jìn)行修改。Unix 類系統(tǒng)用戶,建議將配置文件命名為 my.cnf 放置于 /etc 中。Windows 系統(tǒng)用戶直接在 Winmysqladmin.exe 中對(duì) my.ini 進(jìn)行修改即可。
除了以上默認(rèn)的配置文件提供的參數(shù)以外,通常情況您還需要在 [mysqld] 后修改或增加以下的參數(shù)以適應(yīng)大部分 web 應(yīng)用程序的需要:
1. 最大連接數(shù)為 600,以滿足一般應(yīng)用對(duì)連接數(shù)的需要:增加 max_connections = 600。根據(jù)我們的經(jīng)驗(yàn),500~1000 是較為合適的數(shù)值, 沒必要將其設(shè)置為超過 1000,那只會(huì)造成對(duì)資源的浪費(fèi)。 2. 不使用 innodb 和 bdb:增加兩行內(nèi)容,分別是 skip-innodb 和 skip-bdb。Discuz! 和大部分 web 應(yīng)用程序不需要使用此兩項(xiàng)功能, 因此將其關(guān)閉以節(jié)約內(nèi)存和磁盤空間,提高效率。 3. 連接超時(shí)時(shí)間 5,避免空閑進(jìn)程過多的內(nèi)存占用:增加 wait_timeout = 5。通過減少超時(shí)時(shí)間,使得使用 pconnect(長(zhǎng)期連接)的用戶在 利用其不需反復(fù)驗(yàn)證用戶名和密碼的同時(shí),避免打開過多的空閑進(jìn)程,減少內(nèi)存消耗。 4. 禁止端口連接:增加 skip-networking。如果使用 Unix 類操作系統(tǒng),數(shù)據(jù)庫和 httpd 在同一臺(tái)服務(wù)器,且不需要遠(yuǎn)程讀取數(shù)據(jù)庫,可增 設(shè)此項(xiàng)參數(shù),關(guān)閉默認(rèn)的 3306 端口,有效提禁止外部網(wǎng)絡(luò)未經(jīng)授權(quán)的訪問,避免端口被用以進(jìn)行 DDoS 攻擊。Windows 系統(tǒng)不需要(不能)增加這個(gè)參數(shù)。
其他參數(shù)的配置在此不詳述,如果您對(duì)服務(wù)器及 MySQL 數(shù)據(jù)庫有相當(dāng)?shù)牧私猓梢酝ㄟ^數(shù)據(jù)庫的日常運(yùn)行情況,有針對(duì)性的進(jìn)行修改。
- 數(shù)據(jù)表優(yōu)化(Optimize Table)
當(dāng)您的庫中刪除了大量的數(shù)據(jù)后,您可能會(huì)發(fā)現(xiàn)數(shù)據(jù)文件尺寸并沒有減小。這是因?yàn)閯h除操作后在數(shù)據(jù)文件中留下碎片所致。Discuz! 在系統(tǒng)數(shù)設(shè)置界面提供了數(shù)據(jù)表優(yōu)化的功能,可以去除刪除操作后留下的數(shù)據(jù)文件碎片,減小文件尺寸,加快未來的讀寫操作。您只要在做完批量刪除,或定期(如每一兩個(gè)月)進(jìn)行一次數(shù)據(jù)表優(yōu)化操作即可。
故障解決辦法
由于 MySQL 本身的讀寫及鎖定機(jī)制等方面的原因,與一些其他數(shù)據(jù)庫軟件一樣,在特殊情況下的極為頻繁讀寫時(shí),或在服務(wù)器掉電、死機(jī)等情況下,相關(guān)的數(shù)據(jù)文件可能會(huì)發(fā)生被損壞的情況,通??梢圆捎靡韵碌姆绞郊右越鉀Q。
- Discuz!修復(fù)工具
可以使用Discuz!工具箱里面修復(fù)數(shù)據(jù)表工具進(jìn)行修復(fù),詳情請(qǐng)見《Discuz!工具箱》。
這個(gè)工具能修復(fù)大多數(shù)常見的數(shù)據(jù)庫錯(cuò)誤,尤其是錯(cuò)誤號(hào)為 126、127 的錯(cuò)誤,對(duì) 145 錯(cuò)誤也可修復(fù),同時(shí)能對(duì)數(shù)據(jù)表在修復(fù)之后進(jìn)行優(yōu)化。如果一次修復(fù)不成功,可以嘗試多次,或?qū)?shù)據(jù)庫重啟后再試。
- myisamchk 修復(fù)工具
MySQL 自帶了專門用戶數(shù)據(jù)表檢查和修復(fù)的工具——myisamchk,當(dāng) repair.php 多次修復(fù)均無法成功時(shí),可以在服務(wù)器終端使用 myisamchk 進(jìn)行修復(fù)。在 MySQL 的程序文件目錄(見《數(shù)據(jù)備份與恢復(fù)》中的說明)可以找到這個(gè)工具。
常用的修復(fù)命令為 myisamchk -r 數(shù)據(jù)文件目錄/數(shù)據(jù)表名.MYI,如果 -r 參數(shù)不能奏效,可以先把數(shù)據(jù)文件備份(備份可使用直接文件復(fù)制的方式,詳見《數(shù)據(jù)備份與恢復(fù)》中的說明)后使用 -o 參數(shù)。
另外 MySQL 官方文檔中還提供了針對(duì)上面操作均無法奏效時(shí)的特殊辦法,如先清空重建數(shù)據(jù)表,然后再用備份的數(shù)據(jù)文件覆蓋等,這種特別復(fù)雜的情況用戶通常不會(huì)碰到,因此這里不再做過于深入的研究。
- 數(shù)據(jù)表經(jīng)常性損壞的解決方法
首先請(qǐng)確認(rèn)在服務(wù)器硬件不存在問題(如內(nèi)存工作不穩(wěn)定、散熱條件不好等),且使用中的操作系統(tǒng)版本也沒有相關(guān)的 BUG 報(bào)告或升級(jí)補(bǔ)丁。這種情況下,如果數(shù)據(jù)庫仍出現(xiàn)經(jīng)常性的損壞,請(qǐng)檢查是否 MySQL 的編譯方式或參數(shù)存在問題。通常情況下使用官方提供的編譯好的版本是比較穩(wěn)定的,可以長(zhǎng)期使用。如果您鐘愛自行編譯相關(guān)程序,請(qǐng)確認(rèn)您的語言編譯器(如 gcc)和配置的相關(guān)參數(shù)沒有導(dǎo)致不穩(wěn)定的因素。同時(shí),磁盤分區(qū)滿也可能是導(dǎo)致數(shù)據(jù)表經(jīng)常性損壞的原因。網(wǎng)上提供了一些問題的處理方法(英文),需要時(shí)可多參考,并針對(duì)您的具體服務(wù)器環(huán)境制定解決方案。