当前位置:  数据库>mysql

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

    来源: 互联网  发布时间:2014-10-09

    本文导语:  手把手教你实现MYSQL的备份还原示例代码用我比较熟悉的PHP,当然你看完并理解了其中的思路,相信你也可以快速地用你熟悉的语言自己写出来。一、新建dbBackup类,设置默认参数。 代码如下:class dbBackup {    public $host='localhos...

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

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

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

/**
     * 连接数据库 ...
     */
    function db() {       
        $con = mysql_connect($this->host,$this->user,$this->pwd);
        if (!$con){
            die('Could not connect');
        }

        $db_selected = mysql_select_db($this->database, $con);
        if (!$db_selected) {
            die('Can't use select db');
        }

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

        return $con;
    }

三、查询数据库表集合
代码如下:

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

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

        return $list;
    }

四、查询表结构
代码如下:

/**
     * 表结构SQL ...
     */
    function sqlcreate() {
        $sql='';

        $tb=$this->tblist();       
        foreach ($tb as $v) {
            $rs=mysql_query("SHOW CREATE TABLE $v");
            $temp=mysql_fetch_row($rs);
            $sql.="-- 表的结构:{$temp[0]} --rn";
            $sql.="{$temp[1]}";
            $sql.=";-- --rnrn";
        }
        return $sql;
    }

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

五、INSERT INTO语句
代码如下:

/**
     * 数据插入SQL ...
     */
    function sqlinsert() {
        $sql='';

        $tb=$this->tblist();       
        foreach ($tb as $v) {
            $rs=mysql_query("SELECT * FROM $v");
            if (!mysql_num_rows($rs)) {//无数据返回
                continue;
            }       
            $sql.="-- 表的数据:$v --rn";
            $sql.="INSERT INTO `$v` VALUESrn";       
            while ($temp=mysql_fetch_row($rs)) {
                $sql.='(';
                foreach ($temp as $v2) {
                    if ($v2===null) {
                        $sql.="NULL,";
                    }
                    else {
                        $v2=mysql_real_escape_string($v2);
                        $sql.="'$v2',";
                    }                   
                }
                $sql=mb_substr($sql, 0, -1);
                $sql.="),rn";
            }
            $sql=mb_substr($sql, 0, -3);
            $sql.=";-- --rnrn";   
        }

        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.=";-- --rnrn",详见第四步注

六、备份操作
代码如下:

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

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

        return file_put_contents($filename, $data);
    }

七、还原操作
代码如下:

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

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

        //执行SQL
        $str=file_get_contents($filename);
        $arr=explode('-- --', $str);
        array_pop($arr);

        foreach ($arr as $v) {
            $rs=mysql_query($v);
            if ($rs===false) {
                return false;
            }
        }

        return true;
    }

备份示例:
代码如下:

$x=new dbBackup();
$x->database='test';
$rs=$x->beifen('db.sql');
var_dump($rs);

还原示例:
代码如下:

$x=new dbBackup();
$x->database='test';
$rs=$x->huanyuan('db.sql');
var_dump($rs);

完整代码:
代码如下:

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

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

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

        return file_put_contents($filename, $data);
    }

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

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

        //执行SQL
        $str=file_get_contents($filename);
        $arr=explode('-- --', $str);
        array_pop($arr);

        foreach ($arr as $v) {
            $rs=mysql_query($v);
            if ($rs===false) {
                return false;
            }
        }

        return true;
    }

    /**
     * 连接数据库 ...
     */
    function db() {       
        $con = mysql_connect($this->host,$this->user,$this->pwd);
        if (!$con){
            die('Could not connect');
        }

        $db_selected = mysql_select_db($this->database, $con);
        if (!$db_selected) {
            die('Can't use select db');
        }

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

        return $con;
    }

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

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

        return $list;
    }

    /**
     * 表结构SQL ...
     */
    function sqlcreate() {
        $sql='';

        $tb=$this->tblist();       
        foreach ($tb as $v) {
            $rs=mysql_query("SHOW CREATE TABLE $v");
            $temp=mysql_fetch_row($rs);
            $sql.="-- 表的结构:{$temp[0]} --rn";
            $sql.="{$temp[1]}";
            $sql.=";-- --rnrn";
        }
        return $sql;
    }

    /**
     * 数据插入SQL ...
     */
    function sqlinsert() {
        $sql='';

        $tb=$this->tblist();       
        foreach ($tb as $v) {
            $rs=mysql_query("SELECT * FROM $v");
            if (!mysql_num_rows($rs)) {//无数据返回
                continue;
            }       
            $sql.="-- 表的数据:$v --rn";
            $sql.="INSERT INTO `$v` VALUESrn";       
            while ($temp=mysql_fetch_row($rs)) {
                $sql.='(';
                foreach ($temp as $v2) {
                    if ($v2===null) {
                        $sql.="NULL,";
                    }
                    else {
                        $v2=mysql_real_escape_string($v2);
                        $sql.="'$v2',";
                    }                   
                }
                $sql=mb_substr($sql, 0, -1);
                $sql.="),rn";
            }
            $sql=mb_substr($sql, 0, -3);
            $sql.=";-- --rnrn";   
        }

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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • html保留字符详解
  • 关于tcp/ip详解卷2中的代码
  • Linux/centos/redhat下各种压缩解压缩方式详解
  • 请问哪儿有java2编程详解的电子书下载??本人急需!!跟贴有分!!!
  • linux c malloc函数定义及用法详解
  • 哪有LINUX命令详解下??
  • TCP协议报头字段详解及报头图
  • 请问:setTimeout(p1,p2) 的函数详解,马上给分的。
  • Web前端设计:html上标<sup>标签与下标<sub>标签详解
  • 求 sun ldoms 配置 虚拟化服务器 步骤详解
  • TCP协议三次握手过程详解
  • 请问:哪里可以下tcp/ip详解书上程序的源码
  • HTML 5 <acronym> 标签定义用法详解
  • linux 2.4 内核软中断详解?
  • c++断言assert()函数的头文件及其用法详解
  • 哪本书介绍mutex、POSIX 线程详解
  • html5/css3文本阴影(text-shadow)详解及示例
  • 哪位java同门师兄有《java2编程详解》电子文档,注意不是影印版
  • HTML 5中<address> 标签定义用法详解及几个示例
  • 如何在Linux下使用脚本实现程序的自动重启!望各位详解!
  • linux下进程占用内存空间详解
  • 大家推荐几本详解Linux或unix 操作系统源代码的书籍!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3