#### 4.6.9.2 mysqlbinlog 行事件展示

[](<>)

以下示例说明了如何[**mysqlbinlog**](mysqlbinlog.html)显示指定数据修改的行事件。这些对应于事件`WRITE_ROWS_EVENT`,`UPDATE_ROWS_EVENT`， 和`DELETE_ROWS_EVENT`类型代码。这[`--base64-输出=解码-行`](mysqlbinlog.html#option_mysqlbinlog_base64-output)和[`--详细`](mysqlbinlog.html#option_mysqlbinlog_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**](mysqlbinlog.html)显示编码为 base-64 字符串的行事件，使用[`二进制日志`](binlog.html)陈述。省略多余的行，前面语句序列产生的行事件的输出如下所示：

```
$> 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**](mysqlbinlog.html)与[`--详细`](mysqlbinlog.html#option_mysqlbinlog_verbose)要么`-v`选项。此输出级别还显示适用的表分区信息。输出包含以开头的行`###`：

```
$> 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'
```

指定[`--详细`](mysqlbinlog.html#option_mysqlbinlog_verbose)要么`-v`两次还显示每列的数据类型和一些元数据，以及信息日志事件，例如行查询日志事件，如果[`binlog_rows_query_log_events`](replication-options-binary-log.html#sysvar_binlog_rows_query_log_events)系统变量设置为`真的`.输出包含每列更改后的附加注释：

```
$> 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 */
```

你可以告诉[**mysqlbinlog**](mysqlbinlog.html)压制[`二进制日志`](binlog.html)行事件的语句，使用[`--base64-输出=解码-行`](mysqlbinlog.html#option_mysqlbinlog_base64-output)选项。这类似于[`--base64-输出=从不`](mysqlbinlog.html#option_mysqlbinlog_base64-output)但如果找到行事件，则不会以错误退出。的组合[`--base64-输出=解码-行`](mysqlbinlog.html#option_mysqlbinlog_base64-output)和[`--详细`](mysqlbinlog.html#option_mysqlbinlog_verbose)提供了一种仅将行事件视为 SQL 语句的便捷方式：

```
$> 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'
```

笔记

你不应该压抑[`二进制日志`](binlog.html)如果您打算重新执行，则声明[**mysqlbinlog**](mysqlbinlog.html)输出。

生成的 SQL 语句[`--详细`](mysqlbinlog.html#option_mysqlbinlog_verbose)对于行事件比相应的可读性强得多[`二进制日志`](binlog.html)陈述。但是，它们与生成事件的原始 SQL 语句并不完全对应。以下限制适用：

-   原始列名丢失并替换为`@*`ñ`*`， 在哪里*`ñ`*是列号。

-   二进制日志中没有字符集信息，影响字符串列显示：

    -   对应的二进制和非二进制字符串类型之间没有区别（[`二进制`](binary-varbinary.html)和[`字符`](char.html),[`变量`](binary-varbinary.html)和[`VARCHAR`](char.html),[`斑点`](blob.html)和[`文本`](blob.html)）。输出使用的数据类型为`细绳`对于固定长度的字符串和`VARSTRING`对于可变长度字符串。

    -   对于多字节字符集，每个字符的最大字节数不存在于二进制日志中，因此字符串类型的长度以字节而不是字符显示。例如，`字符串(4)`用作来自以下任一列类型的值的数据类型：

        ```
        CHAR(4) CHARACTER SET latin1
        CHAR(2) CHARACTER SET ucs2
        ```

    -   由于类型事件的存储格式`UPDATE_ROWS_EVENT`,[`更新`](update.html)语句显示为`在哪里`前面的条款`放`条款。

    行事件的正确解释需要二进制日志开头的格式描述事件的信息。因为[**mysqlbinlog**](mysqlbinlog.html)事先不知道日志的其余部分是否包含行事件，默认情况下它使用[`二进制日志`](binlog.html)输出的初始部分中的语句。

    如果已知二进制日志不包含任何需要[`二进制日志`](binlog.html)语句（即没有行事件），[`--base64-输出=从不`](mysqlbinlog.html#option_mysqlbinlog_base64-output)选项可用于防止写入此标头。
