|
導讀數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應... 數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。 適用對象: MySQL DB管理員. 目錄內容
一.前言 前幾周,正當我在網上快樂的沖浪,在酷!學園快樂的灌口水時, 竟蹦出一頁 "phpBB critical error",查詢 Database 出現錯誤的訊息,中斷了各學員在各系版唇槍舌戰,熱烈的討論,雖然過了不久,系統管理工友把網頁修好,但開始連續幾個星期,phpBB 討論區有時還是很容易掛掉,頻率大約是 一至二周一次,通常都是在周末大家最閑的時侯發生的,幸好此時剛好世界杯足球賽正好開打,不能到學園灌水,最少還有足球賽可以看. 當時修護的方式,是將 MySQL 服務停止,再把前一次可用的DB檔案蓋回去, 然後再重新啟動 MySQL 服務來測試 phpBB 是否正常,這樣子的作法通常都有效, 但總是會遺失某一段時間內的文章,這不是大家所希望的... 為了保存許多珍貴的資料和學園們惡心的口水,我開始著手準備 DB 的備份 工作,準備重建這個有問題 DB ,更為將來校園的遷址作 DB 移轉準備. (DB: Database的簡稱,以下都以 DB 取代 Database, 二.錯誤修正 花了一些時間熟悉主機的環境後,我開始尋找錯誤在那里... 檢測 MySQL 內 phpBB 的 DB 後發現,有個 users 的 table 是有問題的, myisamchk -o phpbb2_users.MYI 這個動作,可能要作個2~3次,直到沒有錯誤的訊息出現! 修護完,重新啟動 MySQL 服務後,就可以用 mysql 這個 client 的指令, 去 Query 一下 DB 內容,測試看是否正常.很幸運的,DB的部份在此時, 運作是正常的. 當然,在你要備份之前,假如能先檢測資料是否正確,那是最好不過了, 假如有需要,可以把檢測的工作,排定在備份工作之前,但是記得,這個檢測DB 的動作不要排定在 DB 高用量的那段時間,深夜無人上線的時段是個不錯的選擇!
phpBB 討論區的資料檔,主要有兩個部份,就是 php 主程式和 DB 內容, 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 (上面的 phpbb2 是指存放 phpbb2 這個 DB 的目錄.) Ok!這樣就完成了! (什麼?就這樣! 3行就結束了?!) 對!這樣就可以了! 不過要注意的是,怕 DB 內每個 Tables 間的資料有關關聯性, 所以最好是把整個 DB 一次備起來,單獨只備哪個 Tables 的檔案,以後回存時, 怕會有資料關聯不一致的問題! 以酷!學園的口水討論區為例,有21000筆左右的文章加上1200名注冊會員,資料庫 [page_break] 四.如何回存 phpBB 討論區的回存,只需把檔案解回原來存放網頁的路徑就可以,用以下指令解開: tar xvfz phpbb2_20020601.tgz DB 發生錯誤而要回存時,其實也不難,先找出最近一次完整正常的備份,先把現在錯誤的網頁或 DB 先更名或 tar 起來,再把好的備份給解開回原來目錄位置就行了,需要注意的是, MySQL 服務最好也是要先停止,回存完成後再啟動服務,回存 DB 的整個程序 /etc/rc.d/init.d/mysqld.stop 然後再去測試一下網頁及資料庫! 看使用上是否正常就行了...
使用像上面的"檔案"方式備份是個不錯的方法,它最少可以保持該主機某個時間點的完整檔案備份,但還是有一些問題需要考慮到,有些主機就不只建立一個 DB 而已, 總不能為了備份某個 DB 而把整個 MySQL 服務停止,備份檔案的方式,回存在原主機上一定適用,但假如MySQL 版本升級,或是在那天,該網頁空間需遷機移機到別的主機時, 那就沒人敢保證備出來的資料檔可以用,所以我們可以考慮另一種備份的方式,是使用 MySQL 本身提供的功能: "MySQL Data Dump",指令是 "mysqldump". 使用 MySQL 的 Dump 功能可以把 DB 的"結構","資料"或"結構加資料" Dump 成 文字檔, mysqldump 指令提供的彈性很大,你可以選擇把整個 DB Dump 成一個檔, 或是每個 Table 為一個檔,甚至是把結構檔和資料分開儲存都可以. 檢測酷!學園的 phpBB 資料庫後發現,以結構加資料 Full Dump 成一個檔案, 檔案的大小大約也是30幾MB左右. 在 Dump 之前最好多下個 Flush-Logs 更新 LOG, 所以整個 Dump 的指令如下: mysqladmin -uroot -p flush-logs (phpbb2 是 DB 名稱, opt 是一個使用完整 Dump 參數) 再使用 time 指令去測試執行時間,這個30幾 MB 的 DB , Dump 出來竟只要15秒左右, Query 的速度還真是快,假如只是要單獨 Dump 某個 Table 時,只要在上面的指令後, 轉出符號 ">" 前加個 Table 名稱就可以,如只要 phpbb2_users 這個 Table 的 Dump 時, 只要下: mysqldump phpbb2 -uroot -p opt phpbb2_users > phpbb2_users_20020601.sql Dump 出來的檔案是個純文字檔,你可以用 tar 把它壓起來,以上面30幾 MB 的 DB 為例, 大約可以把檔案大小壓到1/3左右的大小,因為 Dump 出是文字檔,所有的資料都是以明文 顯示,所以必須注意一下備份檔保存的安全性,而且建議備份檔最好再另外儲存於異地以及其他易於保存的媒體上,像光碟片或磁帶,這樣的備份才有意義.
若要回存整個資料庫,只需將壓縮的備份檔還原成 Dump 的檔案,再用下面的指令回存: mysql phpbb2 -uroot -p < phpbb2_20020601.sql 這邊需注意的是,若建立備份時是以"opt"或"add-drop-table"為參數時,回存的動作是先將舊的 Table 先刪除,重建 Table 的結構後再把 Data 匯入,所以回存後, 所有的資料會回到你當時備份那個時間點,因此在回存資料時,可以考慮把現有錯誤或不完整的 DB 先備份一份下來,以備不時之需,或是拿來比對錯誤的地方在那里,當然你也可以把資料回存到另一個測試用的 DB 內,只要把上面指令的 DB 名稱改成你的測試用 DB 名稱即可. 使用這種回存方式, MySQL 服務不需停止,也不會動到其他正在使用的 DB ,在一些提供MySQL 服務的虛擬主機,可用這種方式作你自己的 DB 備份及回存. 另外,假如你是系統重建或是移機時,切需在新的 MySQL 內,新建一個空白 DB 後,才行作回存的工作,你可以用下面的指令建立: mysql -uroot -p -e "CREATE DATABASE phpbb2" (上面的phpbb2是你要新建的 DB 名稱) 另一種作法,先用 "mysql" 指令進入 "mysql client console", 然後再用: CREATE DATABASE phpbb2; 這樣就行了,記得尾端要加個 ";" 符號該行指令才會執行. [page_break] 七.開始排定備份 知道備份的方法之後,就可以把整個備份的動作作成一個 Scirpt ,指定 DB 相關參數後, 00 04 * * * /home/dbadmin/backup (backup 是 Script 的檔名) 排定的時間當然最好是夜間離峰時. (酷!學園常24hr都有人在線上)
目前這個 Script 在測試機上測試的效果還不錯,以酷!學園討論區的2萬多篇討論文章, DB 總大小有30幾 MB, 跑這個 Script 大約只需要30幾秒就完成,下面是以 time 指令測試數次計算的結果: [root@demo tmp]# time backup real 0m32.788s real 0m33.898s real 0m32.808s 測試機的硬體配備是Intel Celeron 600 + 256mb SDRAM, 作業系統是CLE Linux 1.0. 因為 Dump 備份的速度很快,大部份作 MySQL 的備份都是這樣作的,假如是大型大量的DB 環境時,就需要考慮以 Incremental 的備份方式,而 MySQL 本身也提供這種備份方式, 這種備份方式,一周作一次完整的備份,每天只要作異動作業檔(LOG)的備份就行,在備份的成本上,可以節省備份時間和儲存空間. 完成了備份的工作安排,現在又可以和學園們一起快樂的上網沖浪去了...
1.MySQL中文參考手冊 2.MySQL man page 3.Study-area - Shell和Shell Script
#!/bin/sh # # Database name # Database admins name # Database admins password # MySQL commands path # Backup date format # Path for backup files save to # Temp directorys name # Backup filess directory # Database tables list files name # Backup Type # # # # # cd .. # # cd .. # 全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!