上一篇说道,在从日志提取出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. iOS 开发中中 textView 作为子控件点击输入文本,然后退出文本的方式

    方式1. 使用当双击输入的时候弹出键盘同时,使用手势和通知监听键盘的方法实现 代码如下: 1. 监听键盘通知 [[NSNotificationCenter defaultCenter] addObse ...

  2. 使用 Rx 中预定义的 Subject

    看到一幅有趣的关于 Rx 学习的图,想知道学习 Rx 的学习曲线?不,是峭壁! 我们可以直接通过 Rx 的 Observer 来创建 Observable 对象. 但是,使用这种方式往往比较复杂,在特 ...

  3. node.JS中配置http-server

    http-server 是一个简单的HTTP服务器, 基于 nodeJs,在nodejs命令行中配置http服务器. 项目结构:

  4. 三分钟跑起jsblocks

      1下载代码 git clone https://github.com/astoilkov/jsblocks-seed.git 2安装依赖 Peng@PENG-PC /F/home/qianduan ...

  5. phpopp

    <?php header("content-type:text/html;charset=utf8"); class lidepeng{ var $name; public ...

  6. php 语言特点

    PS:绝大多数用php的企业/ 项目 活不到雇佣得起月薪35k以上的php程序员那一天,也是php码农在10年经验的时候普遍不如java程序员的原因之一. PS2: 由于薪资提升太快,很多php码农跳 ...

  7. CSS菜单横竖布局要点

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

  8. mysql 查看数据库中所有表的记录数

    use information_schema; SELECT DISTINCT t.table_name, t.engine '表引擎', t.table_rowsFROM TABLES tWHERE ...

  9. WeakSelf宏的进化(转载)

    我们都知道在防止如block的循环引用时,会使用__weak关键字做如下定义: __weak typeof(self) weakSelf = self; 后来,为了方便,不用每次都要写这样一句固定代码 ...

  10. NVIC

    1中断:每一个中断都会对应一个服务程序 2NVIC 他的做用是负责中断优先级管理 3IP bit[7:4]每一个中断都有一个IP寄存器,用于设置中断相关的属性 AIRCR[10:8]只一个AIRCR寄 ...