次の例は、データの変更を指定する行イベントを mysqlbinlog が表示する方法を説明しています。 これらは WRITE_ROWS_EVENT
、UPDATE_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
はカラム番号です。-
バイナリログでは文字セット情報は利用できません。これは文字列カラムの表示に影響します。
対応するバイナリ文字列型と非バイナリ文字列型の間に区別はありません (
BINARY
とCHAR
、VARBINARY
とVARCHAR
、BLOB
とTEXT
)。 出力では固定長文字列に対して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
オプションを使用してこのヘッダーが書き込まれるのを回避できます。