適用對象: MySQL DB管理員.
適用條件: 對 Linux 環境有基礎的管理及操作能力.
文章附注: 本篇文章為自由文件,歡迎非商業性質轉載,並請注明出處!
商業性質轉載請來信告知!
特別注意: 1.本篇文章提供之程式及設定*不一定*符合您的環境,
請依您的系統環境適當地修改程式及設定.
2.在執行任何具破壞性的動作及行為前,
請確認您已作好完整可用的資料備份工作.
目錄內容
一.前言
二.錯誤修正
三.開始備份
四.如何回存
五.MySQL線上備份
一.前言
正當我在網上快樂的沖浪,在酷!學園快樂的灌口水時,竟蹦出一頁 "phpBB critical error",查詢 Database 出現錯誤的訊息,中斷了各學員在各系版唇槍舌戰,熱烈的討論,雖然過了不久,系統管理工友把網頁修好,但開始連續幾個星期,PHPBB 討論區有時還是很容易掛掉,頻率大約是一至二周一次,通常都是在周末大家最閒的時侯發生的,幸好此時剛好世界杯足球賽正好開打,不能到學園灌水,最少還有足球賽可以看.
當時修護的方式,是將 MySQL 服務停止,再把前一次可用的DB檔案蓋回去, 然後再重新啟動 MySQL 服務來測試 PHPBB 是否正常,這樣子的作法通常都有效,但總是會遺失某一段時間內的文章,這不是大家所希望的...
為了保存許多珍貴的資料和學園們惡心的口水,我開始著手准備 DB 的備份工作,准備重建這個有問題 DB ,更為將來校園的遷址作 DB 移轉准備.
(DB: Database的簡稱,以下都以 DB 取代 Database,PHPBB: 酷!學園討論區系統的軟體名稱)
二.錯誤修正
花了一些時間熟悉主機的環境後,我開始尋找錯誤在那裡...
檢測 MySQL 內 PHPBB 的 DB 後發現,有個 users 的 table 是有問題的,使用 myisamchk 嘗試去修護,發現還不行用預設方式修護,還要多加個 "-o"的參數才行,在使用 myisamchk 時,為避免還有用戶來存取 DB ,最好是能夠將 MySQL 服務停止,不然最少也要下個 "MySQLadmin flush-tables" 後,
再作 myisamchk 指令,像:
myisamchk -o PHPbb2_users.MYI
這個動作,可能要作個2'3次,直到沒有錯誤的訊息出現!
修護完,重新啟動 MySQL 服務後,就可以用 MySQL 這個 clIEnt 的指令,去 Query 一下 DB 內容,測試看是否正常.很幸運的,DB的部份在此時,運作是正常的.
當然,在你要備份之前,假如能先檢測資料是否正確,那是最好不過了, 假如有需要,可以把檢測的工作,排定在備份工作之前,但是記得,這個檢測DB 的動作不要排定在 DB 高用量的那段時間,深夜無人上線的時段是個不錯的選擇!
三.開始備份
phpBB 討論區的資料檔,主要有兩個部份,就是 php 主程式和 DB 內容,PHP 主程式的備份就比較簡單,只要把全部檔案 tar 起來就行了,就像:
tar cvfz phpbb2_20020601.tgz PHPbb
(上面的 phpbb 是指 phpBB 的 PHP 網頁程式存放目錄.)
以後有改到 phpBB 網頁程式部份再重新備份一次就行,它的內容資料都寫在DB 內,所以 PHP 程式檔部份異動性應該不大.
再來就是 MySQL DB 部份了,預設 MySQL 的 DB 檔案是存在 /var/lib/mysql 內,以 DB 名稱為目錄,目錄內就是該 DB 的所有資料,像 phpbb2 這個 DB,就是存在 /var/lib/MySQL/PHPbb2 內,在備份前,因為怕資料尚未完全寫入磁碟,而且 MySQL 會 Lock 在使用的 DB 檔案,所以應該是要先把 MySQL 先 Shutdown 一下,整個備份的程序可以下像下面的指令去完成:
/etc/rc.d/init.d/MySQLd stop tar cvfz phpbb2_db_20020601.tgz PHPbb2 /etc/rc.d/init.d/MySQLd start
(上面的 phpbb2 是指存放 PHPbb2 這個 DB 的目錄.)
Ok!這樣就完成了! (什麽?就這樣! 3行就結束了?!)
對!這樣就可以了! 不過要注意的是,怕 DB 內每個 Tables 間的資料有關關聯性,所以最好是把整個 DB 一次備起來,單獨只備哪個 Tables 的檔案,以後回存時,怕會有資料關聯不一致的問題!
以酷!學園的口水討論區為例,有21000筆左右的文章加上1200名注冊會員,資料庫整個 tar 起來大約30幾 MB 左右,每天備份,以一周為周期來計算,備份大約只需要(35*7=245) 200 多 MB 左右的空間,一星期的備份燒在一張光碟還夠!
四.如何回存
PHPBB 討論區的回存,只需把檔案解回原來存放網頁的路徑就可以,用以下指令解開:
tar xvfz PHPbb2_20020601.tgz
DB 發生錯誤而要回存時,其實也不難,先找出最近一次完整正常的備份,先把現在錯誤的網頁或 DB 先更名或 tar 起來,再把好的備份給解開回原來目錄位置就行了,需要注意的是, MySQL 服務最好也是要先停止,回存完成後再啟動服務,回存 DB 的整個程序可能像下面:
/etc/rc.d/init.d/MySQLd.stop mv phpbb2 phpbb2_error tar xvfz PHPbb2_db_20020601.tgz /etc/rc.d/init.d/MySQLd.start
然後再去測試一下網頁及資料庫! 看使用上是否正常就行了...
五.MySQL線上備份
使用像上面的"檔案"方式備份是個不錯的方法,它最少可以保持該主機某個時間點的完整檔案備份,但還是有一些問題需要考慮到,有些主機就不只建立一個 DB 而已,總不能為了備份某個 DB 而把整個MySQL 服務停止,備份檔案的方式,回存在原主機上一定適用,但假如 MySQL 版本升級,或是在那天,該網頁空間需遷機移機到別的主機時,那就沒人敢保證備出來的資料檔可以用,所以我們可以考慮另一種備份的方式,是使用MySQL 本身提供的功能: "MySQL Data Dump",指令是 "MySQLdump".