mysql row日志格式下 查看binlog sql语句

有时候咱们须要使用row做为binlog的日志格式,即配置文件使用了binlog_format= row 参数mysql

这样以来,咱们在查看数据库binlog内容时候,就看不到增删改查的具体语句了,在数据库恢复的时候sql

不利于咱们查找恢复数据点。数据库

使用row日志格式的日志:函数

能够看到都是一段段相似加密过的字符串同样,不要着急,其实sql真实语句就在这里这里,只不过性能

是通过64位编码转换后的内容,咱们使用mysqlbinlog对应的参数便可查看具体的sql内容:优化

 mysqlbinlog --base64-output=decode-rows -v --start-date="2017-08-12 15:00:19" --stop-date="2017-08-12 15:30:19" mysql-bin.000055

 

说明:--base64-ouput=decode-rows 表明解码编码

          -v 表明换行显示这些语句,若是没有-v 你依然看不到具体的语句加密

  --start-date 表明你要获取日志的开始时间spa

  --stop-date 表明你要获取日志的结束数据.net

备注:你也能够使用pos位置来查询必定阶段呢的日内容

结果:

能够查看到不少###开头的数据,这些就是具体的sql语句,只不过不是在一行而已,而是分行显示,已经不耽误咱们查看了。

 

binlog日志补习:

 

 binlog格式

binlog有三种格式:Statement、Row以及Mixed。

–基于SQL语句的复制(statement-based replication,SBR), 
–基于行的复制(row-based replication,RBR), 
–混合模式复制(mixed-based replication,MBR)。

2.1 Statement 
每一条会修改数据的sql都会记录在binlog中。

优势:不须要记录每一行的变化,减小了binlog日志量,节约了IO,提升性能。

缺点:因为记录的只是执行语句,为了这些语句能在slave上正确运行,所以还必须记录每条语句在执行的时候的一些相关信息,以保证全部语句能在slave获得和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有不少相关问题。

ps:相比row能节约多少性能与日志量,这个取决于应用的SQL状况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,可是考虑到若是带条件的update操做,以及整表删除,alter表等操做,ROW格式会产生大量日志,所以在考虑是否使用ROW格式日志时应该跟据应用的实际状况,其所产生的日志量会增长多少,以及带来的IO性能问题

2.2 Row

5.1.5版本的MySQL才开始支持row level的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。

优势: binlog中能够不记录执行的sql语句的上下文相关的信息,仅须要记录那一条记录被修改为什么了。因此rowlevel的日志内容会很是清楚的记录下每一行数据修改的细节。并且不会出现某些特定状况下的存储过程,或function,以及trigger的调用和触发没法被正确复制的问题.

缺点:全部的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。

ps:新版本的MySQL中对row level模式也被作了优化,并非全部的修改都会以row level来记录,像遇到表结构变动的时候就会以statement模式来记录,若是sql语句确实就是update或者delete等修改数据的语句,那么仍是会记录全部行的变动

2.3 Mixed

从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。

在Mixed模式下,通常的语句修改使用statment格式保存binlog,如一些函数,statement没法完成主从复制的操做,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

相关文章
相关标签/搜索