MySQL中binlog参数:binlog_rows_query_log_events

在使用RBR也就是行格式的时候,去解析binlog,需要逆向才能分析出对应的原始SQL是什么,而且,里面对应的是每一条具体行变更的内容。当然,你可以开启general log,但如果我们需要的只是记录对应的行变更,而不需要记录这些select普通的查询,因为general log 会将线上所有的操作都记录下来,这种功能适合于我们审核统计,但是不适合我们对事务进行判断,故此,我们使用binlog_rows_query_log_events进行查看。在官网中的解析如下

binlog_rows_query_log_events

The binlog_rows_query_log_events system variable affects row-based logging only. When enabled, it causes a MySQL 5.6.2 or later server
to write informational log events such as row query log events into its binary log. This information can be used for debugging and related purposes;
such as obtaining the original query issued on the master when it cannot be reconstructed from the row updates.

These events are normally ignored by MySQL programs reading the binary log and so cause no issues when replicating or restoring from backup.
To view them, increase the verbosity level by using mysqlbinlog‘s --verbose option twice, either as "-vv" or "--verbose --verbose".  

可以看到,它是一个动态的,全局,会话型的变量,即可以通过SQL模式进行关闭开启。

在未开启状态中的使用

[[email protected]][boss]> flush logs;
Query OK, 0 rows affected (0.90 sec)

[[email protected]][boss]> flush logs;
Query OK, 0 rows affected (0.18 sec)

[[email protected] logs]# ll
total 8977656
-rw-r----- 1 mysql mysql      79405 Apr 24 08:42 error.log
-rw-r----- 1 mysql mysql        217 Mar 10 10:42 mysql_bin.000013
-rw-r----- 1 mysql mysql  658363086 Apr 24 08:43 mysql_bin.000027
-rw-r----- 1 mysql mysql        241 Apr 24 08:43 mysql_bin.000028
-rw-r----- 1 mysql mysql        194 Apr 24 08:43 mysql_bin.000029-rw-r----- 1 mysql mysql        194 Apr 24 08:53 mysql_bin.000030

-rw-r----- 1 mysql mysql 132 Apr 24 08:43 mysql_bin.index 

-rw-r----- 1 mysql mysql 8534643198 Apr 24 08:43 slow.log  

目前最新的binlog切换到30的文件中,做对应的DML

[[email protected]][boss]> select * from t;
+------+
| id   |
+------+
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    2 |
|    2 |
|    2 |
|    3 |
|    3 |
|    7 |
+------+
11 rows in set (0.00 sec)

[[email protected]][boss]> update t set id = 8 where id=7;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

[[email protected]][boss]> select * from t;
+------+
| id   |
+------+
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    2 |
|    2 |
|    2 |
|    3 |
|    3 |
|    8 |
+------+
11 rows in set (0.00 sec) 

查看binlog

[[email protected]01 logs]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql_bin.000030
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170424  8:58:35 server id 37306  end_log_pos 123 CRC32 0x48e80ee3     Start: binlog v 4, server v 5.7.17-log created 170424  8:58:35
# Warning: this binlog is either in use or was not closed properly.
# at 123
#170424  8:58:35 server id 37306  end_log_pos 194 CRC32 0xaf41def6     Previous-GTIDs
# a0c06ec7-fef0-11e6-9f85-525400a7d662:1-812
# at 194
#170424  8:58:52 server id 37306  end_log_pos 259 CRC32 0xac26b3b1     GTID    last_committed=sequence_number=1
SET @@SESSION.GTID_NEXT= ‘a0c06ec7-fef0-11e6-9f85-525400a7d662:813‘/*!*/;
# at 259
#170424  8:58:52 server id 37306  end_log_pos 331 CRC32 0xb56db594     Query    thread_id=34   exec_time=0    error_code=0
SET TIMESTAMP=1492995532/*!*/;
SET @@session.pseudo_thread_id=34/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549120/*!*/;
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 331
#170424  8:58:52 server id 37306  end_log_pos 385 CRC32 0x88acf1be     Rows_query

# at 429
#170424  8:58:52 server id 37306  end_log_pos 475 CRC32 0xf2505403     Update_rows: table id 118 flags: STMT_END_F
### UPDATE `boss`.`t`
### WHERE
###   @1=7 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=8 /* INT meta=0 nullable=1 is_null=0 */
# at 475
#170424  8:58:52 server id 37306  end_log_pos 506 CRC32 0xefebd387     Xid = 2444
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= ‘AUTOMATIC‘ /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET [email protected]_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

这里只会详细记录对应变更行的每一条信息,那么如果我们开启

[[email protected]][(none)]> set global binlog_rows_query_log_events=on;

再次执行大致的SQL,查询日志发现

[[email protected]][boss]> set global binlog_rows_query_log_events=on;
Query OK, 0 rows affected (0.00 sec)

[[email protected]][boss]> flush logs;
Query OK, 0 rows affected (0.41 sec)

