MySQL 8.0 リファレンスマニュアル


4.6.8.2 mysqlbinlog 行イベントの表示

次の例は、データの変更を指定する行イベントを mysqlbinlog が表示する方法を説明しています。 これらは WRITE_ROWS_EVENTUPDATE_ROWS_EVENT、および DELETE_ROWS_EVENT タイプコードを持つイベントに対応します。 --base64-output=DECODE-ROWS オプションおよび --verbose オプションを、行イベント出力に影響を与えるために使用できます。

サーバーが行ベースのバイナリロギングを使用しており、次のステートメントのシーケンスを実行するとします。

CREATE TABLE t
(
  id   INT NOT NULL,
  name VARCHAR(20) NOT NULL,
  date DATE NULL
) ENGINE = InnoDB;

START TRANSACTION;
INSERT INTO t VALUES(1, 'apple', NULL);
UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1;
DELETE FROM t WHERE id = 1;
COMMIT;

デフォルトでは、mysqlbinlog は行イベントを、BINLOG ステートメントを使用して base-64 文字列としてエンコードして表示します。 無関係な行を省略すると、前のステートメントシーケンスによって生成される行イベントの出力は次のようになります。

shell> mysqlbinlog log_file
...
# at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
...
# at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
...
# at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;

行イベントを擬似 SQL ステートメントの形式のコメントして表示するには、mysqlbinlog--verbose オプションまたは -v オプションで実行します。 この出力レベルには、テーブルパーティション情報も表示されます (該当する場合)。 出力には、###で始まる行が含まれます:

shell> mysqlbinlog -v log_file
...
# at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
### INSERT INTO test.t
### SET
###   @1=1
###   @2='apple'
###   @3=NULL
...
# at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### UPDATE test.t
### WHERE
###   @1=1
###   @2='apple'
###   @3=NULL
### SET
###   @1=1
###   @2='pear'
###   @3='2009:01:01'
...
# at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
### DELETE FROM test.t
### WHERE
###   @1=1
###   @2='pear'
###   @3='2009:01:01'

--verbose または -v を 2 回指定すると、各カラムのデータ型と一部のメタデータ、および binlog_rows_query_log_events システム変数が TRUE に設定されている場合は行クエリーログイベントなどの情報ログイベントも表示されます。 出力には、各カラムの変更後に追加のコメントが含まれます:

shell> mysqlbinlog -vv log_file
...
# at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
### INSERT INTO test.t
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
###   @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
...
# at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### UPDATE test.t
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
###   @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
###   @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
...
# at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
### DELETE FROM test.t
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
###   @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */

--base64-output=DECODE-ROWS オプションを使用して、行イベントに対する BINLOG ステートメントを抑制するように mysqlbinlog に指示できます。 これは --base64-output=NEVER と同様ですが、行イベントが検出された場合にエラーで終了しません。 --base64-output=DECODE-ROWS および --verbose の組み合わせにより、行イベントを SQL ステートメントとしてのみ表示する便利な方法が提供されます。

shell> mysqlbinlog -v --base64-output=DECODE-ROWS log_file
...
# at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F
### INSERT INTO test.t
### SET
###   @1=1
###   @2='apple'
###   @3=NULL
...
# at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F
### UPDATE test.t
### WHERE
###   @1=1
###   @2='apple'
###   @3=NULL
### SET
###   @1=1
###   @2='pear'
###   @3='2009:01:01'
...
# at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F
### DELETE FROM test.t
### WHERE
###   @1=1
###   @2='pear'
###   @3='2009:01:01'
注記

mysqlbinlog の出力を再実行する予定である場合は、BINLOG ステートメントを抑制するべきではありません。

--verbose が行イベントに関して生成した SQL ステートメントは、対応する BINLOG ステートメントよりもはるかに読みやすくなります。 ただし、イベントを生成した元の SQL ステートメントと正確には対応しません。 次の制約が適用されます。

  • 元のカラム名は失われて @N に置換されます。N はカラム番号です。

  • バイナリログでは文字セット情報は利用できません。これは文字列カラムの表示に影響します。

    • 対応するバイナリ文字列型と非バイナリ文字列型の間に区別はありません (BINARYCHARVARBINARYVARCHARBLOBTEXT)。 出力では固定長文字列に対して STRING、可変長文字列に対して VARSTRING データ型が使用されます。

    • マルチバイト文字セットでは、文字当たりの最大のバイト数はバイナリログには現れないため、文字列型の長さは文字数ではなくバイト数で表示されます。 たとえば、STRING(4) は、次のいずれかのカラムタイプの値のデータ型として使用されます:

      CHAR(4) CHARACTER SET latin1
      CHAR(2) CHARACTER SET ucs2
    • UPDATE_ROWS_EVENT 型のイベントのストレージフォーマットのため、UPDATE ステートメントは WHERE 句が SET 句の前に表示されます。

行イベントを適切に解釈するには、バイナリログの最初にある形式の記述の情報が必要です。 mysqlbinlog はログの残りの部分に行イベントが含まれるかどうかは前もってわからないため、デフォルトでは出力の最初の部分に BINLOG ステートメントを使用して形式記述イベントを表示します。

バイナリログに BINLOG ステートメントを必要とするイベントが含まれないことがわかっている (つまり行イベントがない) 場合は、--base64-output=NEVER オプションを使用してこのヘッダーが書き込まれるのを回避できます。


関連キーワード:  イベント, AAA, 表示, mysqlbinlog, fAS, プログラム, ステートメント, BINLOG, サーバー, rows