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

    上一篇说道,在从日志提取出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 }
原文地址:https://www.cnblogs.com/ddcoder/p/5801980.html