用户
 找回密码
 入住 CI 中国社区
搜索
查看: 17084|回复: 27
收起左侧

[讨论/交流] CI数据库备份与还原入门小例子

  [复制链接]
发表于 2010-8-5 14:40:50 | 显示全部楼层 |阅读模式
本帖最后由 ywqbestever 于 2010-8-23 09:09 编辑

最近看到有几个问CI数据库备份与还原的问题,以前也没做过还原的问题,就此探讨一下:我的思路:
使用CI的数据库工具类进行数据库备份,写入一个SQL文件中,恢复时,用CI的文件辅助函数读取文件内容进行query操作。
代码:
PHP复制代码
function backup(){                function backup(){
 
$this->load->dbutil();
 
$this->load->helper('file');
 
$prefs = array(
                'tables'      => array(),  // 包含了需备份的表名的数组.
                'ignore'      => array(),           // 备份时需要被忽略的表
                'format'      => 'txt',             // gzip, zip, txt
                'filename'    => 'mybackup.sql',    // 文件名 - 如果选择了ZIP压缩,此项就是必需的
                'add_drop'    => TRUE,              // 是否要在备份文件中添加 DROP TABLE 语句
                'add_insert'  => TRUE,              // 是否要在备份文件中添加 INSERT 语句
                'newline'     => "\\n"               // 备份文件中的换行符
              );
 
$backup = $this->dbutil->backup($prefs);
 
write_file('./database.sql', $backup);
 
}
 
 
 
function restore(){
 
$this->load->helper('file');
 
//$content = read_file('./database.sql');
 
//$content = preg_replace("/#(.*)\\s#(.*)TABLE(.*)(.*)\\s#/i","",$content);//去掉注释部分
 
$conn=mysql_connect("localhost","root","");//指定数据库连接参数
 
mysql_select_db("test");
 
$file = BASEPATH . "database.sql";
 
mysql_query("source '".$file."';");
 
mysql_close($conn);
 
/*$sqls = explode(";\\r",$content);
 
foreach($sqls as $sql){
 
if(str_replace(" ","",$sql)){
 
$this->db->query($sql);
 
}
 
}*/

 
}
复制代码

恢复的函数中注释的部分,是想尝试使用CI的数据库进行导入的,结果发现直接query文件中的内容不行
然后去掉CI备份文件中的注释部分,发现依然不可以,接着进行打散SQL语句,然后一条一条query,是可以的。
最后用原始的函数是可以完美进行的,而且不用去掉注释部分。

大家有啥好的方法欢迎发出来分享啊
:)

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

发表于 2017-6-12 14:06:47 | 显示全部楼层
PHP复制代码
 
case 'add':
                //生成数据库备份
                $this->load->helper('string');
                $this->load->dbutil();
                $prefs = array(
                    'ignore'    => array($this->db->dbprefix('ci_sessions')),
                    'format'    => 'txt'
                );
                $backup = $this->dbutil->backup($prefs);
                $this->load->helper('file');
                write_file($bak_dir.$this->db->database.'_'.date('Ymd').'_'.random_string('alnum', 8).'.sql', $backup);
                $data['mes']="备份成功!";
                $data['backurl']= base_url('/set/backup');
                $this->load->view('templates/note',$data);
                break;
            case 'recover':   //恢复指定数据库
                    $this->load->helper('file');
                    $this->load->helper('string');
                    $file = $bak_dir.$id; //.sql文件实际地址
                    //数据库信息
                    $host = $this->db->hostname;
                    $user = $this->db->username;
                    $pwd  = $this->db->password;
                    $db   = $this->db->database;
 
                    $string = read_file($file);
                    $mysqli = new mysqli($host,$user,$pwd,$db);
                    $mysqli->set_charset("utf8");
                    $result = $mysqli->multi_query($string);
                    $mysqli->close();
                    if($result){
                        $data['mes']="数据库恢复成功!";
                    } else{
                        $data['mes']="数据库恢复失败!";
                    }
                    $data['backurl']= base_url('/set/backup');
                    $this->load->view('templates/note',$data);
                break;
 
复制代码
发表于 2017-6-16 09:24:56 | 显示全部楼层
豪气东来 发表于 2017-6-14 16:14
上面的方法,只是备份默认的数据库test,如何备份需要指定的数据库了?

$mysqli = new mysqli($host,$user,$pwd,$db);
将这几个参数改成你要备份的数据库相关信息就好了
发表于 2017-6-14 16:14:07 | 显示全部楼层
上面的方法,只是备份默认的数据库test,如何备份需要指定的数据库了?
发表于 2010-8-13 02:01:59 | 显示全部楼层
'newline'     => "n"

'newline'     => "\n"  ?
 楼主| 发表于 2010-8-13 09:32:00 | 显示全部楼层
回复 2# snllll

\n哈,这个编辑器自动给去掉了
发表于 2010-8-13 17:37:15 | 显示全部楼层
关注.是
发表于 2010-8-22 12:01:24 | 显示全部楼层
围观学习中
发表于 2010-8-22 20:31:48 | 显示全部楼层
:)  
发表于 2010-8-26 09:04:35 | 显示全部楼层
这样做好还是让服务器管理员写定时备份命令好?
发表于 2010-9-10 15:00:24 | 显示全部楼层
占个位置,收藏了。
发表于 2011-6-18 10:22:33 | 显示全部楼层
执行mysql_query("source '".$file."';"); 时候,报
I nvalid query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'source 'D:/www/local/didi/system/database.sql'' at line 1
错误 ,是什么原因呢
发表于 2011-6-18 15:03:30 | 显示全部楼层
我用自带的数据库工具备份不成功,纠结。

本版积分规则