全部產品
Search
文件中心

ApsaraDB RDS:RDS MySQL版遠程擷取Binlog日誌並解析Binlog日誌

更新時間:Dec 06, 2024

本文主要介紹阿里雲雲資料庫RDS MySQL如何遠程擷取Binlog日誌,並使用mysqlbinlog工具解析Binlog日誌。

重要

阿里雲提醒您:

  • 如果您對執行個體或資料有修改、變更等風險操作,務必注意執行個體的容災、容錯能力,確保資料安全。

  • 如果您對執行個體(包括但不限於ECS、RDS)等進行配置與資料修改,建議提前建立快照或開啟RDS記錄備份等功能。

  • 如果您在阿里雲平台授權或者提交過登入帳號、密碼等安全資訊,建議您及時修改。

擷取Binlog日誌

您可以根據實際情況,選擇合適的Binlog日誌擷取方法。

方法一:控制台下載記錄檔(推薦)

通過RDS控制台直接下載記錄檔。具體操作,請參見下載Binlog記錄檔

方法二:遠程擷取Binlog日誌

  1. 通過用戶端串連執行個體。具體操作,請參見串連執行個體

  2. 執行以下SQL語句,查看並記錄logs表中的Log_name值,該值為Binlog記錄檔名,例如mysql-bin.xxx

    show binary logs;

    系統顯示類似如下:

    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000022 |    406039 |
    | mysql-bin.000023 |     71497 |
    +------------------+-----------+
    2 rows in set (0.01 sec)

  3. 根據上一步擷取的Binlog檔案名稱,在命令列執行以下命令,遠程擷取Binlog日誌並儲存至本地。

    mysqlbinlog -u<$User> -p<$Password> -h<$Host> --read-from-remote-server --raw <mysql-bin.XXX> > [$File_Name]

    參數解釋如下:

    參數

    含義

    -u<$User>

    指定串連MySQL伺服器的使用者名稱。

    -p<$Password>

    指定串連MySQL伺服器的密碼。

    -h<$Host>

    雲資料庫RDS執行個體遠端連線地址。如何擷取,請參見查看內外網地址和連接埠

    --read-from-remote-server

    mysqlbinlog將通過網路連接到指定的遠程MySQL伺服器來擷取二進位記錄檔內容。

    --raw

    mysqlbinlog命令以原始格式顯示解析後的二進位日誌內容。

    <mysql-bin.XXX>

    待解析的二進位記錄檔的檔案名稱。請根據步驟二結果填寫。

    > [$File_Name]

    遠程擷取Binlog檔案儲存在本地的檔案名稱。

  4. 執行以下命令,確認遠程擷取Binlog日誌成功。

    more [$File_Name]

通過mysqlbinlog查看Binlog記錄檔

在命令列執行以下命令,通過mysqlbinlog工具查看Binlog記錄檔內容。

mysqlbinlog -vv --base64-output=decode-rows <mysql-bin.XXX> | more

參數解釋如下:

參數

含義

-vv

將輸出詳細資料,包括解析出的每個事件的詳細內容。

--base64-output=decode-rows

使用base64編碼列印二進位日誌條目。

<mysql-bin.XXX>

待解析的二進位記錄檔的檔案名稱。請將XXX替換為實際的檔案名稱。

| more

通過管道將輸出結果發送給more命令,以便分頁顯示輸出內容。

說明

更多關於Binlog日誌的解析,請參見MySQL官方網站

返回結果類似如下:

[root@iZbp****** ~]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000022 | more
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#230911  9:27:28 server id 26718053  end_log_pos 123 CRC32 0xa231cb44   Start: binlog v 4, server v 5.7.42-log created 230911  9:27:28
# at 123
#230911  9:27:28 server id 26718053  end_log_pos 194 CRC32 0x078b6dc1   Previous-GTIDs
# a63b4ed1-4c86-11ee-9029-00163e157053:1-27339
# at 194
#230911  9:27:32 server id 26718053  end_log_pos 259 CRC32 0x59b848c3   GTID    last_committed=0        sequence_number=1       rbr_only=yes    original_committed_ti
mestamp=0       immediate_commit_timestamp=0    transaction_length=0
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=0 (1970-01-01 08:00:00.000000 CST)
# immediate_commit_timestamp=0 (1970-01-01 08:00:00.000000 CST)
/*!80001 SET @@session.original_commit_timestamp=0*//*!*/;
/*!80014 SET @@session.original_server_version=0*//*!*/;
/*!80014 SET @@session.immediate_server_version=0*//*!*/;
SET @@SESSION.GTID_NEXT= 'a63b4ed1-4c86-11ee-9029-00163e157053:27340'/*!*/;
# at 259
#230911  9:27:32 server id 26718053  end_log_pos 327 CRC32 0xc0dddaec   Query   thread_id=16849 exec_time=0     error_code=0
SET TIMESTAMP=1694395652/*!*/;
SET @@session.pseudo_thread_id=16849/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=2097152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb3 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN

常見問題

以下介紹了使用mysqlbinlog工具時遇到的幾種常見問題。

  • 若出現以下報錯內容,請檢查使用的mysqlbinlog工具版本。例如您使用3.3版本遇到以下錯誤,但是在3.4版本中已經修複此問題,3.4版本可以正常查看。因此出現此問題,您可以使用較高版本的mysqlbinlog工具查看。

    ERROR: Error in Log_event::read_log_event(): 'Sanity check failed', data_len: 151, event_type: 35
    ERROR: Could not read entry at offset 120: Error in log format or read error.
  • 通過mysqlbinlog工具查看Binlog記錄檔內容時,沒有使用--base64-output=decode-rows參數,導致輸出的結果為未解析的內容。

    image.png

  • 若出現以下報錯,請檢查my.cnf設定檔中是否存在default-character-set=utf8mb4欄位,如果存在,可以通過在命令中添加--no-defaults參數避免該問題。例如:mysqlbinlog --no-defaults -u[$User] -p[$Password] -h[$Host] --read-from-remote-server mysql-bin.XXX > [$File_Name]

    mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4'
  • 若出現mysqlbinlog命令解析的binlog時間和實際時間有差別,請檢查運行mysqlbinlog命令的環境時區是否與MySQL資料庫的時區一致。

    MySQL的二進位日誌(Binlog)中的時間戳記以Unix時間格式儲存,不包含時區資訊。因此,在通過mysqlbinlog命令解析日誌時,產生的時間將基於運行該命令所在系統的本地時區設定進行轉換。若mysqlbinlog運行環境的時區配置與MySQL伺服器本身的時區不同,就會導致解析出的時間顯示與實際記錄的時間存在偏差。

適用於

雲資料庫RDS MySQL