搜索
首页数据库mysql教程详解MYSQL的备份还原(PHP实现)_MySQL

bitsCN.com 手把手教你实现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]} --/r/n";
            $sql.="{$temp[1]}";
            $sql.=";-- --/r/n/r/n";
        }
        return $sql;
    }

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

五、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 --/r/n";
            $sql.="INSERT INTO `$v` VALUES/r/n";       
            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.="),/r/n";
            }
            $sql=mb_substr($sql, 0, -3);
            $sql.=";-- --/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.=";-- --/r/n/r/n",详见第四步注

六、备份操作

/**
     * 备份 ...
     * @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]} --/r/n";
            $sql.="{$temp[1]}";
            $sql.=";-- --/r/n/r/n";
        }
        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 --/r/n";
            $sql.="INSERT INTO `$v` VALUES/r/n";       
            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.="),/r/n";
            }
            $sql=mb_substr($sql, 0, -3);
            $sql.=";-- --/r/n/r/n";   
        }

        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);
bitsCN.com

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
雷电模拟器如何新建一个模拟器-雷电模拟器新建一个模拟器的方法雷电模拟器如何新建一个模拟器-雷电模拟器新建一个模拟器的方法Mar 05, 2024 pm 03:04 PM

最近一些刚刚下载接触雷电模拟器软件的用户,询问小编雷电模拟器如何新建一个模拟器?以下内容就带来了雷电模拟器新建一个模拟器的方法,让我们一起来下文看看吧。找到雷电模拟器器软件。双击打开雷电多开器。点击新建/复制模拟器。点击新建模拟器。就可以得到一个新建的模拟器了。找到雷电模拟器器软件,双击打开雷电多开器,点击新建/复制模拟器,点击新建模拟器,就可以得到一个新建的模拟器了。

iOS的developer版和public版有什么区别?iOS的developer版和public版有什么区别?Mar 01, 2024 pm 12:55 PM

每年Apple发布新的iOS和macOS大版本之前,用户都可以提前几个月下载测试版抢先体验一番。由于公众和开发人员都使用该软件,所以苹果公司为两者推出了developer和public版即开发者测试版的公共测试版。iOS的developer版和public版有什么区别呢?从字面上的意思来说,developer版是开发者测试版,public版是公共测试版。developer版和public版面向的对象不同。developer版是苹果公司给开发者测试使用的,需要苹果开发者帐号才可以收到下载并升级,是

如何在电脑上创建新的Word文档如何在电脑上创建新的Word文档Dec 27, 2023 pm 10:05 PM

新建word文档的方法也是有很多种的,我们可以通过右键桌面,然后点击新建doc文档还是docx文档,具体的方法都是差不多的,下面我们一起来看一下吧。使用电脑新建word文档方法:win11:1、首先我们右键点击“新建”。2、然后选择“docx或者是doc”文件。3、最后就可以完成创建了。win10:1、我们右键选择“新建”。2、随后还是选择两个文档中的一个。3、最后就完成创建了。win7:1、首先右键选择“新建”。2、然后选择word文档。3、最后就可以完成新建了。

Win10磁盘新建跨区卷灰色怎么版Win10磁盘新建跨区卷灰色怎么版Jul 02, 2023 am 08:13 AM

Win10磁盘新建跨区卷灰色怎么办?有时候我们硬盘中有多个未使用的空间,我们可以将他们合并起来放在一个逻辑卷中,这样可以更有效地使用多个硬盘上的空间,这个就是跨区卷了。但是有网友说自己的win10系统在新建跨区卷的时候出现问题,发现磁盘新建跨区卷灰色点不了怎么回事?如何新建跨区卷?下面小编教下大家正确的新建跨区卷方法。  Win10磁盘新建跨区卷灰色解决步骤  首先,如下图所示两个硬盘上的空间可以使用同一个卷,建立跨区卷即可。  那么跨区卷灰色点不了的原因可能有下面的因素:  1、如果包含一个跨

企业微信新建一个月报的详细方法企业微信新建一个月报的详细方法Mar 25, 2024 pm 05:36 PM

1、打开企业微信。2、点击下左侧的【应用】图标按钮。3、点击下【汇报】,【新建】,【月报】选项。4、然后可以看到,需要输入本月工作等。5、输入本月工作的内容,其他的可填可不填,点击【提交】按钮。6、最后就可以看到自己的月报详情了。

解决Win10右键没有"新建"选项的问题解决Win10右键没有"新建"选项的问题Jan 05, 2024 am 09:45 AM

在使用win10系统的时候,有些小伙伴们在桌面使用鼠标右键的时候,发现右键菜单中没有新建的选项,其实只需要通过注册表往里面添加一个选项就能够右键新建了。win10右键没有新建选项怎么办:1、按下组合键+打开运行,输入点击确定,打开注册表编辑器。2、然后依次展开文件夹:。3、然后找到文件夹,如果没有该文件夹,就右键文件夹--,命名为。4、打开new文件夹中的文件后,我们将这个数值数据更改为。5、然后重启电脑,就能够解决这个问题了。

真我手机文件夹建立步骤指南真我手机文件夹建立步骤指南Mar 23, 2024 pm 03:51 PM

真我手机文件夹建立步骤指南在日常生活中,我们使用手机来存储各种各样的文件,包括照片、视频、文档等等。然而,随着时间的推移,手机上的文件可能会越来越多,导致手机内存不足或文件难以管理。为了更好地整理文件并提高手机使用效率,手机文件夹的建立变得尤为重要。真我手机是一款受欢迎的智能手机品牌,拥有强大的系统和多样的功能。在真我手机上建立文件夹可以帮助用户更好地整理文

Java 函数的访问权限修饰符之 public 使用指南Java 函数的访问权限修饰符之 public 使用指南Apr 26, 2024 am 08:39 AM

Javapublic访问权限修饰符允许函数从任何位置访问,用于声明公共API、定义跨包或类共享的工具和实用程序。具体用法如下:语法:public返回值类型函数名称(参数列表){...}场景:需要从任何地方访问的函数、公共API中的方法、共享的工具或实用程序

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器