使用MySQLBinlog按时间查询二进制日志时易疏忽的地方

标签: Technical MySQL MySQLBinlog | 发表时间:2010-11-20 22:49 | 作者:老王 Eneri
出处:http://huoding.com

使用mysqlbinlog按时间查询二进制日志时,会用到start-datetimestop-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> USE 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

#101120 21:53:48
SET TIMESTAMP=1290261228/*!*/;
INSERT INTO foo VALUES (2)
/*!*/;

#101120 21:53:53
SET TIMESTAMP=1290261233/*!*/;
BEGIN
/*!*/;

#101120 21:53:36
SET TIMESTAMP=1290261216/*!*/;
INSERT INTO foo VALUES (1)
/*!*/;

#101120 21:53:53
COMMIT/*!*/;

二进制日志对应的时间分别是:

  1. 2010-11-20 21:53:48 (INSERT)
  2. 2010-11-20 21:53:53 (BEGIN)
  3. 2010-11-20 21:53:36 (INSERT)
  4. 2010-11-20 21:53:53 (COMMIT)

注意:BEGIN和COMMIT的时间是一样的,并且大于等于中间语句的时间,如此一来,确保BEGIN和COMMIT在按stop-datetime查询时是一个整体。如果使用stop-position,并在事务中间某位置停止,结果如何留给大家自己测试。

此时,不管以两个INSERT时间中的哪一个为stop-datetime,都查询不到INSERT数据:

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

这是因为stop-datetime是开区间的缘故。

而如果以2010-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按时间查询二进制日志时易疏忽的地方。

相关 [mysqlbinlog 时间 二进制] 推荐:

使用MySQLBinlog按时间查询二进制日志时易疏忽的地方

- Eneri - 火丁笔记
使用mysqlbinlog按时间查询二进制日志时,会用到start-datetime和stop-datetime选项. 提示:MySQL二进制日志的名称缺省是HOSTNAME-bin,不过推荐通过log-bin设置,以防止HOSTNAME更改所带来的影响. 二进制日志的目录可以使用如下方法得到:. 假设要查询2010-11-20全天的二进制日志的话,很多人会这么写:.

彻底挖掘mysqlbinlog数据内容

- - CSDN博客数据库推荐文章
平时工作需要查询mysqlbinlog里面哪个库,哪个表在什么时间更新了什么数据,而通过mysqlbinlog转义过来的文件里面数据太乱,很多注释,而且也没有表结构相关字段,都用@1,@2等类似的方式显示,就想到通过python开发一个这样的功能. 先通过mysqlbinlog转义二进制日志binlog文件,保存为一份临时文件(执行完后删除).

C++ 工程实践(4):二进制兼容性

- 山石 - C++博客-首页原创精华区
陈硕 (giantchen_AT_gmail). 本文主要讨论 Linux x86/x86-64 平台,偶尔会举 Windows 作为反面教材. C/C++ 的二进制兼容性 (binary compatibility) 有多重含义,本文主要在“头文件和库文件分别升级,可执行文件是否受影响”这个意义下讨论,我称之为 library (主要是 shared library,即动态链接库)的 ABI (application binary interface).

Android计算器低级错误?都是二进制惹的祸!

- maxiyun - 果壳网 guokr.com - 果壳网
Android 计算器惊现超级大 bug. 在 Android 的计算器程序里输入 14.52 - 14.49,计算器竟然说它等于 0.0299999999. 其实,这已经是计算机的老毛病了. 计算机用二进制来表示数,将会不可避免地产生误差. 听说了 Android 的超级大 bug,我立即在自己的 HTC Hero 上试了一下,果然正如众人所说, 14.52 - 14.49 = 0.0299999999.

MySQL复制(一) --- 二进制日志干什么的

- We_Get - 博客园-首页原创精华区
与小站点相比,大型站点的数据库管理员,需要提前做好以下的事情:. 提供灾难发生时核心业务数据的恢复计划. 理论上这个过程至少需要执行一次. 通过采集大量用户数据并监控网站各节点的负载,提供优化计划. 当用户数量急剧增长时的快速横向扩展计划. 对于所有这些事情,提前计划并准备好必要时的快速应对是很重要的.

暗时间

- myartings - 微软亚洲研究院
刘未鹏,Mindhacks帮主,在这块自留地上笔耕不辍了八年. 他从2003年在《程序员》杂志上发表第一篇技术文章,并开始在CSDN写技术博客. 起初的博客较短,也较琐碎,并夹杂着一些翻译的文章,后来才慢慢开始有了一些自己的心得和看法. 八年来,虽然平均每个月写1篇或者更少,但他从未停止. 写博客这件事情,给他带来的最大体会就是,一件事情如果你能够坚持做8年,那么不管效率和频率多低,最终总能取得一些很可观的收益.

WebLogic之Java反序列化漏洞利用实现二进制文件上传和命令执行

- - WooYun知识库
Java反序列化漏洞由来已久,在WebLogic和JBoss等著名服务器上都曝出存在此漏洞. FoxGlove Security安全团队的breenmachine给出了详细的分析,但没有给出更近一步的利用方式. 前段时间rebeyond在不需要连接公网的情况下使用RMI的方式在WebLogic上实现了文本文件上传和命令执行,但没有实现二进制文件上传.

时间与空间

- 马都 - 博客李淼
(《Vision》文章,勿转). 时间与空间这两个概念是物理学的基石,也是我们人类甚至动物依靠直觉就具备的概念. 我们判断一个物体的位置,我们从一个地点走到另一个地点,涉及到空间这个概念. 在小学,我们就开始学习一些简单的几何概念,例如三角形,三角形中的三个角有锐角、钝角和直角. 到了中学,我们还学一点立体几何和解析几何.

linux时间同步

- - BlogJava-首页技术区
第一步的意思是设置时间,设置完了可以用date命令查看对不对...注意是月日时分年  . 第二步的意思是写入主板的rtc芯片..  . su -c 'date -s 月/日/年'  . su -c 'date -s 时:分:秒'  . 由于Linux时钟和Windows时钟从概念的分类、使用到设置都有很大的不同,所以,搞清楚Linux时钟的工作方式与设置操作,不仅对于Linux初学者有着重大意义,而且对于使用Linux服务器的用户来说尤为重要.