| 
 | 
 
最近工作中常常需要备份远程服务器上的Mysql数据库到本机,一开始采用直接备份Mysql的data目录的办法,但由于编码不同的原因经常产生问题。后来朋友推荐我使用一个非常方便小巧的PHP程序——MyDB。一共包含三个文件: 
1. mydb.php //DB类 
[U]复制代码[/U] 代码如下: 
linkid)  @$this->linkid = mysql_connect($host, $username, $password) or die("连接服务器失败.");  
    @mysql_select_db($database,$this->linkid) or die("无法打开数据库");  
    return $this->linkid;}  
function query($sql)  
    {if($this->sqlid=mysql_query($sql,$this->linkid)) return $this->sqlid;  
    else {  
        $this->err_report($sql,mysql_error);  
    return false;}  
    }  
function nr($sql_id="")  
    {if(!$sql_id) $sql_id=$this->sqlid;  
    return mysql_num_rows($sql_id);}  
function nf($sql_id="")  
    {if(!$sql_id) $sql_id=$this->sqlid;  
    return mysql_num_fields($sql_id);}  
function nextrecord($sql_id="")  
    {if(!$sql_id) $sql_id=$this->sqlid;  
    if($this->record=mysql_fetch_array($sql_id))  return $this->record;  
    else return false;  
    }  
function f($name)  
    {  
    if($this->record[$name]) return $this->record[$name];  
    else return false;  
    }  
function close() {mysql_close($this->linkid);}  
function lock($tblname,$op="WRITE")  
    {if(mysql_query("lock tables ".$tblname." ".$op)) return true; else return false;}  
function unlock()  
    {if(mysql_query("unlock tables")) return true; else return false;}  
function ar() {  
    return @mysql_affected_rows($this->linkid);  
  }  
function i_id() {  
        return mysql_insert_id();  
    }  
function err_report($sql,$err)  
    {  
echo "Mysql查询错误 
";  
echo "查询语句:".$sql." 
";  
echo "错误信息:".$err;  
    }  
/****************************************类结束***************************/  
}?> 
2. backup.php //备份脚本 
[U]复制代码[/U] 代码如下: 
 
 
  | 数据备份 |  | 备份方式 |  |         备份全部数据 | 备份全部数据表中的数据到一个备份文件 |  备份单张表数据   
        请选择  
          query("show table status from $mysqldb");  
        while($d->nextrecord()){  
        echo "f('Name')."'>".$d->f('Name')."";}  
        ?>  
         | 备份选中数据表中的数据到单独的备份文件 |  | 使用分卷备份 |   
        分卷备份 K |  | 选择目标位置 |  | 备份到服务器 |   
        备份到本地 |   |  
  
query("show table status from $mysqldb"))  
    {$msgs[]="读数据库结构错误"; show_msg($msgs); pageend();}  
$sql="";  
while($d->nextrecord($tables))  
    {  
    $table=$d->f("Name");  
    $sql.=make_header($table);  
    $d->query("select * from $table");  
    $num_fields=$d->nf();  
    while($d->nextrecord())  
    {$sql.=make_record($table,$num_fields);}  
    }  
$filename=date("Ymd",time())."_all.sql";  
if($_POST['weizhi']=="localpc") down_file($sql,$filename);  
elseif($_POST['weizhi']=="server")  
    {if(write_file($sql,$filename))  
$msgs[]="全部数据表数据备份完成,生成备份文件'./backup/$filename'";  
    else $msgs[]="备份全部数据表失败";  
    show_msg($msgs);  
    pageend();  
    }  
