博客
关于我
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/

你可能感兴趣的文章
Neo4j(2):环境搭建
查看>>
Neo私链
查看>>
nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
nestJS学习
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
netcat的端口转发功能的实现
查看>>
netfilter应用场景
查看>>
netlink2.6.32内核实现源码
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
NetScaler的常用配置
查看>>
netsh advfirewall
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
Netty事件注册机制深入解析
查看>>