首页 > 数据库技术 > 详细

用PHP提取MYSQL二进制日志的SQL语句

时间:2016-08-24 11:05:09      阅读:248      评论:0      收藏:0      [点我收藏+]

    上一篇说道,在从日志提取出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
 2 //需要用mysqlbinlog将二进制文件转为要阅读明文
 3 //第45行得到的$sql变量为过滤后的干净的sql
 4 //有些二进制日志的sql后会有5个非可见字符,有些日志里却没有,暂时不知道什么原因,请自行开启filter_sql过滤的注释
 5 //只要实现proc_sql函数,即可对最终的sql变量进行处理
 6 
 7 $action=‘INSERT‘;
 8 $table=‘table‘;
 9 
10 
11 $fp=fopen(‘bin_log.txt‘,‘rb+‘);
12 if(!$fp) exit(‘ERR: file error‘);
13 $delimiter=‘/*!*/;‘.chr(0x0a);
14 
15 //
16 while(!feof($fp))
17 {
18     $sql=‘‘;
19     $str=fgets($fp,8192);
20     if(strstr($str,$action) && strstr($str,$table))
21     {
22         $sql=$str;
23         
24         while(!feof($fp))
25         {
26             if(substr($sql,-7)==$delimiter)
27             {
28                 $sql=substr($sql,0,-7);
29                 break;
30             }
31             
32             $str=fgets($fp,8192);
33             $sql.=$str;
34         }
35         
36         if(feof($fp))
37         {
38             if(substr($sql,-7)==$delimiter)
39             {
40                 $sql=substr($sql,0,-7);
41                 break;
42             }
43         }
44         
45         $sql=fileter_sql($sql);
46         proc_sql($sql);
47     }
48 }
49 
50 
51 
52 fclose($fp);
53 
54 function fileter_sql($sql)
55 {
56     return $sql;
57     //return substr($sql,0,-5);
58 }
59 
60 function proc_sql($sql)
61 {
62     echo $sql,PHP_EOL,PHP_EOL,PHP_EOL;
63 }

 

用PHP提取MYSQL二进制日志的SQL语句

原文:http://www.cnblogs.com/ddcoder/p/5801980.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!