/*-----------------不要卷结束*/}/*-----------------------*/  
/*-----------------分卷*/else{/*-------------------------*/  
if(!$_POST['filesize'])  
    {$msgs[]="请填写备份文件分卷大小"; show_msg($msgs);pageend();}  
if(!$tables=$d->query("show table status from $mysqldb"))  
    {$msgs[]="读数据库结构错误"; show_msg($msgs); pageend();}  
$sql=""; $p=1;  
$filename=date("Ymd",time())."_all";  
while($d->nextrecord($tables))  
{  
    $table=$d->f("Name");  
    $sql.=make_header($table);  
    $d->query("select * from $table");  
    $num_fields=$d->nf();  
    while($d->nextrecord())  
    {$sql.=make_record($table,$num_fields);  
    if(strlen($sql)>=$_POST['filesize']*1000){  
            $filename.=("_v".$p.".sql");  
            if(write_file($sql,$filename))  
            $msgs[]="全部数据表-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";  
            else $msgs[]="备份表-".$_POST['tablename']."-失败";  
            $p++;  
            $filename=date("Ymd",time())."_all";  
            $sql="";}  
    }  
}  
if($sql!=""){$filename.=("_v".$p.".sql");          
if(write_file($sql,$filename))  
$msgs[]="全部数据表-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";}  
show_msg($msgs);  
/*---------------------分卷结束*/}/*--------------------------------------*/  
/*--------备份全部表结束*/}/*---------------------------------------------*/  
/*--------备份单表------*/elseif($_POST['bfzl']=="danbiao"){/*------------*/  
if(!$_POST['tablename'])  
    {$msgs[]="请选择要备份的数据表"; show_msg($msgs); pageend();}  
/*--------不分卷*/if(!$_POST['fenjuan']){/*-------------------------------*/  
$sql=make_header($_POST['tablename']);  
$d->query("select * from ".$_POST['tablename']);  
$num_fields=$d->nf();  
while($d->nextrecord())  
    {$sql.=make_record($_POST['tablename'],$num_fields);}  
$filename=date("Ymd",time())."_".$_POST['tablename'].".sql";  
if($_POST['weizhi']=="localpc") down_file($sql,$filename);  
elseif($_POST['weizhi']=="server")  
    {if(write_file($sql,$filename))  
$msgs[]="表-".$_POST['tablename']."-数据备份完成,生成备份文件'./backup/$filename'";  
    else $msgs[]="备份表-".$_POST['tablename']."-失败";  
    show_msg($msgs);  
    pageend();  
    }  
/*----------------不要卷结束*/}/*------------------------------------*/  
/*----------------分卷*/else{/*--------------------------------------*/  
if(!$_POST['filesize'])  
    {$msgs[]="请填写备份文件分卷大小"; show_msg($msgs);pageend();}  
$sql=make_header($_POST['tablename']); $p=1;   
    $filename=date("Ymd",time())."_".$_POST['tablename'];  
    $d->query("select * from ".$_POST['tablename']);  
    $num_fields=$d->nf();  
    while ($d->nextrecord())   
    {      
        $sql.=make_record($_POST['tablename'],$num_fields);  
       if(strlen($sql)>=$_POST['filesize']*1000){  
            $filename.=("_v".$p.".sql");  
            if(write_file($sql,$filename))  
            $msgs[]="表-".$_POST['tablename']."-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";  
            else $msgs[]="备份表-".$_POST['tablename']."-失败";  
            $p++;  
            $filename=date("Ymd",time())."_".$_POST['tablename'];  
            $sql="";}  
    }  
if($sql!=""){$filename.=("_v".$p.".sql");          
if(write_file($sql,$filename))  
$msgs[]="表-".$_POST['tablename']."-卷-".$p."-数据备份完成,生成备份文件'./backup/$filename'";}  
show_msg($msgs);  
/*----------分卷结束*/}/*--------------------------------------------------*/  
/*----------备份单表结束*/}/*----------------------------------------------*/  
/*---*/}/*-------------主程序结束------------------------------------------*/  
function write_file($sql,$filename)  
{  
$re=true;  
if(!@$fp=fopen("./backup/".$filename,"w+")) {$re=false; echo "failed to open target file";}  
if(!@fwrite($fp,$sql)) {$re=false; echo "failed to write file";}  
if(!@fclose($fp)) {$re=false; echo "failed to close target file";}  
return $re;  
}  
function down_file($sql,$filename)  
{  
    ob_end_clean();  
    header("Content-Encoding: none");  
    header("Content-Type: ".(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ? 'application/octetstream' : 'application/octet-stream'));  
    header("Content-Disposition: ".(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ? 'inline; ' : 'attachment; ')."filename=".$filename);  
    header("Content-Length: ".strlen($sql));  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    echo $sql;  
    $e=ob_get_contents();  
    ob_end_clean();  
}  
function writeable($dir)  
{  
    if(!is_dir($dir)) {  
    @mkdir($dir, 0777);  
    }  
    if(is_dir($dir))   
    {  
    if($fp = @fopen("$dir/test.test", 'w'))  
        {  
@fclose($fp);  
    @unlink("$dir/test.test");  
    $writeable = 1;  
}   
    else {  
$writeable = 0;  
    }  
}  
    return $writeable;  
}  
function make_header($table)  
{global $d;  
$sql="DROP TABLE IF EXISTS ".$table."\n";  
$d->query("show create table ".$table);  
$d->nextrecord();  
$tmp=preg_replace("/\n/","",$d->f("Create Table"));  
$sql.=$tmp."\n";  
return $sql;  
}  
function make_record($table,$num_fields)  
{global $d;  
$comma="";  
$sql .= "INSERT INTO ".$table." VALUES(";  
for($i = 0; $i record[$i])."'"); $comma = ",";}  
$sql .= ")\n";  
return $sql;  
}  
function show_msg($msgs)  
{  
$title="提示:";  
echo "";  
echo "".$title."";  
echo " 
";  
while (list($k,$v)=each($msgs))  
    {  
    echo "".$v."";  
    }  
echo "";  
}  
function pageend()  
{  
exit();  
}  
?>  
3. restore.php //还原脚本 
[U]复制代码[/U] 代码如下: 
 
 
| 数据恢复 |   
从服务器文件恢复 |  
    -请选择-  
$file";}  
closedir($handle);   
?>  
    |  |        从本地文件恢复 |  |   |  
  
query(trim($sql))) return false;  
    }  
return true;  
}  
function show_msg($msgs)  
{  
$title="提示:";  
echo "";  
echo "".$title."";  
echo " 
";  
while (list($k,$v)=each($msgs))  
    {  
    echo "".$v."";  
    }  
echo "";  
}  
function pageend()  
{  
exit();  
}  
?>  
文件结构非常清晰,只要在文件2和3里面设置好数据库服务器的地址、用户名、密码就可以备份还原数据了。需要注意的是: 
·使用时候要在同级目录下建一个Backup目录,权限需要可写,用于存放导出的脚本。 
·当备份的数据库比较大的时候,服务器脚本超时时间要调大一些。 
·支持分卷备份,还原时候只要选择分卷备份的第一个脚本就会自动还原所有的脚本。 
·分卷文件大小不要太大,最好不超过2MB。 
·安全起见,脚本不用时候记得从服务器上删除。 
打包文件下载 
 |   
 
 温馨提示:
1、本站所有信息都来源于互联网有违法信息与本网站立场无关。 
2、当有关部门,发现本论坛有违规,违法内容时,可联系站长删除,否则本站不承担任何责任。 
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。 
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 
5、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意 
6、如果使用本帖附件,本站程序只提供学习使用,请24小时内删除!使用者搭建运营触犯法律,违法,违规,本站不承担任何责任。 
 
 
 |