mysqlbinlog 命令简单使用

此命令用来解析 查看mysql binlog的, 这里使说说怎么通过binlog查看执行的sql。

环境: Centos 6.6, MySQL 5.6.x

查看配置

查看二进制日志是否打开,本地是关的(开启需要 配置my.conf并重启)

mysql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

查看binlog 文件的目录位置

mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| datadir       | /usr/local/var/mysql/ |
+---------------+-----------------------+
1 row in set (0.01 sec)

使用

bin.000025 是当前的binlog文件(判断哪个是最新的binlog可以通过文件序号,最后修改时间,或者 show master status 等), 现在来查询一段时间的binlog, 下面的命令中时 的开闭区间 [start,end) 结束是开区间

mysqlbinlog --start-datetime="2017-01-09 17:50:00" --stop-datetime="2017-01-09 18:00:00" bin.000025

输出的结果截取

BINLOG '
Hl9zWBMLAAAAPAAAAAoQnCoAAMgBAAAAAAEABnphYmJpeAAMaGlzdG9yeV91aW50AAQIAwgDAADw
cgqe
Hl9zWB4LAAAAVQAAAF8QnCoAAMgBAAAAAAEAAgAE//AKXQAAAAAAAB5fc1jwwwsAAAAAAOSWlxrw
zlwAAAAAAAAeX3NYbwEAAAAAAAAD4tsaJ0P8ZA==
'/*!*/;
# at 714870879
#170109 17:59:58 server id 11  end_log_pos 714870910 CRC32 0x5b63f120 Xid = 162453362
COMMIT/*!*/;
# at 714870910
#170109 17:59:59 server id 11  end_log_pos 714870984 CRC32 0xce129055 Querythread_id=4225992exec_time=0error_code=0
SET TIMESTAMP=1483955999/*!*/;
BEGIN
/*!*/;
# at 714870984
#170109 17:59:59 server id 11  end_log_pos 714871044 CRC32 0x3eb36889 Table_map: `zabbix`.`history_uint` mapped to number 456
# at 714871044
#170109 17:59:59 server id 11  end_log_pos 714871129 CRC32 0x935697d9 Write_rows: table id 456 flags: STMT_END_F

上面的结果什么都看不出来,也就能看看时间戳。如果我们想看到sql怎么办呢?

shell> mysqlbinlog --start-datetime="2017-01-09 17:55:00" --stop-datetime="2017-01-09 18:00:00" --base64-output=decode-rows --verbose bin.000025

请参考 why-base64-outputdecode-rows-does-not-print-row-events-in-mysql-binary-logs,使用 -vv 时候可以看到 每一列的 metadata

shell > mysqlbinlog --start-datetime="2017-01-09 17:55:00" --stop-datetime="2017-01-09 18:00:00" --base64-output=decode-rows -vv bin.000025
BEGIN
/*!*/;
# at 714870984
#170109 17:59:59 server id 11  end_log_pos 714871044 CRC32 0x3eb36889 Table_map: `zabbix`.`history_uint` mapped to number 456
# at 714871044
#170109 17:59:59 server id 11  end_log_pos 714871129 CRC32 0x935697d9 Write_rows: table id 456 flags: STMT_END_F
### INSERT INTO `zabbix`.`history_uint`
### SET
###   @1=23819 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2=1483955999 /* INT meta=0 nullable=0 is_null=0 */
###   @3=0 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @4=449991738 /* INT meta=0 nullable=0 is_null=0 */
### INSERT INTO `zabbix`.`history_uint`
### SET
###   @1=23699 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2=1483955999 /* INT meta=0 nullable=0 is_null=0 */
###   @3=6859 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @4=452873813 /* INT meta=0 nullable=0 is_null=0 */
# at 714871129
#170109 17:59:59 server id 11  end_log_pos 714871160 CRC32 0x4dd16404 Xid = 162453369
COMMIT/*!*/;

上面提到的一些命令选项,更多的请查看 mysqlbinlog –help

--start-datetime 开始时间
--stop-datetime  结束时间
--database=resource 选择数据库
--result-file 结果输出到某个文件
--base64-output=decode-rows 
--verbose 

小技巧

查看binlog的实时语句

mysqlbinlog 实现 tail -f的效果(效果不是特别理想)

shell > export D=$(date +"%Y-%m-%d %H:%M:%S" --date="1 minutes ago"); watch "mysqlbinlog --start-datetime=\"$D\" --base64-output=decode-rows -v bin.000025|tail -n 50"

主要是看下数据库大概在做什么(主要关注dml语句,查询语句无法看到)

export D=$(date +"%Y-%m-%d %H:%M:%S" --date="1 minutes ago"); \
watch "mysqlbinlog --start-datetime=\"$D\" --base64-output=decode-rows -v mysql-bin.000503 \
|tail -n 100 \
|grep --color -E '^(UPDATE|INSERT|DELETE)'"

也可以通过偏移量来选取log,也可以获取远程的数据库的binlog,或者 结合文本工具可以解析导出sql,用于数据库恢复等等。

Ref

  • https://www.percona.com/blog/2015/07/30/why-base64-outputdecode-rows-does-not-print-row-events-in-mysql-binary-logs/
  • https://www.zybuluo.com/haokuixi/note/23925 mysqlbinlog 工具的使用,导出数据,编码转化等

你可能感兴趣的:(MySQL)