このトピックでは、ApsaraDB RDS for MySQLインスタンスのバイナリログファイルをリモートで取得し、mysqlbinlogを使用してファイルを解析する方法について説明します。
以下の点にご注意ください。
インスタンスの設定やデータの変更などのリスクの高い操作を実行する前に、データのセキュリティを確保するために、インスタンスのディザスタリカバリ機能とフォールトトレランス機能を確認することを推奨します。
ECS (Elastic Compute Service) インスタンスやApsaraDB RDSインスタンスなどのインスタンスの設定またはデータを変更する前に、インスタンスのスナップショットを作成するか、バックアップを有効にすることを推奨します。 たとえば、ApsaraDB RDSインスタンスのログバックアップを有効にできます。
Alibaba Cloud管理コンソールで機密情報に対する権限を付与した場合、または機密情報を送信した場合は、できるだけ早い機会に機密情報を変更することを推奨します。 機密情報には、ユーザー名とパスワードが含まれます。
バイナリログファイルの取得
ビジネス要件に基づいて、バイナリログファイルを取得する方法を選択する必要があります。
方法1: (推奨) ApsaraDB RDSコンソールからのログファイルのダウンロード
ApsaraDB RDSコンソールからログファイルをダウンロードします。 詳細については、「ApsaraDB RDS For MySQLインスタンスのバックアップファイルのダウンロード」をご参照ください。
方法2: バイナリログファイルをリモートで取得
クライアントをRDSインスタンスに接続します。 詳細については、「データベースクライアントまたはCLIを使用したApsaraDB RDS For MySQLインスタンスへの接続」をご参照ください。
次のSQL文を実行して、
Log_name
の値を表示し、logs
テーブルに記録します。 値は、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)
前の手順で取得したバイナリログファイルの名前に基づいて、CLIで次のコマンドを実行して、バイナリログファイルをリモートで取得し、オンプレミスデバイスにファイルを保存します。
mysqlbinlog -u<$User> -p<$Password> -h<$Host> --read-from-remote-server --raw <mysql-bin.XXX> > [$File_Name]
下表に、各パラメーターを説明します。
パラメーター
説明
-u<$ユーザー>
MySQLサーバーへの接続に使用されるユーザー名。
-p<$パスワード>
MySQLサーバーへの接続に使用されるパスワード。
-h<$ホスト>
RDSインスタンスへのリモート接続に使用されるエンドポイント。 詳細については、「インスタンスエンドポイントとポートの表示と管理」をご参照ください。
-- read-from-remote-server
バイナリログファイルの内容を取得するために
mysqlbinlog
が接続されているリモートMySQLサーバー。-- raw
解析後に
mysqlbinlog
コマンドの出力にバイナリログファイルの内容を表示するために使用される生の形式。<mysql-bin.XXX>
解析する必要があるバイナリログファイルの名前。 このパラメーターは、ステップ2の結果に基づいて設定する必要があります。
> [$File_Name]
リモートで取得され、オンプレミスデバイスに保存されるバイナリログファイルの名前。
次のコマンドを実行して、バイナリログファイルが取得されているかどうかを確認します。
more [$File_Name]
mysqlbinlogを使用したバイナリログファイルの表示
CLIで次のコマンドを実行し、mysqlbinlogを使用してバイナリログファイルの内容を表示します。
mysqlbinlog -vv --base64-output=decode-rows <mysql-bin.XXX> | more
下表に、各パラメーターを説明します。
パラメーター | 説明 |
| 解析から取得したイベントに関する詳細を含む、出力の詳細。 |
| Base64エンコーディングを使用してバイナリログエントリを記録することを指定します。 |
| 解析する必要があるバイナリログファイルの名前。 |
| パイプラインを使用して出力を |
バイナリログ解析の詳細については、「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のバージョンを確認してください。 たとえば、mysqlbinlog 3.3を使用して次のエラーが発生した場合、このエラーはmysqlbinlog 3.4で解決されるため、mysqlbinlog 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を使用しているが、
-- base64-output=decode-rows
パラメーターが使用されていない場合、出力は解析されていない内容になります。次のエラーが発生した場合は、
my.cn f
設定ファイルにdefault-character-set=utf8mb4
パラメーターが存在するかどうかを確認してください。 パラメーターが存在する場合は、このエラーを防ぐために-- no-defaults
パラメーターを追加します。 例:mysqlbinlog -- no-defaults -u[$User] -p[$Password] -h[$Host] -- リモートサーバーmysql-bin.XXXの読み取り> [$File_Name]
mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4'
mysqlbinlog
コマンドによって解決されるバイナリログの時刻が実際の時刻と異なる場合は、mysqlbinlog
コマンドが実行される環境のタイムゾーンがApsaraDB RDS for MySQLデータベースのタイムゾーンと同じかどうかを確認します。MySQLでは、バイナリログの時刻情報は、タイムゾーン情報を含まないUNIXタイムスタンプとして保存されます。 そのため,
mysqlbinlog
コマンドで解決される時刻は, コマンドを実行する環境のローカルタイムゾーンに基づいて変換されます。 環境のタイムゾーンがRDS for MySQLインスタンスのタイムゾーンと異なる場合、解決された時間は実際の時間と一致しません。
適用範囲
ApsaraDB RDS for MySQL