由于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 ....,的命令保留,动态生成备份恢复脚本.
|
|