首页新萄京娱乐网址2492777 › php类实现MySQL数据库备份、还原

php类实现MySQL数据库备份、还原

正文实例陈述了php完结MySQL数据库备份与还原类。分享给咱们供我们参照他事他说加以考查。具体深入分析如下:

 代码如下

     }
     else
     {
      exit ( "导入分卷$volume_id:<span style='color:#f00;'>" .
$tmpfile .
'</span>失利!也许是数据库构造已破坏!请尝试从分卷1开首导入' State of Qatar;
     }
    }
    else
    {
     echo "此分卷备份全体导入成功!<br />";
     return;
    }
    $volume_id++;
   }
  }
 }

可望本文所述对大家的PHP程序设计具有助于。

<?php 
/**
 * 创设时间: 2013年六月二十五日
 *
 * 表达:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql)
 *
功能:实现mysql数据库分卷备份,选用表进行备份,落成单个sql文件及分卷sql导入
 * 使用方法:
 *
 * ------1.
数据库备份(导出)------------------------------------------------------------
//分别是主机,客户名,密码,数据库名,数据库编码
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//
参数:备份哪个表(可选卡塔尔,备份目录(可选,默感觉backup卡塔尔国,分卷大小(可选,暗中同意二零零四,即2MState of Qatar
$db->backup ();
 * ------2.
数据库复苏(导入)------------------------------------------------------------
//分别是主机,顾客名,密码,数据库名,数据库编码
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//参数:sql文件
$db->restore ( './backup/20120516211738_all_v1.sql');
 *----------------------------------------------------------------------
 */
