zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

详解MYSQL的备份还原(PHP实现)

mysqlPHP备份 实现 详解 还原
2023-06-13 09:15:00 时间
手把手教你实现MYSQL的备份还原
示例代码用我比较熟悉的PHP,当然你看完并理解了其中的思路,相信你也可以快速地用你熟悉的语言自己写出来。
一、新建dbBackup类,设置默认参数。
复制代码代码如下:

classdbBackup{
   public$host="localhost";   //数据库地址
   public$user="root";   //登录名
   public$pwd="";   //密码
   public$database;   //数据库名
   public$charset="utf8";   //数据库连接编码:mysql_set_charset
}

二、添加数据库连接function。
复制代码代码如下:

/**
    *连接数据库...
    */
   functiondb(){       
       $con=mysql_connect($this->host,$this->user,$this->pwd);
       if(!$con){
           die("Couldnotconnect");
       }

       $db_selected=mysql_select_db($this->database,$con);
       if(!$db_selected){
           die("Can\"tuseselectdb");
       }

       mysql_set_charset($this->charset);  //设置编码

       return$con;
   }

三、查询数据库表集合
复制代码代码如下:
/**
    *表集合...
    */
   functiontblist(){
       $list=array();

       $rs=mysql_query("SHOWTABLESFROM$this->database");
       while($temp=mysql_fetch_row($rs)){
           $list[]=$temp[0];
       }

       return$list;
   }

四、查询表结构
复制代码代码如下:
/**
    *表结构SQL...
    */
   functionsqlcreate(){
       $sql="";

       $tb=$this->tblist();       
       foreach($tbas$v){
           $rs=mysql_query("SHOWCREATETABLE$v");
           $temp=mysql_fetch_row($rs);
           $sql.="--表的结构:{$temp[0]}--\r\n";
           $sql.="{$temp[1]}";
           $sql.=";--<xjx>--\r\n\r\n";
       }
       return$sql;
   }

注:$sql.=";--<xjx>--\r\n\r\n";每句SQL后面必须加上分号(;)分割,MYSQL导入才能识别。--<xjx>--是程序对SQL语句分割的标识,可以自定义但必须是注释语句,否则影响SQL语句。\r\n无实际意义用于文本美观

五、INSERTINTO语句
复制代码代码如下:
/**
    *数据插入SQL...
    */
   functionsqlinsert(){
       $sql="";

       $tb=$this->tblist();       
       foreach($tbas$v){
           $rs=mysql_query("SELECT*FROM$v");
           if(!mysql_num_rows($rs)){//无数据返回
               continue;
           }       
           $sql.="--表的数据:$v--\r\n";
           $sql.="INSERTINTO`$v`VALUES\r\n";       
           while($temp=mysql_fetch_row($rs)){
               $sql.="(";
               foreach($tempas$v2){
                   if($v2===null){
                       $sql.="NULL,";
                   }
                   else{
                       $v2=mysql_real_escape_string($v2);
                       $sql.=""$v2",";
                   }                   
               }
               $sql=mb_substr($sql,0,-1);
               $sql.="),\r\n";
           }
           $sql=mb_substr($sql,0,-3);
           $sql.=";--<xjx>--\r\n\r\n";   
       }

       return$sql;
   }

注:
1.无数据返回时必须跳出本次循环,避免生成多余代码
2.当字段值为(NULL)时,插入字符为(NULL)而不是("NULL"),没有单引号。3.$v2=mysql_real_escape_string($v2),这是必要的转义
4.mb_substr($sql,0,-1)、mb_substr($sql,0,-3),必须去除最后一个逗号(,)否则SQL语句出错5.$sql.=";--<xjx>--\r\n\r\n",详见第四步注

六、备份操作
复制代码代码如下:
/**
    *备份...
    *@param$filename文件路径
    */
   functionbeifen($filename){
       $this->db();   //连接数据库

       $sql=$this->sqlcreate();
       $sql2=$this->sqlinsert();       
       $data=$sql.$sql2;

       returnfile_put_contents($filename,$data);
   }