[[email protected]][boss]> update t set id = 9 where id=8;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0
[[email protected]-01 logs]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql_bin.000031
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170424  9:03:47 server id 37306  end_log_pos 123 CRC32 0xa04cc14a     Start: binlog v 4, server v 5.7.17-log created 170424  9:03:47
# Warning: this binlog is either in use or was not closed properly.
# at 123
#170424  9:03:47 server id 37306  end_log_pos 194 CRC32 0xc3c3b085     Previous-GTIDs
# a0c06ec7-fef0-11e6-9f85-525400a7d662:1-813
# at 194
#170424  9:03:55 server id 37306  end_log_pos 259 CRC32 0xbf9d2c93     GTID    last_committed=sequence_number=1
SET @@SESSION.GTID_NEXT= ‘a0c06ec7-fef0-11e6-9f85-525400a7d662:814‘/*!*/;
# at 259
#170424  9:03:55 server id 37306  end_log_pos 331 CRC32 0xeddbf07c     Query    thread_id=34   exec_time=0    error_code=0
SET TIMESTAMP=1492995835/*!*/;
SET @@session.pseudo_thread_id=34/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549120/*!*/;
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 331
#170424  9:03:55 server id 37306  end_log_pos 385 CRC32 0x912f4086     Rows_query
# update t set id = 9 where id=8
# at 385
#170424  9:03:55 server id 37306  end_log_pos 429 CRC32 0x16eec7d7     Table_map: `boss`.`t` mapped to number 118
# at 429
#170424  9:03:55 server id 37306  end_log_pos 475 CRC32 0x920862af     Update_rows: table id 118 flags: STMT_END_F
### UPDATE `boss`.`t`
### WHERE
###   @1=8 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=9 /* INT meta=0 nullable=1 is_null=0 */
# at 475
#170424  9:03:55 server id 37306  end_log_pos 506 CRC32 0xa37b82e5     Xid = 2447
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= ‘AUTOMATIC‘ /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET [email protected]_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

看下划线的地方,可以比较清楚的知道,对应的SQL是什么。

时间: 2024-12-22 18:40:34

MySQL中binlog参数:binlog_rows_query_log_events的相关文章

mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)

这篇文章主要介绍了mysql中max_allowed_packet参数的配置方法,以及查看max_allowed_packet参数当前值的方法,需要的朋友可以参考下 MySQL根据配置文件会限制Server接受的数据包大小.有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置: 复制代码 代码如下: show VARIABLES like '%max_allowed_packet%'; 显示的结果为: 复制代码 代码如下: +------

MySQL中bin-log使用

操作命令:show binlog events in 'mysql-bin.000016' limit 10; reset master 删除所有的二进制日志 flush logs 产生一个新的binlog日志文件 show master logs; 或者 show binary logs; 查看二进制文件列表和文件大小 ./mysqlbinlog --start-datetime="2012-05-21 15:30:00" --stop-datetime="2012-05-

mysql中key_buffer_size参数优化

mysql数据库中,key_buffer_size是对MYISAM表性能影响最大的参数. 下面以MYISAM为主要存储引擎服务器的配置: MariaDB [(none)]> show variables like 'key_buffer_size'; +-----------------+-----------+ | Variable_name   | Value     | +-----------------+-----------+ | key_buffer_size | 13421772

MySQL中bin-log与redo-log的区别

首先,从体系结构上来讲: binlog由数据库上层(server 层)生成,是SQL执行的逻辑日志.redo log是存储引擎(innodb事务引擎)层面的物理格式的日志,记录的是对于每个页的修改. 作用上的区分: binlog用来进行数据恢复(基于时间点的) 和 主从复制. redolog用来保证事务的持久性,以及 crash recovery . 生成和结束的时间机制也不一样: InnoDB的redolog在事务进行中不断地被写入,而binlog在事务提交完成后进行一次写入 所以事务提交过程

mysql中链接参数、文件参数、缓存控制参数

一 连接参数: 二 文件参数相关 三 缓存控制参数

MySQL的binlog数据如何查看

原创地址: http://blog.chinaunix.net/uid-16844903-id-3896711.html binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 基于语句,无法保证所有语句都在从库执行成功,比如update ... limit 1; 基于行,将每一次改动记为binlog中的一行.在执行一个特别复杂的update或者dele

【转】【MySQL】mysql 通过bin-log恢复数据方法详解

mysql中bin-log在mysql默认状态下是没有打开的,我们要先打开mysql 开启bin-log功能,然后再通过备份的bin-log进行数据库恢复了. 具体的操作是通过mysqlbinlog这个指令来完成的 /mysql/bin/mysqlbinlog --database=fox --start-date="2013-01-22 5:00:00" --stop-date="2013-01-22 9:00:00" /mysql/data/mysql-bin.

MySQL 中的文件!!

mysql 中文件 参数文件:MySQL配置文件,保存着mysql的配置信息.文件名my.cnf 默认情况,mysql实例会按照一定顺序在指定的文件读取配置文件,用户可以通过 mysql --help | grep  my.cnf 来寻找配置文件 也可以通过 whereis 命令来查找my.cnf文件 [[email protected] ~]# mysql  --help | grep  my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT,

sql点滴37—mysql中的错误Data too long for column '' at row 1

原文:sql点滴37-mysql中的错误Data too long for column '' at row 1   1.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQL——开启(停止.重启动) 2.命令行方式 Windows 1.点击“开始”->“运行”(快捷键Win+R). 2.启动:输入 net stop mysql 3.停止:输入 net start mysql 提示* Redhat Linux 也支持service command,启动:# servic