zoukankan      html  css  js  c++  java
  • 用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 }
  • 相关阅读:
    算法之递归(4) 应用
    算法之递归(1)
    [Async] [Series #1] 初识Async异步编程模型。
    CVE202142287/CVE202142278 复现
    易读文库下载器1.2版发布
    Sqlite.net 读取DateTime异常的解决方案
    QZFL 2.0.5 源代码
    Sqlite 管理工具 SQLiteDeveloper 及破解
    visio2010数据库正向工程生成数据库脚本
    什么是高内聚、低耦合?
  • 原文地址:https://www.cnblogs.com/ddcoder/p/5801980.html
Copyright © 2011-2022 走看看