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