此命令用来解析 查看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
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,用于数据库恢复等等。