php 备份数据库代码

作者:袖梨 2022-06-24

inport.php

 代码如下 复制代码

 /**
  * 数据库备份程序
  *
  * @author:黄乐
  * @version:1.0
  * @lastupdate:2010-7-19
  *
  */

 include("config/config.php");
 include("includes/dbbackup.class.php");
 include("includes/msg.class.php");
 $dbbackup = new dbbackup($dbhost, $dbuser, $dbpwd, $dbname);
 $msg = new msg();
 $bakfile = $dbbackup->get_backup();       //获取备份文件
 if($_get['fn']){
  if($dbbackup->import($_get['fn'])){      //导入数据
   $str = "恭喜您
备份数据已经成功导入!";   //提示信息
   $msg->show_msg($str,'import.php','export.php'); //提示导入成功
  }
 }
 //删除备份文件
 if($_post['sub']){
  echo $dbbackup->del($_post['choice'])? $msg->show_msg("恭喜您
备份文件已删除成功!",'import.php','export.php') : $msg->show_msg("删除失败!",'import.php','import.php');
 }
?>

 

 

 

 代码如下 复制代码





powered by 黄乐
css教程/dbbackup.css" rel="stylesheet" type="text/css" />








操作菜单

备份数据
还原数据




提示信息

本功能在恢复备份数据的同时,将覆盖原有数据,请确定是否需要恢复,以免造成数据损失。


如果一个备份文件有多个分卷,您只需任选一个备份文件导入,程序会自动导入其他分卷











 $i = 1;
 foreach($bakfile as $tb){
?>



备份文件
id 文件名 备份时间 卷号 导入

 //取得备份时间
 if(!preg_match("/_part/", $tb)){
  $str = explode(".", $tb);
  $time = substr($str[0],-10);
  //设置用在脚本中所有日期/时间函数的默认时区。
  date_default_timezone_set("prc");
  echo date("y-m-d h:i",$time);
 }else{
  //分卷
  $str = explode("_part", $tb);
  $time = substr($str[0],-10);
  //设置用在脚本中所有日期/时间函数的默认时区。
  date_default_timezone_set("prc");
  echo date("y-m-d h:i",$time);
 }
?>

 

 

 







 代码如下 复制代码


 //取分卷号
 if(!preg_match("/_part/", $tb)){
  echo "1";
 }else{
  $str = explode(".", $tb);
  echo substr($str[0],-1);
 }
?>

导入










exprot.php

 /**
  * 数据库备份程序
  *
  * @author:黄乐
  * @version:1.0
  * @lastupdate:2010-7-19
  *
  */

 include("config/config.php");
 include("includes/dbbackup.class.php");
 include("includes/msg.class.php");
 $dbbackup = new dbbackup($dbhost, $dbuser, $dbpwd, $dbname);
 $msg = new msg();
 $tbs = $dbbackup->get_tb();           //获取数据库表集合
 if($_post['sub']){
   $data = $dbbackup->get_backupdata($_post['choice']);  //获取备份数据
   if($dbbackup->export($data)){        //导入数据
    $bakfn = $msg->get_fn($dbbackup->bakfn);    //取得备份文件名
    $str = "恭喜您
备份成功,备份文件保存在data目录下," . //提示信息
      "
备份文件为
".$bakfn;
    $msg->show_msg($str,'export.php','import.php');  //提示备份成功
   }
 }
?>

 

 

 

 代码如下 复制代码





powered by 黄乐









操作菜单

备份数据
还原数据




提示信息

您可以根据自己的需要选择需要备份的数据库表,导出的数据文件可用"数据恢复"功能。

为了数据安全,备份文件采用数据库名 + 时间戳命名保存,如果备份数据超过设定的大小,
程序会自动采用分卷备份功能,请耐心等待直到程序提示全部备份完成。








 $i = 1;
 foreach($tbs as $tb){
?>








数据库表
id 数据库表 选择


分卷备份

每个分卷文件长度默认为2048kb,自定义请手动更改dbbackup.php文件private $part属性









 

 

 

 代码如下 复制代码

config.php

 /**
  * 数据库备份程序
  *
  * @author:黄乐
  * @version:1.0
  * @lastupdate:2010-7-19
  *
  */


 /**
  * 以下配置需要根据您的服务器修改
  */

 $dbhost = 'localhost';  // 数据库服务器
 $dbuser = 'root';   // 数据库用户名
 $dbpwd = '';    // 数据库密码
 $dbname = 'demo';  // 数据库名
?>


msg.class.php

 /**
  * 数据库备份程序
  *
  * @author:黄乐
  * @version:1.0
  * @lastupdate:2010-7-19
  *
  */

 class msg{

  /**
   * 提示信息
   */
  public function show_msg($msg = '', $url = '', $addurl = ''){
   $m = '
   
   
   
   powered by 黄乐
   
   

   
    


          
              
              
                
              
          
    
提示信息

               '.$msg.'
            
 确定
返回继续操作

   
   ';
   echo $m;
   exit();
  }

  

 

 

 

 代码如下 复制代码

/**
   * 取得文件名
   */
  public function get_fn($fn){
   if(is_array($fn)){
    foreach($fn as $val){
     $filename .= '' . $val . '' . "
";
    }
    return $filename;
   }else{
    return $filename = '' . $fn . '';
   }
  }
 }

?>


dbbackup.class.php

 /**
  * 数据库备份程序
  *
  * @author:黄乐
  * @version:1.0
  * @lastupdate:2010-7-18
  *
  */


// +-----------------------------------------------------------
// | 备份原理:
// +-----------------------------------------------------------
// |默认备份文件大于2048k,则分卷备份
// |该类可以备份数据和导入数据
// |一个备份文件有多个分卷,只需任选一个导入,程序会自动导入其他分卷
// +-----------------------------------------------------------

/**
 +-----------------------------------------------------------------
 *  使用实例:
 +-----------------------------------------------------------------
 *  $dbbackup = new dbbackup("localhost", "root", "", "数据库名");
 +-----------------------------------------------------------------
 *  备份数据:
 *  $tbs = $dbbackup->get_tb()      获取数据库表集合
 *  $data = $dbbackup->get_backupdata($tbs);   获取备份数据
 *  $dbbackup->export($data)      导入数据
 +-----------------------------------------------------------------
 *  导入数据:
 *  $bakfile = $dbbackup->get_backup();    获取备份文件
 *  $dbbackup->import(文件名)      导入数据
 +-----------------------------------------------------------------
 *  删除备份:
 * $dbbackup->delfn(文件名)
 +-----------------------------------------------------------------
 *  上述仅为逻辑演示,本类可灵活使用
 +-----------------------------------------------------------------
 */


 class dbbackup{


  /**
   * 数据库主机
   *
   * @private string
   */
   private $db_host;

  /**
   * 数据库用户名
   *
   * @private string
   */
   private $db_user;

  /**
   * 数据库密码
   *
   * @private string
   */
   private $db_pwd;

  /**
   * 数据库名
   *
   * @private string
   */
   private $db_database;

  /**
   * 数据库编码,gbk,utf8,gb2312
   *
   * @private string
   */
   private $coding;

  /**
   * 数据库连接标识
   *
   * @private string
   */
   private $conn;

  /**
   * 文件夹路径(存放备份数据)
   *
   * @private string
   */
   private $data_dir = 'data/';

  /**
   * 分卷长度(单位kb)
   *
   * @private string
   */
   private $part = 2048;

  /**
   * 备份文件名
   *
   * @private string | array
   */
   public $bakfn;

 

 

 

 代码如下 复制代码


  /**
   * 构造函数
   *
   * @access public
   * @parameter string $db_host   数据库主机
   * @parameter string $db_user   数据库用户名
   * @parameter string $db_pwd    数据库密码
   * @parameter string $db_database   数据库名
   * @parameter string $coding    编码
   * @return void
   */
  public function __construct($db_host, $db_user, $db_pwd, $db_database, $coding = 'gb2312'){
   $this->init();
   $this->db_host = $db_host;
   $this->db_user = $db_user;
   $this->db_pwd =  $db_pwd;
   $this->db_database = $db_database;
   $this->coding = $coding;
   $this->connect();
   $this->part = $this->part * 1024; //设置分卷长度,单位为kb
   $this->cre_dir();        //创建文件夹
  }

  /**
   * 初始化程序
   *
   * @access private
   * @return void
   */
  private function init(){
   set_time_limit(0);     //程序执行不限时
   error_reporting(e_error | e_parse); //报错级别
  }

  /**
   * 链接数据库
   *
   * @access private
   * @return void
   */
  private function connect(){
   $this->conn = @mysql_connect($this->db_host,$this->db_user,$this->db_pwd);
   if(!$this->conn){
    echo '错误提示:链接数据库失败!';
    exit();
   }

   if(!@mysql_select_db($this->db_database, $this->conn)){
    echo '错误提示:打开数据库失败!';
    exit();
   }

   if(!@mysql_query("set names $this->coding")){
    echo '错误提示:设置编码失败!';
   }
  }

  /**
   * 创建文件夹
   *
   * @access private
   * @return void
   */
  private function cre_dir(){
   //文件夹不存在则创建
   if(!is_dir($this->data_dir)){
    mkdir($this->data_dir, 0777);
   }
  }

  

 

 

 

 代码如下 复制代码

/**
   *  获取数据库表集合
   *
   * @access public
   * @return array
   */
  public function get_tb(){
   //查询表集合
   $tq = mysql_list_tables($this->db_database);
   while($tr = mysql_fetch_row($tq)){
    $arrtb[] = $tr[0];
   }
   return $arrtb; //返回表集合
  }

  /**
   * 获取备份数据
   *
   * @access public
   * @parameter string $db_host 表集合
   * @return string or array
   */
  public function get_backupdata($arrtb){
   $backupdata = ''; //存储备份数据
   //获取备份数据
   foreach($arrtb as $tb){
    //获取表结构
    $query = mysql_query("show create table $tb");
    $row = mysql_fetch_row($query);
    $backupdata .= "drop table if exists $tb; " . $row[1] . "; ";
    //获取表数据
    $query = mysql_query("select * from $tb");
    $numfields = mysql_num_fields($query); //统计字段数
    //构造insert语句
    while($row = mysql_fetch_row($query)){
     $comma = ""; //存储逗号
     $backupdata .= "insert into $tb values (";
     for($i=0; $i<$numfields; $i++){
                //转义sql语句中的特殊字符
      $backupdata .= $comma . "'" . mysql_escape_string($row[$i]) . "'";
      $comma = ",";
     }
     $backupdata .= "); ";
     //备份数据大于 part值 则存入数组,分卷备份
     if(strlen($backupdata) > $this->part){
      $arrbackupdata[] = $backupdata;
      $backupdata = ''; //清空之前的sql
     }
    }
    $backupdata .= " "; // 隔开每张表中的数据
   }
   //+
   //| 提示:
   //| 根据是否需要分卷备份,返回不同值
   //+
   if(is_array($arrbackupdata)){
    //将剩余数据加入数组
    array_push($arrbackupdata, $backupdata);
    return $arrbackupdata; //返回数组备份数据
   }
   return $backupdata; //返回备份数据
  }

  /**
   * 将备份数据写入文件
   *
   * @access private
   * @parameter string $data 数据
   * @return boolean
   */
  private function wri_file($data){
   //数据为数组则分卷备份
   if(is_array($data)){
    $i = 1;
    foreach($data as $val){
     //写入数据
     $filename = $this->data_dir . $this->db_database . mktime() . "_part{$i}.sql"; //文件名
     if(!$fp = @fopen($filename, "w+")){ echo "在打开文件时遇到错误,备份失败!"; return false;}
     if(!@fwrite($fp, $val)){
      echo "在写入信息时遇到错误,备份失败!"; fclose($fp); //需关闭文件才能删除
      unlink($filename); //删除文件
      return false;}
     $this->bakfn[] = $this->db_database . mktime() . "_part{$i}.sql"; //备份成功则返回文件名数组
     $i++;
    }
   

 

 

 

 代码如下 复制代码

}else{ //单独备份
    $filename = $this->data_dir . $this->db_database . mktime() . ".sql";
    if(!$fp = @fopen($filename, "w+")){ echo "在打开文件时遇到错误,备份失败!"; return false;}
    if(!@fwrite($fp, $data)){
     echo "在写入信息时遇到错误,备份失败!"; fclose($fp);
     unlink($filename);
     return false;}
    $this->bakfn = $this->db_database . mktime() . ".sql"; //备份成功则返回文件名
   }
   fclose($fp);
   return true;
  }

  /**
   * 备份数据
   *
   * @access public
   * @parameter string $data 数据
   * @return void
   */
  public function export($data){
   return $this->wri_file($data); //写入数据
  }

  //+-------------
  //+-------------

  /**
   * 获取所有备份文件
   *
   * @access public
   * @return array
   */
  public function get_backup(){
   $backup = scandir($this->data_dir); //查询所有的备份文件
   for($i=0; $i     if($backup[$i] != "." && $backup[$i] != ".."){
     $arrbackup[] = $backup[$i];
    }
   }
   return $arrbackup; //返回备份文件集合
  }

  /**
   * 导入数据
   * (一个备份文件有多个分卷,只需任选一个备份文件导入,程序会自动导入其他分卷 )
   *
   * @access public
   * @parameter string|array $filename 备份文件名
   * @return boolean
   */
  public function import($filename){
   //传入文件名为分卷文件之一,则查找出所有分卷文件
   $boolean = preg_match("/_part/",$filename);      //判断文件是否为分卷文件
   if($boolean){
    $fn = explode("_part", $filename);       //取分卷文件名
    $backup = scandir($this->data_dir);          //查询所有的备份文件
    for($i=0; $i      $part = preg_match("/{$fn[0]}/", $backup[$i]); //取得所有匹配的分卷文件
     if($part){
      $filenames[] = $backup[$i];
     }
    }
   }
   //存在文件数组则获取分卷数据,否则获取单个文件数据
   if(is_array($filenames)){
    foreach($filenames as $fn){
     $data .= file_get_contents($this->data_dir . $fn);  //获取数据
    }
   }else{
    $data = file_get_contents($this->data_dir . $filename);
   }
   //切割数据
   $data = str_replace(" ", " ", $data);
   $regular = "/; /";
   $data = preg_split($regular,trim($data));
   //循环导入数据
   foreach($data as $val){
    mysql_query($val) or die('导入数据失败!' . mysql_error());
   }
   return true;
  }

  

 

 

 

 代码如下 复制代码

//+-------------
  //+-------------

  /**
   * 删除备份文件
   *
   * @access public
   * @parameter string $delfn 备份文件名
   * @return void
   */
  public function del($delfn){
   //删除多个备份文件
   if(is_array($delfn)){
    foreach($delfn as $fn){
     if(!unlink($this->data_dir.$fn)){ return false;}
    }
    return true;
   }
   //删除单个备份文件
   return unlink($this->data_dir.$delfn);
  }

 }

?>

相关文章

精彩推荐