為了發揮作用,備份必須定期排程。使用幾個工具可以在 MySQL 中進行完整備份(時間點的資料快照)。例如,MySQL Enterprise Backup 可以執行整個執行個體的實體備份,並進行最佳化以最小化額外負荷,並在備份 InnoDB
資料檔案時避免中斷;mysqldump 提供線上邏輯備份。本討論使用 mysqldump。
假設我們在星期日下午 1 點負載較低時,使用以下命令對所有資料庫中的所有 InnoDB
表格進行完整備份
$> mysqldump --all-databases --source-data --single-transaction > backup_sunday_1_PM.sql
mysqldump 產生的結果 .sql
檔案包含一組 SQL INSERT
陳述式,可用於稍後重新載入傾印的表格。
此備份作業會在傾印開始時取得所有表格的全域讀取鎖定(使用 FLUSH TABLES WITH READ LOCK
)。一旦取得此鎖定,就會讀取二進位日誌座標,並釋放鎖定。如果在發出 FLUSH
陳述式時執行長時間的更新陳述式,備份作業可能會暫停直到這些陳述式完成。之後,傾印會變成無鎖定,不會干擾表格上的讀取和寫入。
先前假設要備份的表格為 InnoDB
表格,因此 --single-transaction
使用一致的讀取,並保證 mysqldump 所看到的資料不會變更。(其他用戶端對 InnoDB
表格所做的變更,不會被 mysqldump 處理序看到。)如果備份作業包含非交易式表格,一致性要求它們在備份期間不能變更。例如,對於 mysql
資料庫中的 MyISAM
表格,在備份期間不得對 MySQL 帳戶進行管理變更。
完整備份是必要的,但建立它們並不總是方便。它們會產生大型備份檔案,並且需要時間才能產生。它們並非最佳,因為每次連續的完整備份都包含所有資料,即使是自上次完整備份以來未變更的部分。進行初始完整備份,然後進行增量備份更有效率。增量備份較小,且產生所需時間較短。取捨之處在於,在還原時,您無法僅透過重新載入完整備份來還原資料。您還必須處理增量備份才能還原增量變更。
為了進行增量備份,我們需要儲存增量變更。在 MySQL 中,這些變更以二進位日誌表示,因此 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 二進位日誌,並讓傾印檔案包含新的目前二進位日誌的名稱
$> mysqldump --single-transaction --flush-logs --source-data=2 \
--all-databases > backup_sunday_1_PM.sql
執行此命令後,資料目錄會包含新的二進位日誌檔案 gbichot2-bin.000007
,因為 --flush-logs
選項會導致伺服器清除其日誌。--source-data
選項會導致 mysqldump 將二進位日誌資訊寫入其輸出,因此產生的 .sql
傾印檔案會包含這些行
-- Position to start replication or point-in-time recovery from
-- CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='gbichot2-bin.000007',SOURCE_LOG_POS=4;
由於 mysqldump 命令進行了完整備份,這些行表示兩件事
傾印檔案包含寫入
gbichot2-bin.000007
二進位日誌檔案或更高版本之前所做的所有變更。備份後記錄的所有資料變更都不會出現在傾印檔案中,但會出現在
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 二進位日誌會佔用磁碟空間。為了釋放空間,請不時清除它們。一種方法是刪除不再需要的二進位日誌,例如當我們進行完整備份時。
$> mysqldump --single-transaction --flush-logs --source-data=2 \
--all-databases --delete-source-logs > backup_sunday_1_PM.sql
如果您的伺服器是複寫來源伺服器,使用 mysqldump --delete-source-logs
刪除 MySQL 二進位日誌可能會很危險,因為副本可能尚未完全處理二進位日誌的內容。PURGE BINARY LOGS
陳述式的描述說明在刪除 MySQL 二進位日誌之前應驗證的事項。請參閱 第 15.4.1.1 節,「PURGE BINARY LOGS 陳述式」。