mysqlbinlog を使用して PolarDB for MySQL クラスターからバイナリログファイルをリモートでダウンロードし、データ監査、ポイントインタイムリカバリ、またはレプリケーションのトラブルシューティングのためにローカルで解析します。
前提条件
開始する前に、以下を確認してください。
PolarDB for MySQL クラスターのバイナリロギングが有効になっていること。デフォルトでは、バイナリロギングは無効になっています。有効になっていない場合、
SHOW BINARY LOGS;はYou are not using binary loggingを返します。バイナリロギングを有効または無効にすると、クラスターの自動再起動がトリガーされます。この変更はオフピーク時に実行し、アプリケーションが自動的に再接続できることを確認してください。ローカルサーバーに MySQL クライアントがインストールされていること。
クラスターエンドポイント (プライベートまたはパブリック) を持っていること。詳細については、「クラスターのエンドポイントの管理」をご参照ください。
PolarDB for MySQL クラスターのデータベースアカウントを持っていること。詳細については、「データベースアカウントの作成と管理」をご参照ください。
仕組み
バイナリログを提供するノードは、接続するエンドポイントによって異なります。
| 接続方法 | バイナリログの提供元 |
|---|---|
| プライマリエンドポイント、デフォルトのクラスターエンドポイント、またはプライマリノードに関連付けられたカスタムクラスターエンドポイント | プライマリノード |
| 読み取り専用ノードのみに関連付けられたカスタムクラスターエンドポイント | いずれかの読み取り専用ノード |
読み取り専用ノードからバイナリログをダウンロードするには、以下が必要です。
PolarDB for MySQL 8.0、リビジョンバージョン 8.0.1.1.12 以降
PolarDB for MySQL 5.7、リビジョンバージョン 5.7.1.0.12 以降
バージョン要件を満たしていない場合、mysqlbinlog は Only allow to dump binary log file on primary instance を返します。アップグレードについては、「マイナーバージョンの更新」をご参照ください。
バイナリログファイルのダウンロード
MySQL クライアントから PolarDB クラスターに接続します。詳細については、「データベース接続」をご参照ください。
root@xxx:~# mysql -h xxx-polardb.rwlb.rds.aliyuncs.com -P3306 -utest_api -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is xxx Server version: 8.0.13 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>利用可能なバイナリログファイルを一覧表示します。
SHOW BINARY LOGS;出力には、各ログファイル名とサイズが一覧表示されます。
+------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000005 | 2639 | +------------------+-----------+ 1 row in set (0.00 sec)Log_nameの値をメモしておきます。この値は次の手順で使用します。MySQL クライアントを終了します。
exitmysqlbinlog を実行して、バイナリログファイルをローカルサーバーにダウンロードします。コマンド形式:
パラメーター:
パラメーター 説明 --read-from-remote-server必須。レプリケーションクライアントとしてクラスターに接続し、バイナリログをリモートからストリーミングします。 --host/-hクラスターのプライベートエンドポイントまたはパブリックエンドポイント。クラスターとサーバーが同じリージョンおよび仮想プライベートクラウド (VPC) 内にある場合はプライベートエンドポイントを使用し、そうでない場合はパブリックエンドポイントを使用します。エンドポイントがデフォルト以外のポートを使用している場合は、エンドポイントの後にポート番号を追加します。 --user/-uPolarDB for MySQL クラスターのデータベースアカウント名。 --password/-pアカウントのパスワード。値を省略すると、コマンド実行後に対話形式で入力できます。 --rawバイナリログをテキストに変換せず、元のバイナリ形式で保存します。 mysql-bin.<log-number>手順 2 で確認した Log_nameフィールドのバイナリログファイル名。mysqlbinlog -u<Username> -p<Password> -h<Endpoint> --read-from-remote-server --raw mysql-bin.******例:
mysqlbinlog -utest_api -p -htest-polardb.rwlb.rds.aliyuncs.com --read-from-remote-server --raw mysql-bin.000005mysql> exit Bye root@xxx:~# mysqlbinlog -utest_api -p -hxxx-polardb.rwlb.rds.aliyuncs.com --read-from-remote-server --raw mysql-bin.000005 Enter password: root@xxx:~#
バイナリログファイルの表示と解析
ダウンロードしたファイルに対して mysqlbinlog を実行し、その内容をデコードして表示します。
mysqlbinlog -vv --base64-output=decode-rows mysql-bin.<log-number> | more-vv:詳細な SQL ステートメントと行レベルの変更を表示します。--base64-output=decode-rows:base64 でエンコードされた行イベントを読み取り可能な SQL にデコードします。
出力には、バイナリログファイル内の各イベントのデコードされた内容が表示されます。
[root@iZ ~]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000110 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160217 23:04:37 server id 2802943055 end_log_pos 107 Start: binlog v 4, server v 5.5.18.1-log created 160217 23:04:37
# at 107
#160217 23:04:38 server id 2802943055 end_log_pos 171 Query thread id=584632 exec time=0 error code=0
SET TIMESTAMP=1455721478/*!*/;
SET @@session.pseudo_thread_id=584632/*!*/;
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 utf8 *//*!*/;
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
/*!*/;
# at 171解析エラーを避けるため、PolarDB クラスターのデータベースエンジンバージョンと同じ MySQL バージョンを使用してください。
mysqlbinlog の完全な構文とオプションについては、MySQL ドキュメントをご参照ください。
よくある質問
なぜ SHOW BINARY LOGS を実行すると "You are not using binary logging" が返されるのですか?
デフォルトではバイナリロギングは無効になっています。クラスターのバイナリロギングを有効にしてから、再度お試しください。
バイナリロギングを有効または無効にすると、クラスターの自動再起動がトリガーされます。
なぜ 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.
ERROR: Got error reading packet from server: 'Slave can not handle replication events with the checksum that master is configured to log;お使いの mysqlbinlog のバージョンが古すぎます。新しいバージョンにアップグレードしてください。たとえば、V3.3 を使用している場合は V3.4 にアップグレードしてください。
なぜ mysqlbinlog が "Lost connection to MySQL server" で失敗するのですか?
ERROR: Failed on connect: Lost connection to MySQL server at 'reading initial communication packet', system error: 104以下を確認してください。
ネットワーク接続:お使いのサーバーからクラスターエンドポイントに到達できることを確認してください。
IP ホワイトリスト:お使いのサーバーの IP アドレスがクラスターのホワイトリストに追加されていることを確認してください。詳細については、「IP ホワイトリストの設定」をご参照ください。
データベース設定:ローカルの MySQL サーバーがデータベースに接続できるかを確認し、データベースに正常にアクセスできることを確認してください。
なぜバイナリログファイルの内容がデコードされないのですか?
--base64-output=decode-rows なしで mysqlbinlog を実行すると、行イベントは生の base64 文字列として表示されます。
以下は、--base64-output=decode-rows が使用されていない場合のデコードされていないバイナリログ出力のサンプルです。BINLOG ステートメントには、解析されていない base64 でエンコードされたデータが含まれています。
[root@iz ~]# mysqlbinlog -vv mysql-bin.000110 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160217 23:04:37 server id 2802943055 end_log_pos 107 Start: binlog v 4, server v 5.5.18.1-log created 160217 23:04:37
BINLOG '
BYzEVg9PhBGnZwAAAGsAAAAAAAAQANS41LjE4LjEtbG9nAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAAA==
'/*!*/;
# at 107
#160217 23:04:38 server id 2802943055 end_log_pos 171 Query thread_id=584632 exec_time=0 error_code=0バイナリログファイルを表示するときは、常に --base64-output=decode-rows を含めてください。
読み取り専用ノードに接続すると、なぜ "Only allow to dump binary log file on primary instance" が表示されるのですか?
お使いのクラスターのバージョンが、読み取り専用ノードのバイナリログアクセスに必要な最小要件を満たしていません。PolarDB for MySQL 8.0 リビジョンバージョン 8.0.1.1.12 以降、または PolarDB for MySQL 5.7 リビジョンバージョン 5.7.1.0.12 以降にアップグレードしてください。詳細については、「マイナーバージョンの更新」をご参照ください。
なぜ読み取り専用ノードのバイナリログがプライマリノードよりも遅れることがあるのですか?
プライマリノードは、バイナリログファイルを非同期で読み取り専用ノードにレプリケーションします。同期遅延が発生した場合、読み取り専用ノードには最新の書き込みログファイルがまだ存在しない可能性があります。これは通常、データ量が少ない場合は短時間で解消されます。
なぜ期限切れのバイナリログファイルが binlog_expire_logs_seconds の保持期間を過ぎても削除されないのですか?
ファイルが期限切れになったときに読み取り専用ノードのスレッドがファイルを読み取り中の場合、システムは読み取りが完了するまでそのファイルを保持します。プライマリノードが新しいバイナリログファイルを書き込んだ後、システムは読み取られていない期限切れのファイルを確認し、それらを削除します。