mysqlbinlog按时间查询二进制日志时容易疏忽的地方
来源:互联网 发布:马哥2016百度云python 编辑:程序博客网 时间:2024/06/07 01:17
使用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=92use 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=73SET TIMESTAMP=1290261233/*!*/;BEGIN/*!*/;# at 358#101120 21:53:36 server id 1 end_log_pos 447 Query thread_id=73SET 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/logshell> 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按时间查询二进制日志时容易疏忽的地方。
from :http://blogread.cn/it/article/2725?f=wb
ps: 另外 stop-positon 则是闭区间
- mysqlbinlog按时间查询二进制日志时容易疏忽的地方
- 一些容易疏忽的地方
- struts2上传文件容易疏忽的地方
- mysqlbinlog查看二进制日志时的一个问题
- 单双引号的区别,defined容易疏忽的小地方
- 使用mysqlbinlog查看二进制日志的问题
- mysqlbinlog 查看二进制日志
- 使用mysqlbinlog提取二进制日志
- mysqlbinlog:用于处理二进制日志文件的实用工具
- mysqlbinlog:用于处理二进制日志文件的实用工具
- 容易疏忽的问题:CComVariant.ReadFromStream失败时的处理
- mysqlbinlog的日志类型
- mysql 按时间查询的
- 发按时的按时的按时地方按时地方按时的
- JAVA基础容易疏忽的知识点总结
- validate校验容易疏忽的问题
- 按时间模糊查询的问题
- 按时间查询的SQL语句
- 蓝桥-割圆
- TLD视觉跟踪算法
- S3C2440之内存
- C语言的位域
- C++必知必会之(4)STL
- mysqlbinlog按时间查询二进制日志时容易疏忽的地方
- 实时传输协议(RTP)和实时控制协议(RTCP)
- 编程的视频
- hdu 1026 Ignatius and the Princess I bfs+优先级队列
- Spring IoC容器--Bean的装配
- 中央处理器基本简介
- 归并排序
- 麦森数
- Windows下Critical Section、Event、Mutex、Semaphores区别