a5656456 发表于 2015-10-3 17:00:32

推荐没有虚拟主机的小巧的Mysql数据库备份脚本(PHP)

最近工作中常常需要备份远程服务器上的Mysql数据库到本机,一开始采用直接备份Mysql的data目录的办法,但由于编码不同的原因经常产生问题。后来朋友推荐我使用一个非常方便小巧的PHP程序——MyDB。一共包含三个文件:
1. mydb.php //DB类
复制代码 代码如下:
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 //备份脚本
复制代码 代码如下:



数据备份
备份方式
      备份全部数据备份全部数据表中的数据到一个备份文件
备份单张表数据
      请选择
          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 //还原脚本
复制代码 代码如下:



数据恢复

从服务器文件恢复
    -请选择-
$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。
·安全起见,脚本不用时候记得从服务器上删除。
打包文件下载

pi5aIndief 发表于 2015-10-3 17:00:40

很不错

fgoi9w66pjm 发表于 2015-10-3 16:21:05

不错!不错!不错!不错!不错!

Allieoy1x8 发表于 2015-10-3 16:13:05

支持,赞一个支持,赞一个

tgcxd68djm 发表于 2015-10-3 16:13:41

发发呆,回回帖,工作结束~

ziyinuo512 发表于 2015-10-3 16:31:33

现在正在找电子商务的方案,谢谢分享

dgk99r8d8r6 发表于 2015-10-3 17:24:44

难得一见的好帖

fsjit9y5q 发表于 2015-10-3 17:35:29

大人,此事必有蹊跷!

yhpdful544 发表于 2015-10-3 17:13:57

支持支持再支持

g5452wj4g 发表于 2015-10-3 17:24:39

小白一个 顶一下
页: [1] 2
查看完整版本: 推荐没有虚拟主机的小巧的Mysql数据库备份脚本(PHP)