Maison base de données tutoriel mysql 详解MYSQL的备份还原(PHP实现)_MySQL

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

Jun 01, 2016 pm 01:24 PM
public 新建

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment créer un nouveau simulateur dans Lightning Simulator - Comment créer un nouveau simulateur dans Lightning Simulator Comment créer un nouveau simulateur dans Lightning Simulator - Comment créer un nouveau simulateur dans Lightning Simulator Mar 05, 2024 pm 03:04 PM

Comment créer un nouveau simulateur dans Lightning Simulator - Comment créer un nouveau simulateur dans Lightning Simulator

Quelle est la différence entre la version développeur et la version publique d'iOS ? Quelle est la différence entre la version développeur et la version publique d'iOS ? Mar 01, 2024 pm 12:55 PM

Quelle est la différence entre la version développeur et la version publique d'iOS ?

Comment créer un nouveau document Word sur votre ordinateur Comment créer un nouveau document Word sur votre ordinateur Dec 27, 2023 pm 10:05 PM

Comment créer un nouveau document Word sur votre ordinateur

Résolvez le problème de l'absence d'option 'Nouveau' sur le clic droit de Win10 Résolvez le problème de l'absence d'option 'Nouveau' sur le clic droit de Win10 Jan 05, 2024 am 09:45 AM

Résolvez le problème de l'absence d'option 'Nouveau' sur le clic droit de Win10

Méthode détaillée pour créer un nouveau rapport mensuel sur Enterprise WeChat Méthode détaillée pour créer un nouveau rapport mensuel sur Enterprise WeChat Mar 25, 2024 pm 05:36 PM

Méthode détaillée pour créer un nouveau rapport mensuel sur Enterprise WeChat

Comment créer une version grise d'un nouveau volume fractionné sur un disque Win10 Comment créer une version grise d'un nouveau volume fractionné sur un disque Win10 Jul 02, 2023 am 08:13 AM

Comment créer une version grise d'un nouveau volume fractionné sur un disque Win10

Tutoriel sur le nouveau document Win11 Tutoriel sur le nouveau document Win11 Dec 30, 2023 pm 07:59 PM

Tutoriel sur le nouveau document Win11

Guide étape par étape pour créer des dossiers sur le téléphone mobile Realme Guide étape par étape pour créer des dossiers sur le téléphone mobile Realme Mar 23, 2024 pm 03:51 PM

Guide étape par étape pour créer des dossiers sur le téléphone mobile Realme

See all articles