預設情況下,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
一起使用很有用
--stop-never
:在到達最後一個日誌檔案的結尾後保持連線到伺服器,並繼續讀取新事件。--connection-server-id=
:當 mysqlbinlog 連接到伺服器時,回報的伺服器 ID。當使用id
--stop-never
時,預設回報的伺服器 ID 為 1。如果這與副本伺服器或其他 mysqlbinlog 程序的 ID 發生衝突,請使用--connection-server-id
來指定替代的伺服器 ID。請參閱 第 6.6.9.4 節,「指定 mysqlbinlog 伺服器 ID」。--result-file
:輸出檔案名稱的前綴,如稍後所述。
靜態與即時備份
若要使用 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.000130
到binlog.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
,則第一個命令不會讀取它,但第二個命令會讀取。若要製作即時備份,其中 mysqlbinlog 從
binlog.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 用於備份與還原
下列範例描述一個簡單的情境,說明如何一起使用 mysqldump 和 mysqlbinlog 來備份伺服器的資料和二進制日誌,以及如何在發生資料遺失時,使用備份還原伺服器。範例假設伺服器在主機 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 伺服器。
備份的延遲時間與副本伺服器的延遲時間類似。