本文主要介紹阿里云云數據庫RDS MySQL如何遠程獲取Binlog日志,并使用mysqlbinlog工具解析Binlog日志。
阿里云提醒您:
如果您對實例或數據有修改、變更等風險操作,務必注意實例的容災、容錯能力,確保數據安全。
如果您對實例(包括但不限于ECS、RDS)等進行配置與數據修改,建議提前創建快照或開啟RDS日志備份等功能。
如果您在阿里云平臺授權或者提交過登錄賬號、密碼等安全信息,建議您及時修改。
獲取Binlog日志
您可以根據實際情況,選擇合適的Binlog日志獲取方法。
方法一:控制臺下載日志文件(推薦)
通過RDS控制臺直接下載日志文件。具體操作,請參見下載Binlog日志文件。
方法二:遠程獲取Binlog日志
通過客戶端連接實例。具體操作,請參見連接實例。
執行以下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)
根據上一步獲取的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文件保存在本地的文件名。
執行以下命令,確認遠程獲取Binlog日志成功。
more [$File_Name]
通過mysqlbinlog查看Binlog日志文件
在命令行執行以下命令,通過mysqlbinlog工具查看Binlog日志文件內容。
mysqlbinlog -vv --base64-output=decode-rows <mysql-bin.XXX> | more
參數解釋如下:
參數 | 含義 |
| 將輸出詳細信息,包括解析出的每個事件的詳細內容。 |
| 使用base64編碼打印二進制日志條目。 |
| 待解析的二進制日志文件的文件名。請將 |
| 通過管道將輸出結果發送給 |
更多關于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
參數,導致輸出的結果為未解析的內容。若出現以下報錯,請檢查
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