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

你可能感兴趣的文章
NSDateFormatter的替代方法
查看>>
NSError 的使用方法
查看>>
NSGA-Ⅲ源代码
查看>>
nsis 安装脚本示例(转)
查看>>
NSJSON的用法(oc系统自带的解析方法)
查看>>
nslookup 的基本知识与命令详解
查看>>
NSNumber与NSInteger的区别 -bei
查看>>
NSOperation基本操作
查看>>
NSRange 范围
查看>>
NSSet集合 无序的 不能重复的
查看>>
NSURLSession下载和断点续传
查看>>
NSUserdefault读书笔记
查看>>
NS图绘制工具推荐
查看>>
NT AUTHORITY\NETWORK SERVICE 权限问题
查看>>
NT symbols are incorrect, please fix symbols
查看>>
ntelliJ IDEA 报错:找不到包或者找不到符号
查看>>
NTFS文件权限管理实战
查看>>
ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
查看>>
ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
查看>>
ntp server 用法小结
查看>>