应用正则表达式生成MySQL差异备份


   由于MySQL不具备如MS SQLSERVER那样的完善的备份功能,用MySQL做数据库服务器的备
份只能使用select into outfile 或 用mysqldump 生成外部文件进行全部备份,而无差异
备份功能,分析了MySQL的 .log文件后得出解决方案,用PHP代码萃取log中的与数据库应用
程序相关的信息,实现在数据库系统崩溃或完整性被破坏后备份的恢复,本文只给出其关键
步骤

<pre>
<?
$ptn
="^([0-9]{1,8}[ ]|\t)";
$ptn.="([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\t|\t)";
$ptn.="([ ]{1,16})";
$ptn.="([0-9]{1,10})";
$ptn.=" (Connect|Query|Quit|Init DB|Processlis)[ ]{1,16}";
$ptn.="([a-zA-Z].*)$";

//$sql="010401 10:52:43          1 Query      show status ";
//$sql="              1 Query      show status";
//ereg($ptn,$sql,$kk);
//for($i=0;$i<10;$i++)
//echo $i.".".$kk[$i]."<br>";
//die();

设有script已将 MySQL .log copy 到与处理程序同一路径下
$fp
=fopen("domain.log","r");
while(!
feof($fp))
{
$d=fgets($fp,1024);
$d[strlen($d)-1]=' ';
//本步是过滤器,式中$k[4]为Link id $k[5]为执行类别 $k[6]为SQL命令或
//与执行类别相关的数据库名
if(ereg($ptn,$d,$k))echo "$k[4] and $k[5] and $k[6]\n";
//echo $d."\n";
}

?>
.log 的结构
Time        Id    Command   Argument

command 有以下值Connect,Query,Quit,Init DB,Processlis
观察后前4项对我们有用
Command      Argument
Connect       用户@连接的客户端地址
Init DB       用户要连的名字
Query         SQL语句
Quit          

   对程序返回的结果入库,根据其属性采取必要的二次过滤,除掉show ...,
select ....,的命令保留,动态生成备份恢复脚本.