七、还原操作
复制代码代码如下:
/**
    *还原...
    *@param$filename文件路径
    */
   functionhuanyuan($filename){
       $this->db();   //连接数据库

       //删除数据表
       $list=$this->tblist();
       $tb="";
       foreach($listas$v){
           $tb.="`$v`,";
       }
       $tb=mb_substr($tb,0,-1);
       if($tb){
           $rs=mysql_query("DROPTABLE$tb");
           if($rs===false){
               returnfalse;
           }
       }

       //执行SQL
       $str=file_get_contents($filename);
       $arr=explode("--<xjx>--",$str);
       array_pop($arr);

       foreach($arras$v){
           $rs=mysql_query($v);
           if($rs===false){
               returnfalse;
           }
       }

       returntrue;
   }

备份示例:
复制代码代码如下:
$x=newdbBackup();
$x->database="test";
$rs=$x->beifen("db.sql");
var_dump($rs);

还原示例:
复制代码代码如下:
$x=newdbBackup();
$x->database="test";
$rs=$x->huanyuan("db.sql");
var_dump($rs);

完整代码:
复制代码代码如下:
classdbBackup{
   public$host="localhost";   //数据库地址
   public$user="root";   //登录名
   public$pwd="";   //密码
   public$database;   //数据库名
   public$charset="utf8";   //数据库连接编码:mysql_set_charset

   /**
    *备份...
    *@param$filename文件路径
    */
   functionbeifen($filename){
       $this->db();   //连接数据库

       $sql=$this->sqlcreate();
       $sql2=$this->sqlinsert();       
       $data=$sql.$sql2;

       returnfile_put_contents($filename,$data);
   }

   /**
    *还原...
    *@param$filename文件路径
    */
   functionhuanyuan($filename){
       $this->db();   //连接数据库

       //删除数据表
       $list=$this->tblist();
       $tb="";
       foreach($listas$v){
           $tb.="`$v`,";
       }
       $tb=mb_substr($tb,0,-1);
       if($tb){
           $rs=mysql_query("DROPTABLE$tb");
           if($rs===false){
               returnfalse;
           }
       }

       //执行SQL
       $str=file_get_contents($filename);
       $arr=explode("--<xjx>--",$str);
       array_pop($arr);

       foreach($arras$v){
           $rs=mysql_query($v);
           if($rs===false){
               returnfalse;
           }
       }

       returntrue;
   }

   /**
    *连接数据库...
    */
   functiondb(){       
       $con=mysql_connect($this->host,$this->user,$this->pwd);
       if(!$con){
           die("Couldnotconnect");
       }

       $db_selected=mysql_select_db($this->database,$con);
       if(!$db_selected){
           die("Can\"tuseselectdb");
       }

       mysql_set_charset($this->charset);   //设置编码

       return$con;
   }

   /**
    *表集合...
    */
   functiontblist(){
       $list=array();

       $rs=mysql_query("SHOWTABLESFROM$this->database");
       while($temp=mysql_fetch_row($rs)){
           $list[]=$temp[0];
       }

       return$list;
   }

   /**
    *表结构SQL...
    */
   functionsqlcreate(){
       $sql="";

       $tb=$this->tblist();       
       foreach($tbas$v){
           $rs=mysql_query("SHOWCREATETABLE$v");
           $temp=mysql_fetch_row($rs);
           $sql.="--表的结构:{$temp[0]}--\r\n";
           $sql.="{$temp[1]}";
           $sql.=";--<xjx>--\r\n\r\n";
       }
       return$sql;
   }

   /**
    *数据插入SQL...
    */
   functionsqlinsert(){
       $sql="";

       $tb=$this->tblist();       
       foreach($tbas$v){
           $rs=mysql_query("SELECT*FROM$v");
           if(!mysql_num_rows($rs)){//无数据返回
               continue;
           }       
           $sql.="--表的数据:$v--\r\n";
           $sql.="INSERTINTO`$v`VALUES\r\n";       
           while($temp=mysql_fetch_row($rs)){
               $sql.="(";
               foreach($tempas$v2){
                   if($v2===null){
                       $sql.="NULL,";
                   }
                   else{
                       $v2=mysql_real_escape_string($v2);
                       $sql.=""$v2",";
                   }                   
               }
               $sql=mb_substr($sql,0,-1);
               $sql.="),\r\n";
           }
           $sql=mb_substr($sql,0,-3);
           $sql.=";--<xjx>--\r\n\r\n";   
       }

       return$sql;
   }
}
//备份
//$x=newdbBackup();
//$x->database="test";
//$rs=$x->beifen("db.sql");
//var_dump($rs);
//还原
//$x=newdbBackup();
//$x->database="test";
//$rs=$x->huanyuan("db.sql");
//var_dump($rs);