说说使用mysqlbinlog按时间查询二进制日志时容易疏忽的地方
使用mysqlbinlog按时间查询二进制日志时,会用到start-datetime和stop-datetime选项。
提示:MySQL二进制日志的名称缺省是HOSTNAME-bin,不过推荐通过log-bin设置,以防止HOSTNAME更改所带来的影响。二进制日志的目录可以使用如下方法得到:
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
假设要查询2010-11-20全天的二进制日志的话,很多人会这么写:
shell> mysqlbinlog \
--start-datetime="2010-11-20 00:00:00" \
--stop-datetime="2010-11-20 23:59:59" \
/path/to/mysql/bin/log
不过这样写有问题,因为start-datetime是闭区间,stop-datetime是开区间,如果用数学表达式表示,类似:[start-datetime, stop-datetime),所以应该改为:
shell> mysqlbinlog \
--start-datetime="2010-11-20 00:00:00" \
--stop-datetime="2010-11-21 00:00:00" \
/path/to/mysql/bin/log
可惜还有问题,因为二进制日志是按照提交时间的先后顺序来记录的,而start-datetime和stop-datetime表示的时间是请求时间,所以从请求时间的角度看,有时会发生错乱。
为了演示此种情况,我们来做个实验:
首先确保MySQL已经激活了二进制日志:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
然后创建表:
mysql> user test;
mysql> create table foo ( id int ) engine=innodb;
注意:本例中使用的是innodb表类型。
如果现有二进制日志数据可以删除的话,运行如下命令以减少对后面操作的影响:
mysql> reset master;
接下来打开两个MySQL命令行:
先在第一个MySQL命令行中执行:
mysql> use test;
mysql> begin;
mysql> insert into foo values (1);
然后在第二个MySQL命令行中执行:
mysql> use test;
mysql> insert into foo values (2);
再回到第一个MySQL命令行中执行:
mysql> commit;
此时使用mysqlbinlog查询二进制日志,部分结果如下:
shell> mysqlbinlog /path/to/mysql/bin/log
# at 174
#101120 21:53:48 server id 1 end_log_pos 263 Query thread_id=92
use test/*!*/;
SET TIMESTAMP=1290261228/*!*/;
insert into foo values (2)
/*!*/;
# at 290
#101120 21:53:53 server id 1 end_log_pos 358 Query thread_id=73
SET TIMESTAMP=1290261233/*!*/;
BEGIN
/*!*/;
# at 358
#101120 21:53:36 server id 1 end_log_pos 447 Query thread_id=73
SET TIMESTAMP=1290261216/*!*/;
insert into foo values (1)
/*!*/;
二进制日志对应的时间分别是:
- 2010-11-20 21:53:48 (INSERT)
- 2010-11-20 21:53:53 (SET)
- 2010-11-20 21:53:36 (INSERT)
正好佐证了二进制日志是按照提交时间的先后顺序来记录的。
此时,不管以两个INSERT时间中的哪一个为stop-datetime,都查询不到这两条数据:
shell> mysqlbinlog \
--stop-datetime="22010-11-20 21:53:48" \
/path/to/mysql/bin/log
shell> mysqlbinlog \
--stop-datetime="2010-11-20 21:53:36" \
/path/to/mysql/bin/log
而如果以22010-11-20 21:53:48加1秒得到的2010-11-20 21:53:49为stop-datetime,则能查到2010-11-20 21:53:48的数据,但查不到2010-11-20 21:53:36的数据:
shell> mysqlbinlog \
--stop-datetime="2010-11-20 21:53:49" \
/path/to/mysql/bin/log
这是因为查询到2010-11-20 21:53:53的时候,mysqlbinlog就停止了。
以上就是使用mysqlbinlog按时间查询二进制日志时容易疏忽的地方。
建议继续学习:
- server日志的路径分析 (阅读:10203)
- AWStats简介:Apache/Windows IIS的日志分析工具的下载,安装,配置样例和使用(含6.9中文定义补丁) (阅读:8952)
- 利用脚本分析日志并利用snmp自定义OID,再通过cacti画图 (阅读:8747)
- tomcat catalina.out日志切割每天生成一个文件 (阅读:8135)
- 分布式日志系统scribe使用手记 (阅读:8097)
- AWStats是一个基于Perl的WEB日志分析工具。 (阅读:6161)
- 使用nginx记日志 (阅读:5175)
- 大于2GB的Listener.log和运行超过198天的主机上的Oracle实例 (阅读:4971)
- 在 shell 脚本里打日志 (阅读:4838)
- Sentry: 错误日志集中管理 (阅读:4415)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:老王 来源: 火丁笔记
- 标签: binlog 日志
- 发布时间:2010-11-21 19:47:30
- [69] Twitter/微博客的学习摘要
- [67] IOS安全–浅谈关于IOS加固的几种方法
- [66] 如何拿下简短的域名
- [65] android 开发入门
- [63] find命令的一点注意事项
- [62] Go Reflect 性能
- [61] 流程管理与用户研究
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [57] 读书笔记-壹百度:百度十年千倍的29条法则