預設情況下,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 伺服器。
備份的延遲與複本伺服器的延遲類似。