文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  建立備份策略

9.3.1 建立備份策略

為了發揮作用,備份必須定期排程。使用幾個工具可以在 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 陳述式」