博客
关于我
yii 备份还原数据库
阅读量:723 次
发布时间:2019-03-21

本文共 4379 字,大约阅读时间需要 14 分钟。

备份Model:

namespace backend\models;use Yiisoft\Yii\ActiveRecord;class DbModel extends ActiveRecord{    protected $dbdata_path = "dbdata";        public function init()    {        header("Content-type: text/html;charset=utf-8");    }    /* 获取所有数据表 */    protected function getTables()    {        return Yii::$app->db->getSchema()->getTableNames();    }    /* 备份地址 */    protected function getBackUpPath()    {        $path = dirname(dirname(__FILE__)) . '/' . $this->dbdata_path;        if (!file_exists($path)) {            @mkdir($path, 0777);        }        return $path;    }    /* 文件名称 */    protected function makeFileName()    {        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';        $name = '';        for ($i = 0; $i < 5; $i++) {            $name .= $chars[mt_rand(0, strlen($chars) - 1)];        }        return date("Ymd") . '_' . $name . '.sql';    }    /* 给字段、表名加上` */    protected function addStyle($str)    {        return "`{$str}`";    }    /* 获取表结构 */    protected function getTableStructure($table)    {        $data = Yii::$app->db->createCommand('SHOW CREATE TABLE ' . $this->addStyle($table))->queryAll();        return $data[0]['Create Table'];    }    /* 获取表数据 */    protected function getTableDatas($table)    {        $data = Yii::$app->db->createCommand('SELECT * FROM ' . $this->addStyle($table))->queryAll();        $fields = '';        $values = '';        $content = '';        foreach ($data as $key => $val) {            $fields = array_keys($val);            $values = array_values($val);            $sql = "INSERT INTO " . $this->addStyle($table) . "(";            $sql .= "`" . implode("`, `", $fields) . "`) VALUES (";            $sql .= "'" . implode("', '", $values) . "'); \r\n";            $content .= $sql;        }        return $content;    }    /* 备份数据库 */    public function backUp()    {        $tables = $this->getTables();        $path = $this->getBackUpPath();        $fileName = $this->makeFileName();        $content = "SET FOREIGN_KEY_CHECKS=0; \r\n";        foreach ($tables as $key => $val) {            $content .= "DROP TABLE IF EXISTS " . $this->addStyle($val) . "; \r\n";            $content .= $this->getTableStructure($val) . "; \r\n";            $content .= $this->getTableDatas($val) . "\r\n";        }        $back_path = $this->getBackUpPath();        $file_name = $this->makeFileName();        $file = $back_path . '/' . $file_name;        $fp = fopen($file, 'w');        @fwrite($fp, $content);        fclose($fp);    }    /* 获取所有的sql文件 */    public function getSqlFiles()    {        $path = dirname(dirname(__FILE__)) . '/' . $this->dbdata_path;        $sqls = [];        if (file_exists($path)) {            $dir_handle = @opendir($path);            while ($file = @readdir($dir_handle)) {                $file_info = pathinfo($file);                if ($file_info['extension'] == 'sql') {                    $sql['name'] = $file;                    $sql['create_time'] = date('Y-m-d', filectime($path . '/' . $file));                    $sqls[] = $sql;                }            }        }        return $sqls;    }    /** 还原数据库 */    public function recoverSqlFile($sqlFileName)    {        $path = dirname(dirname(__FILE__)) . '/' . $this->dbdata_path;        $sqlFile = $path . '/' . $sqlFileName;        if (file_exists($sqlFile)) {            $sqls = file_get_contents($sqlFile);            Yii::$app->db->createCommand($sqls)->execute();        }    }    /* 删除数据备份 */    public function deleteSqlFile($sqlFileName)    {        $path = dirname(dirname(__FILE__)) . '/' . $this->dbdata_path;        $sqlFile = $path . '/' . $sqlFileName;        if (file_exists($sqlFile)) {            @unlink($sqlFile);        }    }}

控制器:

public function actionIndex(){    $dbModel = new DbModel();    $dataProvider = $dbModel->getSqlFiles();    return $this->render('index', [        'dataProvider' => $dataProvider,    ]);}public function actionCreate(){    $dbModel = new DbModel();    $dbModel->backUp();    return $this->redirect(['index']);}public function actionUpdate($file){    $dbModel = new DbModel();    $dbModel->recoverSqlFile($file);    return $this->redirect(['index']);}public function actionDelete($file){    $dbModel = new DbModel();    $dbModel->deleteSqlFile($file);    return $this->redirect(['index']);}

转载地址:http://vkbgz.baihongyu.com/

你可能感兴趣的文章
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>
mysql 敲错命令 想取消怎么办?
查看>>
Mysql 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>