php备份还原mysql数据库数据表代码

代码语言:php

所属分类:其他

代码描述:php备份还原mysql数据库数据表代码

代码标签: mysql 数据库 数据表

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<?php

class MysqlBackStore
{

    var $db;
    // 数据库连接
    var $database;
    // 所用数据库
    var $sqldir;
    // 数据库备份文件夹
    // 换行符
    private $ds = "\n";
    // 存储SQL的变量
    public $sqlContent = "";
    // 每条sql语句的结尾符
    public $sqlEnd = ";";

    /**
     * 初始化
     *
     * @param string $host
     * @param string $username
     * @param string $password
     * @param string $database
     * @param string $charset
     */
    function __construct($host = 'localhost', $username = 'root', $password = 'root', $database = 'bfwtest', $charset = 'utf8')
    {
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
        $this->charset = $charset;

      //  @ob_end_flush();
        // 连接数据库
        $this->db = @mysql_connect($this->host, $this->username, $this->password) or die('<p class="dbDebug"><span class="err">Mysql Connect Error : </span>' . mysql_error() . '</p>');
        // 选择使用哪个数据库
        mysql_select_db($this->database, $this->db) or die('<p class="dbDebug"><span class="err">Mysql Connect Error:</span>' . mysql_error() . '</p>');
        // 数据库编码方式
        mysql_query('SET NAMES ' . $this->charset, $this->db);
    }

    /*
     * 新增查询数据库表
     */
    function getTables()
    {
        $res = mysql_query("SHOW TABLES");
        $tables = array();
        while ($row = mysql_fetch_array($res)) {
            $tables[] = $row[0];
        }
        return $tables;
    }

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

    /**
     * 数据库备份
     * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M)
     *
     * @param $string $dir
     * @param int $size
     * @param $string $tablename
     */
    function backup($tablename = '', $dir = './', $size = 20480)
    {
        $dir = $dir ? $dir : './';
        // 创建目录
        if (! is_dir($dir)) {
            @mkdir($dir, 0777, true) or die('创建文件夹失败');
        }
        $size = $size ? $size : 1024 * 20;
        $sql = '';
        // 只备份某个表
        if (! empty($tablename)) {
            if (@mysql_num_rows(mysql_query("SHOW TABLES LIKE '" . $tablename . "'")) == 1) {} else {
                $this->_showMsg('表-<b>' . $tablename . '</b>-不存在,请检查!', true);
                die();
            }
            $this->_showMsg('正在备份表 <span class="imp">' . $tablename . '</span>');
            // 插入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 * 1024) {
                    $file = $filename . "_v" . $p . ".sql";
                    if ($this->_write_file($sql, $file, $dir)) {
                        $this->_showMsg("表-<b>" . $tablename . "</b>-卷-<b>" . $p . "</b>-数据备份完成,备份文件 [ <span class='imp'>" . $dir . $file . "</span> ]");
                    } else {
                        $this->_showMsg("备份表 -<b>" . $tablename . "</b>- 失败", true);
                        return false;
                    }
                    // 下一个分卷
                    $p ++;
                    // 重置$sql变量为空,重新计算该变量大小
                    $sql = "";
                }
            }
            // 及时清除数据
            unset($data, $record);
            // sql大小不够分卷大小
            if ($sql != "") {
                $filename .= "_v" . $p . ".sql";
                if ($this->_write_file($sql, $filename, $dir)) {
                    $this->_showMsg("表-<b>" . $tablename . "</b>-卷-<b>" . $p . "</b>-数据备份完成,备份文件 [ <span class='imp'>" . $dir . $filename . "</span> ]");
                } else {
                    $this->_showMsg("备份卷-<b>" . $p . "</b>-失败<br />");
                    return false;
                }
            }
            $this->_showMsg("恭喜您! <span class='imp'>备份成功</span>");
        } else {
            $this->_showMsg('正在备份');
            // 备份全部表
            if ($tables = mysql_query("show table status from " . $this->database)) {
                $this->_showMsg("读取数据库结构成功!");
            } else {
                $this->_showMsg("读取数据库结构失败!");
                exit(0);
            }
            // 插入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)) {
                            $this->_showMsg("-卷-<b>" . $p . "</b>-数据备份完成,备份文件 [ <span class='imp'>" . $dir . $file . "</span> ]");
                        } else {
                            $this->_showMsg("卷-<b>" . $p . "</b>-备份失败!", true);
                            return false;
                        }
                        // 下一个分卷
                        $p ++;
                        // 重置$sql变量为空,重新计算该变量大小
                        $sql = "";
                    }
                }
            }
            // sql大小不够分卷大小
            if ($sql != "") {
                $filename .= "_v" . $p . ".sql";
                if ($this->_write_file($sql, $filename, $dir)) {
                    $this->_showMsg("-卷-<b>" . $p . "</b>-数据备份完成,备份文件 [ <span class='imp'>" . $dir . $filename . "</span> ]");
                } else {
                    $this->_showMsg("卷-<b>" . $p . "</b>-备份失败", true);
                    return false;
                }
            }
            $this->_showMsg("恭喜您! <span class='imp'>备份成功</span>");
        }
    }

    function BackDb($filename)
    {
        $sql = '';
        // 备份全部表
        if ($tables = mysql_query("show table status from " . $this->database)) {
            $this->_showMsg("读取数据库结构成功!");
        } else {
            $this->_showMsg("读取数据库结构失败!");
            exit(0);
        }
        // 插入dump信息
        $sql .= $this->_retrieve();
        // 文件名前面部分
        // $filename = date ( 'YmdHis' ) . "_all";
        // 查出所有表
        $sql .=$this->_insert_db_structure($this->database);
        $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 ($this->_write_filename($sql, $filename)) {
                    $this->_showMsg("-卷-<b>" . $p . "</b>-数据备份完成,备份文件 [ <span class='imp'>" . $dir . $file . "</span> ]");
                } else {
                    $this->_showMsg("卷-<b>" . $p . "</b>-备份失败!", true);
                    return false;
                }
            }
        }
    }

    // 及时输出信息
    private function _showMsg($msg, $err = false)
    {
        $err = $err ? "<span class='err'>ERROR:</span>" : '';
        echo "<p class='dbDebug'>" . $err . $msg . "</p>";
        flush();
    }

    /**
     * 插入数据库备份基础信息
     *
     * @return string
     */
    private function _retrieve()
    {
        $value = '';
        $value .= '--' . $this->ds;
        $value .= '-- MySQL database dump' . $this->ds;
        $value .= '-- Created by Bfw class, Power By Bfw. ' . $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;
    }

.........完整代码请登录后点击上方下载按钮下载查看

网友评论0