文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 參考手冊  /  ...  /  使用 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 來讀取到最後一個日誌檔,因為該選項是隱含的。

輸出檔案命名

不使用 --raw 時,mysqlbinlog 會產生文字輸出,而 --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 伺服器。

  • 備份的延遲與複本伺服器的延遲類似。