文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  使用 mysqlbinlog 備份二進制日誌檔案

6.6.9.3 使用 mysqlbinlog 備份二進制日誌檔案

預設情況下,mysqlbinlog 會讀取二進制日誌檔案,並以文字格式顯示其內容。這可讓您更輕鬆地檢查檔案中的事件,並重新執行它們(例如,使用輸出作為 mysql 的輸入)。mysqlbinlog 可以直接從本機檔案系統讀取日誌檔案,或者使用 --read-from-remote-server 選項,它可以連線到伺服器並從該伺服器請求二進制日誌內容。mysqlbinlog 會將文字輸出寫入其標準輸出,或者寫入以 --result-file=file_name 選項的值命名的檔案(如果已指定該選項)。

mysqlbinlog 備份功能

mysqlbinlog 可以讀取二進制日誌檔案,並寫入包含相同內容的新檔案 — 也就是說,以二進制格式而不是文字格式。此功能可讓您輕鬆地以原始格式備份二進制日誌。mysqlbinlog 可以進行靜態備份,備份一組日誌檔案,並在到達最後一個檔案的結尾時停止。它也可以進行連續(即時)備份,在到達最後一個日誌檔案的結尾時保持連線到伺服器,並繼續複製產生的新事件。在連續備份操作中,mysqlbinlog 會執行直到連線結束(例如,當伺服器結束時)或 mysqlbinlog 強制終止時。當連線結束時,mysqlbinlog 不會等待並重試連線,這與複寫伺服器不同。若要在伺服器重新啟動後繼續即時備份,您也必須重新啟動 mysqlbinlog

重要

mysqlbinlog 可以備份加密和未加密的二進制日誌檔案。但是,使用 mysqlbinlog 產生的加密二進制日誌檔案副本會以未加密的格式儲存。

mysqlbinlog 備份選項

二進制日誌備份至少需要您使用兩個選項來呼叫 mysqlbinlog

  • --read-from-remote-server (或 -R) 選項會告知 mysqlbinlog 連線到伺服器並請求其二進制日誌。(這類似於複寫伺服器連線到其複寫來源伺服器。)

  • --raw 選項會告知 mysqlbinlog 寫入原始(二進制)輸出,而不是文字輸出。

除了 --read-from-remote-server 之外,通常還會指定其他選項:--host 表示伺服器執行的位置,您可能也需要指定連線選項,例如 --user--password

其他幾個選項與 --raw 一起使用很有用

靜態與即時備份

若要使用 mysqlbinlog 備份伺服器的二進制日誌檔案,您必須指定伺服器上實際存在的檔案名稱。如果您不知道名稱,請連線到伺服器並使用 SHOW BINARY LOGS 陳述式來查看目前的名稱。假設該陳述式產生此輸出:

mysql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000130 |     27459 | No        |
| binlog.000131 |     13719 | No        |
| binlog.000132 |     43268 | No        |
+---------------+-----------+-----------+

有了這些資訊,您可以使用 mysqlbinlog 將二進制日誌備份到目前目錄,如下所示(在單行上輸入每個命令):

  • 若要製作 binlog.000130binlog.000132 的靜態備份,請使用下列其中一個命令:

    mysqlbinlog --read-from-remote-server --host=host_name --raw
      binlog.000130 binlog.000131 binlog.000132
    
    mysqlbinlog --read-from-remote-server --host=host_name --raw
      --to-last-log binlog.000130

    第一個命令明確指定每個檔案名稱。第二個命令僅命名第一個檔案,並使用 --to-last-log 讀取到最後一個檔案。這些命令之間的一個區別是,如果伺服器碰巧在 mysqlbinlog 到達 binlog.000132 的末尾之前開啟了 binlog.000133,則第一個命令不會讀取它,但第二個命令會讀取。

  • 若要製作即時備份,其中 mysqlbinlogbinlog.000130 開始複製現有的日誌檔案,然後保持連線以複製伺服器產生新事件時的事件:

    mysqlbinlog --read-from-remote-server --host=host_name --raw
      --stop-never binlog.000130

    使用 --stop-never,不需要指定 --to-last-log 來讀取到最後一個日誌檔案,因為該選項是隱含的。

輸出檔案命名

如果沒有 --rawmysqlbinlog 會產生文字輸出,並且如果指定了 --result-file 選項,則指定所有輸出寫入的單一檔案名稱。使用 --raw 時,mysqlbinlog 會為從伺服器傳輸的每個日誌檔案寫入一個二進制輸出檔案。預設情況下,mysqlbinlog 會以與原始日誌檔案相同的名稱,將檔案寫入目前的目錄。若要修改輸出檔案名稱,請使用 --result-file 選項。結合 --raw--result-file 選項值會被視為修改輸出檔案名稱的前綴。

假設伺服器目前有二進制日誌檔案,名稱為 binlog.000999 及以上。如果您使用 mysqlbinlog --raw 來備份檔案,--result-file 選項會產生如下表所示的輸出檔案名稱。您可以透過以目錄路徑開頭 --result-file 值,將檔案寫入特定目錄。如果 --result-file 值僅由目錄名稱組成,則該值必須以路徑名稱分隔符號字元結尾。如果輸出檔案存在,則會覆寫它們。

--result-file 選項 輸出檔案名稱
--result-file=x xbinlog.000999 及以上
--result-file=/tmp/ /tmp/binlog.000999 及以上
--result-file=/tmp/x /tmp/xbinlog.000999 及以上
範例:mysqldump + mysqlbinlog 用於備份與還原

下列範例描述一個簡單的情境,說明如何一起使用 mysqldumpmysqlbinlog 來備份伺服器的資料和二進制日誌,以及如何在發生資料遺失時,使用備份還原伺服器。範例假設伺服器在主機 host_name 上執行,而其第一個二進制日誌檔案名稱為 binlog.000999。在單行上輸入每個命令。

使用 mysqlbinlog 來製作二進制日誌的持續備份:

mysqlbinlog --read-from-remote-server --host=host_name --raw
  --stop-never binlog.000999

使用 mysqldump 建立一個傾印檔案,作為伺服器資料的快照。使用 --all-databases--events--routines 來備份所有資料,並使用 --source-data=2 將目前的二進制日誌座標包含在傾印檔案中。

mysqldump --host=host_name --all-databases --events --routines --source-data=2> dump_file

定期執行 mysqldump 命令以建立更新的快照(視需要)。

如果發生資料遺失(例如,如果伺服器意外退出),請使用最新的傾印檔案來還原資料:

mysql --host=host_name -u root -p < dump_file

然後使用二進制日誌備份,重新執行傾印檔案中列出的座標之後寫入的事件。假設檔案中的座標如下所示:

-- CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='binlog.001002', SOURCE_LOG_POS=27284;

如果最近備份的日誌檔案名稱為 binlog.001004,則以這種方式重新執行日誌事件:

mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004
  | mysql --host=host_name -u root -p

您可能會發現將備份檔案(傾印檔案和二進制日誌檔案)複製到伺服器主機,以便更容易執行還原操作,或者如果 MySQL 不允許遠端 root 存取。

mysqlbinlog 備份限制

使用 mysqlbinlog 進行二進制日誌備份受限於以下限制:

  • 如果連線遺失(例如,如果發生伺服器重新啟動或網路中斷),mysqlbinlog 不會自動重新連線到 MySQL 伺服器。

  • 備份的延遲時間與副本伺服器的延遲時間類似。