top
Loading...
5.9.2.1.備份策略
5.9.2.1. 備份策略

我們都知道必須按計劃定期進行備份。可以用幾個工具完全備份(在某個時間點的數據快照)MySQL。例如,InnoDB Hot BackupInnoDB數據文件提供在線非數據塊物理備份,mysqldump提供在線邏輯備份。這里使用mysqldump

假定我們在星期日下午1點進行了備份,此時負荷較低。下面的命令可以完全備份所有數據庫中的所有InnoDB表:

shell> mysqldump --single-transaction --all-databases > backup_sunday_1_PM.sql

這是在線非塊備份,不會干擾對表的讀寫。我們以前假定我們的表為InnoDB表,因此--single-transaction使用一致性地讀,并且保證mysqldump所看見的數據不會更改。(其它客戶端對InnoDB表進行的更改不會被mysqldump進程看見)如果我們還有其它類型的表,我們必須假定在備份過程中它們不會更改。例如,對于mysql數據庫中的MyISAM,我們必須假定在備份過程中沒有對MySQL賬戶進行管理更改。

mysqldump命令產生的.sql文件包含一系列SQL INSERT語句,可以用來重載轉儲的表。

需要進行完全備份,但有時不方便。會產生大的備份文件并需要花時間來生成。從某個角度,完全備份并不理想,因為每個成功的完全備份包括所有數據,甚至自從上一次完全備份以來沒有更改的部分。完成了初使完全備份后,進行增量備份會更有效。這樣備份文件要小得多,備份時間也較短。不利之處是,恢復時不能只重載完全備份來恢復數據。還必須要用增量備份來恢復增量更改。

要想進行增量備份,我們需要保存增量更改。應使用--log-bin選項啟動MySQL服務器,以便更新數據時將這些更改保存到文件中。該選項啟用二進制日志,因此服務器寫將每個更新數據的SQL語句寫入MySQL二進制日志。讓我們看看用--log-bin選項啟動的已經運行多日的MySQL服務器的數據目錄。我們找到以下MySQL二進制日志文件:

-rw-rw---- 1 guilhem  guilhem   1277324 Nov 10 23:59 gbichot2-bin.000001
-rw-rw---- 1 guilhem  guilhem         4 Nov 10 23:59 gbichot2-bin.000002
-rw-rw---- 1 guilhem  guilhem        79 Nov 11 11:06 gbichot2-bin.000003
-rw-rw---- 1 guilhem  guilhem       508 Nov 11 11:08 gbichot2-bin.000004
-rw-rw---- 1 guilhem  guilhem 220047446 Nov 12 16:47 gbichot2-bin.000005
-rw-rw---- 1 guilhem  guilhem    998412 Nov 14 10:08 gbichot2-bin.000006
-rw-rw---- 1 guilhem  guilhem       361 Nov 14 10:07 gbichot2-bin.index

每次重啟,MySQL服務器用序列中的下一個編號創建一個新的二進制日志文件。當服務器運行時,你還可以通過執行FLUSH LOGS SQL語句或mysqladmin flush-logs命令,告訴服務器關閉當前的二進制日志文件并創建一個新文件。mysqldump也有一個選項來清空日志。數據目錄中的.index文件包含該目錄下所有MySQL二進制日志的清單。該文件用于復制。

恢復時MySQL二進制日志很重要,因為它們是增量備份。如果進行完全備份時確保清空了日志,則后面創建的二進制日志文件包含了備份后的所有數據更改。讓我們稍稍修改前面的mysqldump命令,讓它在完全備份時能夠清空 MySQL二進制日志,以便轉儲文件包含包含新的當前的二進制日志:

shell> mysqldump --single-transaction --flush-logs --master-data=2
           --all-databases > backup_sunday_1_PM.sql

執行該命令后,數據目錄則包含新的二進制日志文件,gbichot2-bin.000007。結果.sql文件包含下列行:

-- Position to start replication or point-in-time 恢復時y from
-- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;

因為mysqldump命令可以執行完全備份,這些行表示兩件事情:

·         .sql文件包含所有寫入gbichot2-bin.000007二進制日志文件或最新的文件之前的更改。

·         備份后所記錄的所有數據更改不出現在.sql中,但出現在gbichot2-bin.000007二進制日志文件或最新的文件中。

在星期一下午1點,我們可以清空日志開始新的二進制日志文件來創建增量備份。例如,執行mysqladmin flush-logs命令創建gbichot2-bin.000008。星期日下午1點的完全備份和星期一下午1點之間的所有更改為文件gbichot2-bin.000007。該增量備份很重要,因此最好將它復制到安全的地方。(例如,備份到磁帶或DVD上,或復制到另一臺機器上)在星期二下午1點,執行另一個mysqladmin flush-logs命令。星期一下午1點和星期二下午1點之間的所有所有更改為文件gbichot2-bin.000008(也應復制到某個安全的地方)

MySQL二進制日志占據硬盤空間。要想釋放空間,應隨時清空。操作方法是刪掉不再使用的二進制日志,例如進行完全備份時:

shell> mysqldump --single-transaction --flush-logs --master-data=2
           --all-databases --delete-master-logs > backup_sunday_1_PM.sql

釋:如果你的服務器為復制主服務器,用mysqldump --delete-master-logs刪掉MySQL二進制日志很危險,因為從服務器可能還沒有完全處理該二進制日志的內容。

PURGE MASTER LOGS語句的描述中解釋了為什么在刪掉MySQL二進制日志之前應進行確認。參見13.6.1.1節,“PURGE MASTER LOGS語法”。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html
北斗有巢氏 有巢氏北斗