class DBManage 

    var $db; // 数据库连接 
    var $database; // 所用数据库 
    var $sqldir; // 数据库备份文件夹 
    var $record; 
    // 换行符 
    private $ds = "n"; 
    // 存储SQL的变量 
    public $sqlContent = ""; 
    // 每条sql语句的末段符 
    public $sqlEnd = ";"; 
    /**
     * 初始化
     *
     * @param string $host
     * @param string $username
     * @param string $password
     * @param string $thisatabase
     * @param string $charset
     */
    function __construct($host = 'localhost', $username = 'root',
$password = '', $thisatabase = 'test', $charset = 'utf8') 
    { 
        $this->host = $host; 
        $this->username = $username; 
        $this->password = $password; 
        $this->database = $thisatabase; 
        $this->charset = $charset; 
        // 连接数据库 
        $this->db = mysql_connect ( $this->host,
$this->username, $this->password 卡塔尔国 or die ( "数据库连接战败."
卡塔尔; 
        // 选用使用哪个数据库 
        mysql_select_db (
$this->database, $this->db ) or die ( "不只怕开采数据库" 卡塔尔; 
        // 数据库编码情势 
        mysql_query ( 'SET NAMES ' . $this->charset, $this->db
); 
    } 
  
    /*
      *
------------------------------------------数据库备份start----------------------------------------------------------
      */
  
    /**
     * 数据库备份
     *
参数:备份哪个表(可选卡塔尔,备份目录(可选,默认为backupState of Qatar,分卷大小(可选,默许二零零一,即2M卡塔尔(قطر‎
     *
     * @param $string $dir
     * @param int $size
     * @param $string $tablename
     */
    function backup($tablename = '', $dir = '', $size = 2000) 
    { 
        //$dir = $dir ? $dir : 'backup/'; 
        //$size = $size ? $size : 2000; 
        $sql = ''; 
        // 只备份有些表 
        if (! empty ( $tablename )) 
        { 
            echo '正在备份表' . $tablename . '<br />'; 
            // 插入dump信息 
            $sql = $this->_retrieve(); 
            // 插入表构造音信 
            $sql .= $this->_insert_table_structure ( $tablename
); 
            // 插入数据 
            $data = mysql_query ( "select * from " . $tablename ); 
            // 文件名前边部分 
            $filename = date ( 'YmdHis' ) . "_" . $tablename; 
            // 字段数量 
            $num_fields = mysql_num_fields ( $data ); 
            // 第几分卷 
            $p = 1; 
            // 循环每条记录 
            while ( $record = mysql_fetch_array ( $data ) ) 
            { 
                // 单条记录 
                $sql .= $this->_insert_record ( $tablename,
$num_fields, $record ); 
                // 借使超越分卷大小,则写入文件 
                if (strlen ( $sql ) >= $size * 1000) 
                { 
                    $file = $filename . "_v" . $p . ".sql"; 
                    if ($this->_write_file ( $sql, $file, $dir
)) 
                    { 
                        echo "表-" . $tablename . "-卷-" . $p .
"-数据备份实现,生成备份文件 <span
style='color:#f00;'>$dir$filename</span><br />"; 
                    } 
                    else
                    { 
                        echo "备份表-" . $tablename . "-失败<br
/>"; 
                    } 
                    // 下一个分卷 
                    $p ++; 
                    // 重新恢复生机设置$sql变量为空,重新总括该变量大小 
                    $sql = ""; 
                } 
            } 
            // sql大小远远不够分卷大小 
            if ($sql != "") 
            { 
                $filename .= "_v" . $p . ".sql"; 
                if ($this->_write_file ( $sql, $filename, $dir
)) 
                { 
                    echo "表-" . $tablename . "-卷-" . $p .
"-数据备份实现,生成备份文件 <span
style='color:#f00;'>$dir$filename</span><br />"; 
                } 
                else
                { 
                    echo "备份卷-" . $p . "-失败<br />"; 
                } 
            } 
        } 
        else
        { // 备份整体表 
            if ($tables = mysql_query ( "show table status from " .
$this->database )) 
            { 
                echo "读取数据库构形成功!<br />"; 
            } 
            else
            { 
                exit ( "读取数据库布局成功!<br />" 卡塔尔; 
            } 
            // 插入dump信息 
            $sql .= $this->_retrieve(); 
            // 文件名前边部分 
            $filename = date ( 'YmdHis' ) . "_all"; 
            // 查出全部表 
            $tables = mysql_query ( 'SHOW TABLES' ); 
            // 第几分卷 
            $p = 1; 
            // 循环全数表 
            while ( $table = mysql_fetch_array ( $tables ) ) 
            { 
                // 获取表名 
                $tablename = $table [0]; 
                // 获取表布局 
                $sql .= $this->_insert_table_structure (
$tablename ); 
                $data = mysql_query ( "select * from " . $tablename
); 
                $num_fields = mysql_num_fields ( $data ); 
  
                // 循环每条记录 
                while ( $record = mysql_fetch_array ( $data ) ) 
                { 
                    // 单条记录 
                    $sql .= $this->_insert_record ( $tablename,
$num_fields, $record ); 
                    // 借使超过分卷大小,则写入文件 
                    if (strlen ( $sql ) >= $size * 1000) 
                    { 
  
                        $file = $filename . "_v" . $p . ".sql"; 
                        // 写入文件 
                        if ($this->_write_file ( $sql, $file, $dir
)) 
                        { 
                            echo "-卷-" . $p .
"-数据备份完毕,生成备份文件<span
style='color:#f00;'>$dir$file</span><br />"; 
                        } 
                        else
                        { 
                            echo "备份卷-" . $p . "-失败<br
/>"; 
                        } 
                        // 下三个分卷 
                        $p ++; 
                        // 重新复苏设置$sql变量为空,重新计算该变量大小 
                        $sql = ""; 
                    } 
                } 
            } 
            // sql大小非常不够分卷大小 
            if ($sql != "") 
            { 
                $filename .= "_v" . $p . ".sql"; 
                if ($this->_write_file ( $sql, $filename, $dir
)) 
                { 
                    echo "-卷-" . $p . "-数据备份实现,生成备份文件
<span style='color:#f00;'>$dir$filename<br />"; 
                } 
                else
                { 
                    echo "备份卷-" . $p . "-失败<br />"; 
                } 
            } 
        } 
    } 
  
    /**
     * 插入数据库备份幼功新闻
     *
     * @return string
     */
    private function _retrieve() { 
        $value = ''; 
        $value .= '--' . $this->ds; 
        $value .= '-- MySQL database dump' . $this->ds; 
        $value .= '-- Created by DBManage class, Power By yanue. ' .
$this->ds; 
        $value .= '-- ' . $this->ds; 
        $value .= '--' . $this->ds; 
        $value .= '-- 主机: ' . $this->host . $this->ds; 
        $value .= '-- 生成日期: ' . date ( 'Y' 卡塔尔 . ' 年  ' . date ( 'm'
State of Qatar . ' 月 ' . date ( 'd' 卡塔尔(قطر‎ . ' 日 ' . date ( 'H:i' 卡塔尔国 . $this->ds; 
        $value .= '-- MySQL版本: ' . mysql_get_server_info () .
$this->ds; 
        $value .= '-- PHP 版本: ' . phpversion () . $this->ds; 
        $value .= $this->ds; 
        $value .= '--' . $this->ds; 
        $value .= '-- 数据库: `' . $this->database . '`' .
$this->ds; 
        $value .= '--' . $this->ds . $this->ds; 
        $value .= '--
-------------------------------------------------------'; 
        $value .= $this->ds . $this->ds; 
        return $value; 
    } 
  
    /**
     * 插入表构造
     *
     * @param unknown_type $table
     * @return string
     */
    private function _insert_table_structure($table) { 
        $sql = ''; 
        $sql .= "--" . $this->ds; 
        $sql .= "-- 表的组织" . $table . $this->ds; 
        $sql .= "--" . $this->ds . $this->ds; 
  
        // 假若存在则删除表 
        $sql .= "DROP TABLE IF EXISTS `" . $table . '`' .
$this->sqlEnd . $this->ds; 
        // 获取详细表音信 
        $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`'
); 
        $row = mysql_fetch_array ( $res ); 
        $sql .= $row [1]; 
        $sql .= $this->sqlEnd . $this->ds; 
        // 加上 
        $sql .= $this->ds; 
        $sql .= "--" . $this->ds; 
        $sql .= "-- 转存表中的数据 " . $table . $this->ds; 
        $sql .= "--" . $this->ds; 
        $sql .= $this->ds; 
        return $sql; 
    } 
  
    /**
     * 插入单条记录
     *
     * @param string $table
     * @param int $num_fields
     * @param array $record
     * @return string
     */
    private function _insert_record($table, $num_fields, $record)

        // sql字段逗号分割 
        $insert = $comma = ""; 
        $insert .= "INSERT INTO `" . $table . "` VALUES("; 
        // 循环各个子段下边包车型地铁内容 
        for($i = 0; $i < $num_fields; $i ++) { 
            $insert .= ($comma . "'" .mysql_real_escape_string (
$record [$i] ) . "'"); 
            $comma = ","; 
        } 
        $insert .= ");" . $this->ds; 
        return $insert; 
    } 
  
    /**
     * 写入文件
     *
     * @param string $sql
     * @param string $filename
     * @param string $dir
     * @return boolean
     */
    private function _write_file($sql, $filename, $dir) { 
        $dir = $dir ? $dir : './backup/'; 
        // 不设有文件夹则开创 
        if (! file_exists ( $dir )) { 
            mkdir ( $dir ); 
        } 
        $re = true; 
        if (! @$fp = fopen (
$dir . $filename, "w+" )) { 
            $re = false; 
            echo "张开文件失利!"; 
        } 
        if (! @fwrite ( $fp, $sql )) { 
            $re = false; 
            echo "写入文件败北,请文件是或不是可写"; 
        } 
        if (! @fclose ( $fp )) { 
            $re = false; 
            echo "关闭文件战败!"; 
        } 
        return $re; 
    } 
  
    /*
      *
      *
-------------------------------上:数据库导出-----------分界线----------下:数据库导入--------------------------------
      */
  
    /**
     * 导入备份数据
     * 表达:分卷文件格式二零一一0516211738_all_v1.sql
     * 参数:文件路线(必填卡塔尔(قطر‎
     *
     * @param string $sqlfile
     */
    function restore($sqlfile) 
    { 
        // 检验文件是不是存在 
        if (! file_exists ( $sqlfile )) 
        { 
            exit ( "文件荒诞不经!请检查" 卡塔尔国; 
        } 
        $this->lock ( $this->database ); 
        // 获取数据仓库储存款和储蓄地方 
        $sqlpath = pathinfo ( $sqlfile ); 
        $this->sqldir = $sqlpath ['dirname']; 
        //
检验是还是不是含有分卷,将看似20110516211738_all_v1.sql从_v分开,有则表明有分卷 
        $volume = explode (
"_v", $sqlfile ); 
        $volume_path = $volume [0]; 
        echo
"请勿刷新及倒闭浏览器以幸免程序被暂停,如有不慎!将招致数据库布局受到损伤<br
/>"; 
        echo "正在导入备份数据,请稍等!<br />"; 
        if (empty ( $volume [1] )) 
        { 
            echo "正在导入sql:<span style='color:#f00;'>" .
$sqlfile . '</span><br />'; 
            // 未有分卷 
            if ($this->_import ( $sqlfile )) { 
                echo "数据库导入成功!"; 
            } 
            else
            { 
                exit ( '数据库导入失利!' 卡塔尔; 
            } 
        } 
        else
        { 
            //$volume_id = array(); 
            // 存在分卷,则收获当前是第几分卷,循环推行余下分卷 
            $volume_id = explode ( ".sq", $volume [1] ); 
            // 当前分卷为$volume_id 
            $volume_id = intval ( $volume_id [0] ); 
            while ( $volume_id ) 
            { 
                $tmpfile = $volume_path . "_v" . $volume_id .
".sql"; 
                // 存在别的分卷,继续推行 
                if (file_exists ( $tmpfile )) { 
                    // 实施导入方法 
                    echo "正在导入分卷<span style='color:#f00;'>"
. $tmpfile . '</span><br />'; 
                    if ($this->_import ( $tmpfile )) 
                    { 
  
                    } 
                    else
                    { 
                        exit ( "导入分卷<span
style='color:#f00;'>" . $tmpfile .
'</span>战败!或许是数据库构造已破坏!请尝试从分卷1早伊始入' State of Qatar; 
                    } 
                } 
                else
                { 
                    echo "此分卷备份全部导入成功!<br />"; 
                    return; 
                } 
                $volume_id++; 
            } 
        } 
    } 
  
    /**
     * 将sql导入到数据库(普通导入)
     *
     * @param string $sqlfile
     * @return boolean
     */
    private function _import($sqlfile) { 
        // sql文件满含的sql语句数组 
        $sqls = array (); 
        $f = fopen ( $sqlfile, "rb" ); 
        // 创造表缓冲变量 
        $create = ''; 
        while ( ! feof ( $f ) ) { 
            // 读取每大器晚成行sql 
            $line = fgets ( $f ); 
            // 假设带有'-- '等注释,或为空白行,则跳过 
            if (trim ( $line ) == '' ||
preg_match ( '/--*?/',
$line, $match )) { 
                continue; 
            } 
            //
借使最后满含';'(即为叁个风姿洒脱体化的sql语句,这里是插入语句State of Qatar,况且不带有'ENGINE='(即创造表的末梢一句卡塔尔国, 
            if (! preg_match ( '/;/', $line, $match ) || preg_match (
'/ENGINE=/', $line, $match )) { 
                // 将本次sql语句与创造表sql连接存起来 
                $create .= $line; 
                // 假诺含有了创设表的末梢一句 
                if (preg_match ( '/ENGINE=/', $create, $match )) { 
                    // 则将其联合到sql数组 
                    $sqls [] = $create; 
                    // 清空当前,盘算下多个表的创立 
                    $create = ''; 
                } 
                // 跳过此次 
                continue; 
            } 
            $sqls [] = $line; 
        } 
        fclose ( $f ); 
        // 循环sql语句数组,分别试行 
        foreach ( $sqls as
$sql ) { 
            str_replace ( "n", "", $sql ); 
            if (! mysql_query ( trim ( $sql ) )) { 
                echo mysql_error (); 
                return false; 
            } 
        } 
        return true; 
    } 
  
    /*
      *
-------------------------------数据库导入end---------------------------------
      */
  
    // 关闭数据库连接 
    private function close() { 
        mysql_close ( $this->db ); 
    } 
  
    // 锁定数据库,以防备份或导入时出错 
    private function lock($tablename, $op = "WRITE") { 
        if (mysql_query ( "lock tables " . $tablename . " " . $op )) 
            return true; 
        else
            return false; 
    } 
  
    // 解锁 
    private function unlock() { 
        if (mysql_query ( "unlock tables" )) 
            return true; 
        else
            return false; 
    } 
  
    // 析构 
    function __destruct() { 
        mysql_query ( "unlock tables", $this->db ); 
        mysql_close ( $this->db ); 
    } 
}
 
$db = new DBManage ( 'localhost', 'root', '', 'tao', 'gbk' );
//$db->backup ('tao_admin'); 
$db->restore ( './backup/20140228222713_tao_admin_v1.sql');

 //将每一个表的数据导出到文件
 foreach($tabList as $val){
  $sql = "select * from ".$val;
  $res = mysql_query($sql,$link);
  //借使表中从未数量,则继续下一张表
  if(mysql_num_rows($res)<1) continue;
  //
  $info = "-- ----------------------------\r\n";
  $info .= "-- Records for `".$val."`\r\n";
  $info .= "-- ----------------------------\r\n";
  file_put_contents($to_file_name,$info,FILE_APPEND);
  //读取数据
  while($row = mysql_fetch_row($res)){
   $sqlStr = "INSERT INTO `".$val."` VALUES (";
   foreach($row as $zd){
    $sqlStr .= "'".$zd."', ";
   }
   //去掉最终三个逗号和空格
   $sqlStr =
substr($sqlStr,0,strlen($sqlStr)-2);
   $sqlStr .= ");\r\n";
   file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
  }
  //释放财富
  mysql_free_result($res);
  file_put_contents($to_file_name,"\r\n",FILE_APPEND);
 }
 
 echo "OK!";
 
?>

这是一个特别轻便的施用php来备份mysql数据库的类公事,大家只要简单的在dbmange中配置好连接地址客商名与数据库就可以,下边我们一块来看那么些事例,代码如下:

<?php
 
 header("Content-type:text/html;charset=utf-8");
 
 //配置新闻
 $cfg_dbhost = 'localhost';
 $cfg_dbname = 'ftdm';
 $cfg_dbuser = 'root';
 $cfg_dbpwd = 'root';
 $cfg_db_language = 'utf8';
 $to_file_name = "ftdm.sql";
 // END 配置

复制代码 代码如下: /** 
 * 创造时间: 二零一二年八月十二十一日 
 * 
 * 表达:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql) 
 *
效率:完成mysql数据库分卷备份,选择表展开备份,达成单个sql文件及分卷sql导入 
 * 使用方法: 
 * 
 * ------1.
数据库备份(导出)------------------------------------------------------------ 
//分别是主机,客商名,密码,数据库名,数据库编码 
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); 
//
参数:备份哪个表(可选卡塔尔,备份目录(可选,暗中认可为backup卡塔尔,分卷大小(可选,暗中同意2004,即2M卡塔尔 
$db->backup (); 
 * ------2.
数据库复苏(导入)------------------------------------------------------------ 
//分别是主机,顾客名,密码,数据库名,数据库编码 
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); 
//参数:sql文件 
$db->restore ( './backup/20120516211738_all_v1.sql'); 
 *---------------------------------------------------------------------- 
 */ 
class DBManage  
{  
    var $db; // 数据库连接  
    var $database; // 所用数据库  
    var $sqldir; // 数据库备份文件夹  
    var $record;  
    // 换行符  
    private $ds = "n";  
    // 存储SQL的变量  
    public $sqlContent = "";  
    // 每条sql语句的结尾符  
    public $sqlEnd = ";";  
    /** 
     * 初始化 
     * 
     * @param string $host 
     * @param string $username 
     * @param string $password 
     * @param string $thisatabase 
     * @param string $charset 
     */ 
    function __construct($host = 'localhost', $username = 'root',
$password = '', $thisatabase = 'test', $charset = 'utf8')  
    {  
        $this->host = $host;  
        $this->username = $username;  
        $this->password = $password;  
        $this->database = $thisatabase;  
        $this->charset = $charset;  
        // 连接数据库  
        $this->db = mysql_connect ( $this->host,
$this->username, $this->password 卡塔尔(قطر‎ or die ( "数据库连接战败."
State of Qatar;  
        // 接纳采用哪个数据库  
        mysql_select_db ( $this->database, $this->db 卡塔尔国 or die (
"不恐怕张开数据库" State of Qatar;  
        // 数据库编码方式  
        mysql_query ( 'SET NAMES ' . $this->charset, $this->db
);  
    }  
   
    /* 
      *
------------------------------------------数据库备份start---------------------------------------------------------- 
      */ 
   
    /** 
     * 数据库备份 
     *
参数:备份哪个表(可选卡塔尔国,备份目录(可选,默感觉backup卡塔尔国,分卷大小(可选,默许2002,即2M卡塔尔 
     * 
     * @param $string $dir 
     * @param int $size 
     * @param $string $tablename 
     */ 
    function backup($tablename = '', $dir = '', $size = 2000)  
    {  
        //$dir = $dir ? $dir : 'backup/';  
        //$size = $size ? $size : 2000;  
        $sql = '';  
        // 只备份有个别表  
        if (! emptyempty ( $tablename ))  
        {  
            echo '正在备份表' . $tablename . '
';  
            // 插入dump信息  
            $sql = $this->_retrieve();  
            // 插入表构造音信  
            $sql .= $this->_insert_table_structure ( $tablename
);  
            // 插入数据  
            $data = mysql_query ( "select * from " . $tablename );  
            // 文件名前面部分  
            $filename = date ( 'YmdHis' ) . "_" . $tablename;  
            // 字段数量  
            $num_fields = mysql_num_fields ( $data );  
            // 第几分卷  
            $p = 1;  
            // 循环每条记下  
            while ( $record = mysql_fetch_array ( $data ) )  
            {  
                // 单条记下  
                $sql .= $this->_insert_record ( $tablename,
$num_fields, $record );  
                // 假如过量分卷大小,则写入文件  
                if (strlen ( $sql ) >= $size * 1000)  
                {  
                    $file = $filename . "_v" . $p . ".sql";  
                    if ($this->_write_file ( $sql, $file, $dir
))  
                    {  
                        echo "表-" . $tablename . "-卷-" . $p .
"-数据备份完毕,生成备份文件 $dir$filename
";  
                    }  
                    else 
                    {  
                        echo "备份表-" . $tablename . "-失败
";  
                    }  
                    // 下叁个分卷  
                    $p ++;  
                    // 重新初始化$sql变量为空,重新计算该变量大小  
                    $sql = "";  
                }  
            }  
            // sql大小相当不够分卷大小  
            if ($sql != "")  
            {  
                $filename .= "_v" . $p . ".sql";  
                if ($this->_write_file ( $sql, $filename, $dir
))  
                {  
                    echo "表-" . $tablename . "-卷-" . $p .
"-数据备份完毕,生成备份文件 $dir$filename
";  
                }  
                else 
                {  
                    echo "备份卷-" . $p . "-失败
";  
                }  
            }  
        }  
        else 
        { // 备份全体表  
            if ($tables = mysql_query ( "show table status from " .
$this->database ))  
            {  
                echo "读取数据库构造成功!
";  
            }  
            else 
            {  
                exit ( "读取数据库布局成功!
" );  
            }  
            // 插入dump信息  
            $sql .= $this->_retrieve();  
            // 文件名前边部分  
            $filename = date ( 'YmdHis' ) . "_all";  
            // 查出全体表  
            $tables = mysql_query ( 'SHOW TABLES' );  
            // 第几分卷  
            $p = 1;  
            // 循环全体表  
            while ( $table = mysql_fetch_array ( $tables ) )  
            {  
                // 获取表名  
                $tablename = $table [0];  
                // 获取表结构  
                $sql .= $this->_insert_table_structure (
$tablename );  
                $data = mysql_query ( "select * from " . $tablename
);  
                $num_fields = mysql_num_fields ( $data );  
   
                // 循环每条记下  
                while ( $record = mysql_fetch_array ( $data ) )  
                {  
                    // 单条记下  
                    $sql .= $this->_insert_record ( $tablename,
$num_fields, $record );  
                    // 即使超过分卷大小,则写入文件  
                    if (strlen ( $sql ) >= $size * 1000)  
                    {  
   
                        $file = $filename . "_v" . $p . ".sql";  
                        // 写入文件  
                        if ($this->_write_file ( $sql, $file, $dir
))  
                        {  
                            echo "-卷-" . $p .
"-数据备份实现,生成备份文件$dir$file
";  
                        }  
                        else 
                        {  
                            echo "备份卷-" . $p . "-失败
";  
                        }  
                        // 下二个分卷  
                        $p ++;  
                        // 重新设置$sql变量为空,重新总括该变量大小  
                        $sql = "";  
                    }  
                }  
            }  
            // sql大小远远不足分卷大小  
            if ($sql != "")  
            {  
                $filename .= "_v" . $p . ".sql";  
                if ($this->_write_file ( $sql, $filename, $dir
))  
                {  
                    echo "-卷-" . $p . "-数据备份达成,生成备份文件 $dir$filename
";  
                }  
                else 
                {  
                    echo "备份卷-" . $p . "-失败
";  
                }  
            }  
        }  
    }  
   
    /** 
     * 插入数据库备份根基音讯 
     * 
     * @return string 
     */ 
    private function _retrieve() {  
        $value = '';  
        $value .= '--' . $this->ds;  
        $value .= '-- MySQL database dump' . $this->ds;  
        $value .= '-- Created by DBManage class, Power By yanue. ' .
$this->ds;  
        $value .= '-- ' . $this->ds;  
        $value .= '--' . $this->ds;  
        $value .= '-- 主机: ' . $this->host . $this->ds;  
        $value .= '-- 生成日期: ' . date ( 'Y' 卡塔尔 . ' 年  ' . date ( 'm'
卡塔尔 . ' 月 ' . date ( 'd' 卡塔尔国 . ' 日 ' . date ( 'H:i' 卡塔尔国 . $this->ds;  
        $value .= '-- MySQL版本: ' . mysql_get_server_info () .
$this->ds;  
        $value .= '-- PHP 版本: ' . phpversion () . $this->ds;  
        $value .= $this->ds;  
        $value .= '--' . $this->ds;  
        $value .= '-- 数据库: `' . $this->database . '`' .
$this->ds;  
        $value .= '--' . $this->ds . $this->ds;  
        $value .= '--
-------------------------------------------------------';  
        $value .= $this->ds . $this->ds;  
        return $value;  
    }  
   
    /** 
     * 插入表布局 
     * 
     * @param unknown_type $table 
     * @return string 
     */ 
    private function _insert_table_structure($table) {  
        $sql = '';  
        $sql .= "--" . $this->ds;  
        $sql .= "-- 表的布局" . $table . $this->ds;  
        $sql .= "--" . $this->ds . $this->ds;  
   
        // 如若存在则删除表  
        $sql .= "DROP TABLE IF EXISTS `" . $table . '`' .
$this->sqlEnd . $this->ds;  
        // 获取详细表音信  
        $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`'
);  
        $row = mysql_fetch_array ( $res );  
        $sql .= $row [1];  
        $sql .= $this->sqlEnd . $this->ds;  
        // 加上  
        $sql .= $this->ds;  
        $sql .= "--" . $this->ds;  
        $sql .= "-- 转存表中的数据 " . $table . $this->ds;  
        $sql .= "--" . $this->ds;  
        $sql .= $this->ds;  
        return $sql;  
    }  
   
    /** 
     * 插入单条记录 
     * 
     * @param string $table 
     * @param int $num_fields 
     * @param array $record 
     * @return string 
     */ 
    private function _insert_record($table, $num_fields, $record)
{  
        // sql字段逗号分割  
        $insert = $comma = "";  
        $insert .= "INSERT INTO `" . $table . "` VALUES(";  
        // 循环每种子段上面包车型客车内容  
        for($i = 0; $i < $num_fields; $i ++) {  
            $insert .= ($comma . "'" .mysql_real_escape_string (
$record [$i] ) . "'");  
            $comma = ",";  
        }  
        $insert .= ");" . $this->ds;  
        return $insert;  
    }  
   
    /** 
     * 写入文件 
     * 
     * @param string $sql 
     * @param string $filename 
     * @param string $dir 
     * @return boolean 
     */ 
    private function _write_file($sql, $filename, $dir) {  
        $dir = $dir ? $dir : './backup/';  
        // 子虚乌有文件夹则创制  
        if (! file_exists ( $dir )) {  
            mkdir ( $dir );  
        }  
        $re = true;  
        if (! @$fp = fopen ( $dir . $filename, "w+" )) {  
            $re = false;  
            echo "展开文件战败!";  
        }  
        if (! @fwrite ( $fp, $sql )) {  
            $re = false;  
            echo "写入文件战败,请文件是还是不是可写";  
        }  
        if (! @fclose ( $fp )) {  
            $re = false;  
            echo "关闭文件失利!";  
        }  
        return $re;  
    }  
   
    /* 
      * 
      *
-------------------------------上:数据库导出-----------分界线----------下:数据库导入-------------------------------- 
      */ 
   
    /** 
     * 导入备份数据 
     * 表明:分卷文件格式二〇一一0516211738_all_v1.sql 
     * 参数:文件路线(必填State of Qatar 
     * 
     * @param string $sqlfile 
     */ 
    function restore($sqlfile)  
    {  
        // 检查实验文件是或不是存在  
        if (! file_exists ( $sqlfile ))  
        {  
            exit ( "文件不设有!请检查" 卡塔尔国;  
        }  
        $this->lock ( $this->database );  
        // 获取数据仓库储存款和储蓄地点  
        $sqlpath = pathinfo ( $sqlfile );  
        $this->sqldir = $sqlpath ['dirname'];  
        //
检测是不是带有分卷,将看似贰零壹贰0516211738_all_v1.sql从_v分开,有则注明有分卷  
        $volume = explode ( "_v", $sqlfile );  
        $volume_path = $volume [0];  
        echo
"请勿刷新及倒闭浏览器避防范程序被中断,如有不慎!将引致数据库布局受到损伤
";  
        echo "正在导入备份数据,请稍等!
";  
        if (emptyempty ( $volume [1] ))  
        {  
            echo "正在导入sql:" . $sqlfile .
'
';  
            // 未有分卷  
            if ($this->_import ( $sqlfile )) {  
                echo "数据库导入成功!";  
            }  
            else 
            {  
                exit ( '数据库导入退步!' 卡塔尔(قطر‎;  
            }  
        }  
        else 
        {  
            //$volume_id = array();  
            // 存在分卷,则赢伏贴前是第几分卷,循环实践余下分卷  
            $volume_id = explode ( ".sq", $volume [1] );  
            // 当前分卷为$volume_id  
            $volume_id = intval ( $volume_id [0] );  
            while ( $volume_id )  
            {  
                $tmpfile = $volume_path . "_v" . $volume_id .
".sql";  
                // 存在别的分卷,继续实施  
                if (file_exists ( $tmpfile )) {  
                    // 实施导入方法  
                    echo "正在导入分卷" .
$tmpfile . '
';  
                    if ($this->_import ( $tmpfile ))  
                    {  
   
                    }  
                    else 
                    {  
                        exit ( "导入分卷" .
$tmpfile . '失败!或然是数据库构造已破坏!请尝试从分卷1始发导入'
State of Qatar;  
                    }  
                }  
                else 
                {  
                    echo "此分卷备份全部导入成功!
";  
                    return;  
                }  
                $volume_id++;  
            }  
        }  
    }  
   
    /** 
     * 将sql导入到数据库(普通导入) 
     * 
     * @param string $sqlfile 
     * @return boolean 
     */ 
    private function _import($sqlfile) {  
        // sql文件包罗的sql语句数组  
        $sqls = array ();  
        $f = fopen ( $sqlfile, "rb" );  
        // 成立表缓冲变量  
        $create = '';  
        while ( ! feof ( $f ) ) {  
            // 读取每大器晚成行sql  
            $line = fgets ( $f );  
            // 假若含有'-- '等注释,或为空白行,则跳过  
            if (trim ( $line ) == '' || preg_match ( '/--*?/', $line,
$match )) {  
                continue;  
            }  
            //
假如最后富含';'(即为一个完完全全的sql语句,这里是插入语句卡塔尔国,何况不分包'ENGINE='(即创造表的最后一句卡塔尔(قطر‎,  
            if (! preg_match ( '/;/', $line, $match ) || preg_match (
'/ENGINE=/', $line, $match )) {  
                // 将此次sql语句与创造表sql连接存起来  
                $create .= $line;  
                // 如若含有了成立表的尾声一句  
                if (preg_match ( '/ENGINE=/', $create, $match )) {  
                    // 则将其联合到sql数组  
                    $sqls [] = $create;  
                    // 清空当前,盘算下叁个表的创导  
                    $create = '';  
                }  
                // 跳过这次  
                continue;  
            }  
            $sqls [] = $line;  
        }  
        fclose ( $f );  
        // 循环sql语句数组,分别施行  
        foreach ( $sqls as $sql ) {  
            str_replace ( "n", "", $sql );  
            if (! mysql_query ( trim ( $sql ) )) {  
                echo mysql_error ();  
                return false;  
            }  
        }  
        return true;  
    }  
   
    /* 
      *
-------------------------------数据库导入end--------------------------------- 
      */ 
   
    // 关闭数据库连接  
    private function close() {  
        mysql_close ( $this->db );  
    }  
   
    // 锁定数据库,避防备份或导入时出错  
    private function lock($tablename, $op = "WRITE") {  
        if (mysql_query ( "lock tables " . $tablename . " " . $op
))  
            return true;  
        else 
            return false;  
    }  
   
    // 解锁  
    private function unlock() {  
        if (mysql_query ( "unlock tables" ))  
            return true;  
        else 
            return false;  
    }  
   
    // 析构  
    function __destruct() {  
        mysql_query ( "unlock tables", $this->db );  
        mysql_close ( $this->db );  
    }
}
 
$db = new DBManage ( 'localhost', 'root', '', 'tao', 'gbk' ); 
//$db->backup ('tao_admin');  
$db->restore ( './backup/20140228222713_tao_admin_v1.sql');
?>

 // 解锁
 private function unlock() {
  if (mysql_query ( "unlock tables" ))
   return true;
  else
   return false;
 }

 /*
  *
------------------------------------------数据库备份start----------------------------------------------------------
  */

 // 关闭数据库连接
 private function close() {
  mysql_close ( $this->db );
 }

php导出sql
导出成的sql语句效果

导入.sql文件到mysql数据库

 /*
  *
-------------------------------数据库导入end---------------------------------
  */

 /**
  * 插入数据库备份功底消息
  *
  * @return string
  */
 private function _retrieve() {
  $value = '';
  $value .= '--' . $this->ds;
  $value .= '-- MySQL database dump' . $this->ds;
  $value .= '-- Created by DBManage class. ' . $this->ds;
  $value .= '-- ' . $this->ds;
  $value .= '--' . $this->ds;
  $value .= '-- 主机: ' . $this->host . $this->ds;
  $value .= '-- 生成日期: ' . date ( 'Y' 卡塔尔国 . ' 年  ' . date ( 'm' 卡塔尔(قطر‎ . '
月 ' . date ( 'd' State of Qatar . ' 日 ' . date ( 'H:i' 卡塔尔国 . $this->ds;
  $value .= '-- MySQL版本: ' . mysql_get_server_info () .
$this->ds;
  $value .= '-- PHP 版本: ' . phpversion () . $this->ds;
  $value .= $this->ds;
  $value .= '--' . $this->ds;
  $value .= '-- 数据库: `' . $this->database . '`' .
$this->ds;
  $value .= '--' . $this->ds . $this->ds;
  $value .= '--
-------------------------------------------------------';
  $value .= $this->ds . $this->ds;
  return $value;
 }

转载本站文章请注明出处:新萄京娱乐网址2492777 http://www.cdhbjs.com/?p=5320

上一篇:

下一篇:

相关文章