このトピックでは、Alibaba Cloud ApsaraDB RDS for MySQL インスタンスからバイナリログをリモートで取得し、 mysqlbinlog ユーティリティを使用して解析する方法について説明します。
インスタンス設定やデータの変更などのリスクの高い操作を実行する前に、インスタンスに災害耐性と耐障害性があることを確認し、データを保護してください。
Elastic Compute Service (ECS) インスタンスや RDS インスタンスなどのインスタンスの設定またはデータを変更する場合は、事前にスナップショットを作成するか、RDS インスタンスのログバックアップを有効にしてください。
Alibaba Cloud プラットフォームで権限を付与したり、機密情報 (ユーザー名やパスワードなど) を送信したりした場合は、速やかに情報を変更してください。
バイナリログの取得
方法 1:RDS コンソールからのダウンロード
-
クラウドディスクを使用するインスタンス:デフォルトで有効になっているログバックアップ機能を有効にすると、ローカルログ (バイナリログ) がリアルタイムでバックアップストレージ領域にアップロードまたはコピーされ、ログバックアップが作成されます。目的の時点のログバックアップをダウンロードできます。詳細については、「クラウドディスクインスタンスからのダウンロード」をご参照ください。
-
高性能ローカルディスクを使用するインスタンス:詳細については、「高性能ローカルディスクインスタンスからのダウンロード」をご参照ください。
ログバックアップを有効にする方法については、「ApsaraDB RDS for MySQL インスタンスのバックアップ」をご参照ください。
方法 2:バイナリログのリモート取得
ApsaraDB RDS for MySQL インスタンスへの接続
重要MySQL クライアントのバージョンは、RDS インスタンスのバージョンと一致している必要があります。
SHOW BINARY LOGS;ステートメントを実行して、バイナリログファイル名を表示します。Log_name列から、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)前の手順で取得したファイル名を使用して、バイナリログをリモートで取得し、ローカルに保存します。
次のコマンドを実行して MySQL CLI を終了し、オペレーティングシステムに戻ります。
exit;次のコマンドを実行してバイナリログをリモートで取得し、ローカルマシンに保存します。
mysqlbinlog -u<$User> -p<$Password> -h<$Host> --read-from-remote-server --raw <mysql-bin.XXX>パラメーターは次のとおりです:
パラメーター
説明
-u<$User>MySQL サーバーへの接続に使用するユーザー名。
-p<$Password>MySQL サーバーへの接続に使用するパスワード。
-h<$Host>ApsaraDB RDS for MySQL インスタンスのエンドポイント。 エンドポイントの確認方法については、「ApsaraDB RDS for MySQL インスタンスのエンドポイントとポート番号の表示」をご参照ください。
--read-from-remote-server指定されたリモート MySQL サーバーに接続して、バイナリログを取得します。
--rawこのオプションを
--read-from-remote-serverとともに使用すると、mysqlbinlogはバイナリログを元の形式でローカルファイルに書き込みます。<mysql-bin.XXX>取得するバイナリログファイルの名前。手順 2 で確認したものです。
mysqlbinlog を使用したバイナリログファイルの表示
次の mysqlbinlog コマンドを実行して、バイナリログファイルの内容を表示します。
MySQL クライアントのバージョンは、RDS インスタンスのバージョンと一致している必要があります。
mysqlbinlog -vv --base64-output=decode-rows <mysql-bin.XXX> | more解析された内容を確認用に保存するには、出力をファイルに書き込みます。
mysqlbinlog -vv --base64-output=decode-rows <mysql-bin.XXX> > <$File_Name>パラメーターは次のとおりです:
パラメーター | 説明 |
| 解析された各イベントの詳細な内容を含む、冗長な出力を表示します。 |
| バイナリログの行イベントをデコードされた形式で出力します。 |
| 解析するバイナリログファイルの名前。 XXX を実際のファイル名に置き換えます。 |
| 出力を |
| 解析された内容が書き込まれるローカルファイル。 |
バイナリログの解析の詳細については、「MySQL の公式ドキュメント」をご参照ください。
次のような出力が返されます。
[root@iZbp****** ~]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000022 | more
# 適切な用語は pseudo_replica_mode ですが、この互換性エイリアスを使用して
# サーバーバージョン 8.0.24 以前でステートメントを使用可能にします。
/*!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 で修正されています。 この問題を解決するには、新しいバージョンの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.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'解析されたログのタイムスタンプが正しくない場合は、ローカル環境のタイムゾーンがデータベースのタイムゾーンと一致していることを確認してください。
MySQL バイナリログは、タイムゾーンデータなしで Unix タイム形式でタイムスタンプを保存します。
mysqlbinlogコマンドは、実行されるシステムのローカルタイムゾーンを使用してこれらのタイムスタンプを変換します。 クライアント環境とデータベースサーバー間でタイムゾーンが一致しない場合、出力のタイムスタンプが不正確になります。
対象製品
ApsaraDB RDS for MySQL