上一篇说道,在从日志提取出SQL语句的时候,碰到了一句SQL跨了N行无法提取。后来在网上搜了两句shell:

sed -n '/^INSERT /,/;/p' log.sql > log_insert.sql

sed -n '/^UPDATE /,/;/p' log.sql > log_update.sql

后经实践发现,这两句shell也是有缺陷的。这个问题是必须解决的,今天就趁这机会用php实现了跨行SQL的提取。注释已经很明了了,只需要注意变量$action为提取的SQL语句头,如DELETE、INSERT、UPDATE等,而变量$table为表名。

过后我还会找时间写个shell版本,尽量用最简洁的方式来实现,本菜自己也很期等啊。

 w1 <?php
//需要用mysqlbinlog将二进制文件转为要阅读明文
//第45行得到的$sql变量为过滤后的干净的sql
//有些二进制日志的sql后会有5个非可见字符,有些日志里却没有,暂时不知道什么原因,请自行开启filter_sql过滤的注释
//只要实现proc_sql函数,即可对最终的sql变量进行处理 $action='INSERT';
$table='table'; $fp=fopen('bin_log.txt','rb+');
if(!$fp) exit('ERR: file error');
$delimiter='/*!*/;'.chr(0x0a); //
while(!feof($fp))
{
$sql='';
$str=fgets($fp,8192);
if(strstr($str,$action) && strstr($str,$table))
{
$sql=$str; while(!feof($fp))
{
if(substr($sql,-7)==$delimiter)
{
$sql=substr($sql,0,-7);
break;
} $str=fgets($fp,8192);
$sql.=$str;
} if(feof($fp))
{
if(substr($sql,-7)==$delimiter)
{
$sql=substr($sql,0,-7);
break;
}
} $sql=fileter_sql($sql);
proc_sql($sql);
}
} fclose($fp); function fileter_sql($sql)
{
return $sql;
//return substr($sql,0,-5);
} function proc_sql($sql)
{
echo $sql,PHP_EOL,PHP_EOL,PHP_EOL;
}

用PHP提取MYSQL二进制日志的SQL语句的更多相关文章

  1. MySQL二进制日志总结

    二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...

  2. MySQL二进制日志(binary log)总结

    本文出处:http://www.cnblogs.com/wy123/p/7182356.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  3. MySQL二进制日志的备份和恢复

    二进制日志:记录数据库修改的相关操作,作用是即时点回复,主从复制 可以按时间滚动,也可以按大小滚动 server-id:服务器身份标识 一.二进制文件的删除方法,千万不要手动删除 PURGE BINA ...

  4. MySQL二进制日志功能介绍

    二进制日志记录所有更新数据的SQL语句,其中也包含可能更新数据的SQL语句,例如DELETE语句执行过程中无匹配的行.二进制日志中还包含了与执行SQL语句相关的内容,例如SQL语句执行的时间.错误代码 ...

  5. MySQl Study学习之--MySQl二进制日志管理

    MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log)   a.它包括的内容及作用例如以下:     包括了全部更新了数据或者已经潜在更新了数据(比方没 ...

  6. Mysql 二进制日志备份还原

    Mysql 二进制日志备份还原 一.开启二进制日志 1.进入配置文件[mysqld]下添加配置 方案一 vim /etc/my.cnf log-bin = /usr/local/mysql/logs/ ...

  7. mysql 二进制日志后缀数字最大为多少

    之前看到mysql二进制日志后面会加一个以数字递增为结尾的后缀,一直在想当尾数到达999999后会发生什么情况,先查了一下官网,对后缀有这样一句介绍:The server creates binary ...

  8. 删除MySQL二进制日志

    服务器上的120G SSD硬盘空间用了92%,检查后发现,原来是 MySQL的二进制日志没有及时清除,占用了大量的空间, 于是直接用命令:reset master 一把删干净了. 1 reset ma ...

  9. 查看mysql二进制日志报错问题

    在排查网站被黑时想通过Mysql二进制日志找出修改字段时间,但是使用mysqlbinlog报错: [root@zfszsw1 bin]# ./mysqlbinlog /opt/mysql-bin.00 ...

随机推荐

  1. spring启用线程空指针异常

    在service里启用了一个线程,线程的run方法调用了service的方法,报了空指针异常,不知道怎么回事.不过貌似是spring的注入问题,只要在线程里调用了dao或者service里的某些方法, ...

  2. 结构-行为-样式-Javascript笔记

    一.console.dir()可以显示一个对象所有的属性和方法. 二.递归遍历一个数据集合: A.数据: {  "menu": [    {      "menuId&q ...

  3. 驱动10.nor flash

    1 比较nor/nand flash NOR                                  NAND接口:    RAM-Like,引脚多                 引脚少, ...

  4. sw代码问题

    1.环境版本问题,myeclipse 配 jdk1.7  不能用jdk1.8 :jdk1.6满足不了代码本身 报错为:The type java.io.ObjectInputStream cannot ...

  5. 在转换为 UTC 时大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值无法系列化为 JSON

    看到这个错往往会感到莫名其妙! 其原因其实是数据库的DateTime最小值和C#的DateTime不一样 Sql Server DateTime 类型必须介于 1/1/1753 12:00:00 AM ...

  6. oc内容5大区

    1.堆区(malloc):不需要手动管理内存,自动管理 2.栈区(stack):需要手动管理内存 3.静态区 4.常量区 5.方法区 load类方法:把类加载进内存的时候调用,只会调用一次 initi ...

  7. CSS菜单横竖布局要点

    菜单纵向:把ul 元素的边框属性去除,li元素用border-top  上边框显示分离,把a 元素用display:block  text-decoration:none  去除默认下划线 菜单横向: ...

  8. 我理解的session和cookie

    tomcat管理session 理解tomcat是如何生成session的. 当用户请求到web资源有request.getSession()这段代码的时候,request首先会对请求的url判读是否 ...

  9. Chapter 2 Open Book——37

    I couldn't concentrate on Mike's chatter as we walked to Gym, and RE. didn't do much to hold my atte ...

  10. Haskell Json数据处理

    json的基本类型为——string, numbers, Booleans以及null,定义json类型如下 -- file: Json.hs module Json where data JValu ...