MySQL數據庫備份[晏子]http://clyan.hongnet.com/index.html 在數據庫表丟失或損壞的情況下,備份你的數據庫是很重要的。如果發生系統崩潰,你肯定想能夠將你的表盡可能丟失最少的數據恢復到崩潰發生時的狀態。有時,正是MySQL管理員造成破壞。管理員已經知道表以破壞,用諸如vi或Emacs等編輯器試圖直接編輯它們,這對表絕對不是件好事! 備份數據庫兩個主要方法是用mysqldump程序或直接拷貝數據庫文件(如用cp、cpio或tar等)。每種方法都有其優缺點:
不管你使用哪種備份方法,如果你需要恢復數據庫,有幾個原則應該遵守,以確保最好的結果:
用于創建備份的技術同樣對拷貝數據庫到另一臺機器有用。最常見地,一個數據庫被轉移到了運行在另一臺主機上的服務器,但是你也可以將數據轉移到同一臺主機上的另一個服務器。 1 使用mysqldump備份和拷貝數據庫當你使用mysqldumo程序產生數據庫備份文件時,缺省地,文件內容包含創建正在傾倒的表的CREATE語句和包含表中行數據的INSERT語句。換句話說,mysqldump產生的輸出可在以后用作mysql的輸入來重建數據庫。 你可以將整個數據庫傾倒進一個單獨的文本文件中,如下: %mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02 輸出文件的開頭看起來象這樣: # MySQL Dump 6.0# # Host: localhostDatabase: samp_db#---------------------------------------# Server version 3.23.2-alpha-log## Table structure for table 'absence'#CREATE TABLE absence(student_id int(10) unsigned DEFAULT '0' NOT NULL,date date DEFAULT '0000-00-00' NOT NULL,PRIMARY KEY (student_id,date));## Dumping data for table 'absence'#INSERT INTO absence VALUES (3,'1999-09-03');INSERT INTO absence VALUES (5,'1999-09-03');INSERT INTO absence VALUES (10,'1999-09-08');...... 文件剩下的部分有更多的INSERT和CREATE TABLE語句組成。 如果你想壓縮備份,使用類似如下的命令: %mysqldump samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz 如果你要一個龐大的數據庫,輸出文件也將很龐大,可能難于管理。如果你愿意,你可以在mysqldump命令行的數據庫名后列出單獨的表名來傾到它們的內容,這將傾倒文件分成較小、更易于管理的文件。下例顯示如何將samp_db數據庫的一些表傾到進分開的文件中: %mysqldump samp_db student score event absence >grapbook.sql %mysqldump samp_db member president >hist-league.sql 如果你生成準備用于定期刷新另一個數據庫內容的備份文件,你可能想用--add-drop-table選項。這告訴服務器將DROP TABLE IF EXISTS語句寫入備份文件,然后,當你取出備份文件并把它裝載進第二個數據庫時,如果表已經存在,你不會得到一個錯誤。 如果你倒出一個數據庫以便能把數據庫轉移到另一個服務器,你甚至不必創建備份文件。要保證數據庫存在于另一臺主機,然后用管道傾倒數據庫,這樣mysql能直接讀取mysqldump的輸出。例如:你想從主機pit-viper.snake.net拷貝數據庫samp_db到boa.snake.net,可以這樣很容易做到: %mysqladmin -h boa.snake.net create samp_db %mysqldump samp_db | mysql -h boa.snake.net samp_db 以后,如果你想再次刷新boa.snake.net上的數據庫,跳過mysqladmin命令,但要對mysqldump加上--add-drop-table以避免的得到表已存在的錯誤: %mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db mysqldump其它有用的選項包括:
2 使用直接拷貝數據庫的備份和拷貝方法另一種不涉及mysqldump備份數據庫和表的方式是直接拷貝數據庫表文件。典型地,這用諸如cp、tar或cpio實用程序。本文的例子使用cp。 當你使用一種直接備份方法時,你必須保證表不在被使用。如果服務器在你則正在拷貝一個表時改變它,拷貝就失去意義。 保證你的拷貝完整性的最好方法是關閉服務器,拷貝文件,然后重啟服務器。如果你不想關閉服務器,要在執行表檢查的同時鎖定服務器。如果服務器在運行,相同的制約也適用于拷貝文件,而且你應該使用相同的鎖定協議讓服務器“安靜下來”。 假設服務器關閉或你已經鎖定了你想拷貝的表,下列顯示如何將整個samp_db數據庫備份到一個備份目錄(DATADIR表示服務器的數據目錄): %cd DATADIR%cp -r samp_db /usr/archive/mysql 單個表可以如下備份: %cd DATADIR/samp_db%cp member.* /usr/archive/mysql/samp_db%cp score.* /usr/archive/mysql/samp_db.... 當你完成了備份時,你可以重啟服務器(如果關閉了它)或釋放加在表上的鎖定(如果你讓服務器運行)。 要用直接拷貝文件把一個數據庫從一臺機器拷貝到另一臺機器上,只是將文件拷貝到另一臺服務器主機的適當數據目錄下即可。要確保文件是MyIASM格式或兩臺機器有相同的硬件結構,否則你的數據庫在另一臺主機上有奇怪的內容。你也應該保證在另一臺機器上的服務器在你正在安裝數據庫表時不訪問它們。 3 復制數據庫(Replicating Database)復制(Replication)類似于拷貝數據庫到另一臺服務器上,但它的確切含義是實時地保證兩個數據庫的完全同步。這個功能將在3.23版中出現,而且還不很成熟,因此本文不作詳細介紹。 4 用備份恢復數據數據庫損壞的發生有很多原因,程度也不同。如果你走運,你可能僅損壞一兩個表(如掉電),如果你倒霉,你可能必須替換整個數據目錄(如磁盤損壞)。在某些情況下也需要恢復,比如用戶錯誤地刪除了數據庫或表。不管這些倒霉事件的原因,你將需要實施某種恢復。 如果表損壞但沒丟失,嘗試用myisamchk或isamchk修復它們,如果這樣的損壞可有修復程序修復,你可能根本不需要使用備份文件。關于表修復的過程,見《數據庫維護與修復》。 恢復過程涉及兩種信息源:你的備份文件和個更新日志。備份文件將表恢復到實施備份時的狀態,然而一般表在備份與發生問題之間的時間內已經被修改,更新日志包含了用于進行這些修改的查詢。你可以使用日志文件作為mysql的輸入來重復查詢。這已正是為什么要啟用更新日志的原因。 恢復過程視你必須恢復的信息多少而不同。實際上,恢復整個數據庫比單個表跟容易,因為對于數據庫運用更新日志比單個表容易。 4.1 恢復整個數據庫首先,如果你想恢復的數據庫是包含授權表的mysql數據庫,你需要用--skip-grant-table選項運行服務器。否則,它會抱怨不能找到授權表。在你已經恢復表后,執行mysqladmin flush-privileges告訴服務器裝載授權標并使用它們。
ls命令生成更新日志文件的一個單列列表,根據服務器產生它們的次序排序(主意:如果你修改任何一個文件,你將改變排序次序,這導致更新日志一錯誤的次序被運用。) 很可能你會是運用某幾個更新日志。例如,自從你備份以來產生的更新日志被命名為update.392、update.393等等,你可以這樣重新運行: %mysql --one-database db_name < update.392 %mysql --one-database db_name < update.393 ..... 如果你正在實施恢復且使用更新日志恢復由于一個錯誤建議的DROP DATABASE、DROP TABLE或DELETE語句造成丟失的信息,在運用更新日志之前,要保證從其中刪除這些語句。 4.2 恢復單個表恢復單個表較為復雜。如果你用一個由mysqldump生成的備份文件,并且它不包含你感興趣的表的數據,你需要從相關行中提取它們并將它們用作mysql的輸入。這是容易的部分。難的部分是從只運用于該表的更新日志中拉出片斷。你會發覺mysql_find_rows實用程序對此很有幫助,它從更新日志中提取多行查詢。 另一個可能性是使用另一臺服務器恢復整個數據庫,然后拷貝你想要的表文件到原數據庫中。這可能真的很容易!當你將文件拷回數據庫目錄時,要確保原數據庫的服務器關閉。 |
溫馨提示:喜歡本站的話,請收藏一下本站!