本節說明使用二進位日誌執行時間點復原的一般概念。下一節,第 9.5.2 節,「使用事件位置進行時間點復原」,將透過範例詳細說明操作。
本節和下一節中的許多範例都使用 mysql 用戶端來處理 mysqlbinlog 產生的二進位日誌輸出。如果您的二進位日誌包含 \0
(null) 字元,則除非您使用 --binary-mode
選項來叫用它,否則 mysql 無法剖析該輸出。
時間點復原的資訊來源是在完整備份操作之後產生的一組二進位日誌檔案。因此,為了允許將伺服器還原到時間點,必須在其上啟用二進位日誌記錄,這是 MySQL 8.4 的預設設定 (請參閱 第 7.4.4 節,「二進位日誌」)。
若要從二進位日誌還原資料,您必須知道目前二進位日誌檔案的名稱和位置。依預設,伺服器會在資料目錄中建立二進位日誌檔案,但可以使用 --log-bin
選項指定路徑名稱,將檔案放置在不同的位置。若要查看所有二進位日誌檔案的清單,請使用此陳述式
mysql> SHOW BINARY LOGS;
若要判斷目前二進位日誌檔案的名稱,請發出下列陳述式
mysql> SHOW BINARY LOG STATUS;
mysqlbinlog 工具會將二進位日誌檔案中的事件從二進位格式轉換為文字格式,以便可以檢視或套用。 mysqlbinlog 提供選項,可根據事件時間或事件在日誌中的位置選取二進位日誌的區段。請參閱 第 6.6.9 節,「mysqlbinlog — 處理二進位日誌檔案的工具」。
套用二進位日誌中的事件會導致重新執行它們所代表的資料修改。這使得能夠復原給定時間跨度的資料變更。若要套用二進位日誌中的事件,請使用 mysql 用戶端處理 mysqlbinlog 輸出
$> mysqlbinlog binlog_files | mysql -u root -p
如果二進位日誌檔案已加密,mysqlbinlog 無法像上一個範例一樣直接讀取它們,但可以使用 --read-from-remote-server
(-R
) 選項從伺服器讀取它們。例如
$> mysqlbinlog --read-from-remote-server --host=host_name --port=3306 --user=root --password --ssl-mode=required binlog_files | mysql -u root -p
在此,已使用 --ssl-mode=required
選項來確保二進位日誌檔案中的資料在傳輸過程中受到保護,因為它是以未加密的格式傳送至 mysqlbinlog 的。
VERIFY_CA
和 VERIFY_IDENTITY
是 SSL 模式比 REQUIRED
更好的選擇,因為它們有助於防止中間人攻擊。若要實作這些設定之一,您必須先確保伺服器的 CA 憑證在您的環境中可供所有使用它的用戶端可靠地使用,否則會導致可用性問題。請參閱 加密連線的命令選項。
當您需要判斷事件時間或位置以在執行事件之前選取部分日誌內容時,檢視日誌內容可能會很有用。若要檢視日誌中的事件,請將 mysqlbinlog 輸出傳送到分頁程式中
$> mysqlbinlog binlog_files | more
或者,將輸出儲存到檔案中,並在文字編輯器中檢視該檔案
$> mysqlbinlog binlog_files > tmpfile
$> ... edit tmpfile ...
編輯檔案後,如下所示套用內容
$> mysql -u root -p < tmpfile
如果您有多個二進位日誌要套用在 MySQL 伺服器上,請使用單一連線來套用您要處理的所有二進位日誌檔案的內容。以下是一種執行方式
$> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
另一種方法是將整個日誌寫入單一檔案,然後處理該檔案
$> mysqlbinlog binlog.000001 > /tmp/statements.sql
$> mysqlbinlog binlog.000002 >> /tmp/statements.sql
$> mysql -u root -p -e "source /tmp/statements.sql"