spt119 发表于 2012-8-21 20:24:17

CI备份数据库后还原导入的方法(之一,希望有更多的办法)

项目中碰到一个备份和导入的需求,在坛子里找了一下,看到jeongee的http://codeigniter.org.cn/forums/forum.php?mod=viewthread&tid=6626。原封照抄不行,就在这个基础上改动了一下。下面是代码:

$sql = '';
$f = DBBACKUP.$file_name;
$f = read_file($f);
$f = preg_replace("/#(.*)\\s#(.*)TABLE(.*)(.*)\\s#/i","",$f);
$f = write_file(DBBACKUP.$file_name, $f);
$file = DBBACKUP.$file_name;
$f = file($file);
array_filter($f);
foreach((array)$f as $l) {
    $sql .= $l;
}
$i = 0;
$sql_arr = explode(';', $sql);
$sql_count = count($sql_arr)-1;
foreach ($sql_arr as $s){ $i ++;
    if ($i <= $sql_count){
      if (! $this->db->query($s)) show_error('导入'.$s.'表数据失败。');
    }
}
稍微解释一下:
DBBACKUP是我定义的一个常量,位置在根目录下我设定的一个文件夹中。实际项目中,index.php同级目录下,最好不要有其他的东东,否则很容易被扫描到……,当然,自己测试是另外一回事了。
1.首先用read_file把备份文件读到一个字符串中。注意,需要加载file_helper.
2.然后用jeongee提供的正则过滤备份文件中的注释.
3.再用write_file把字符串写到同名文件中.(之所以来回折腾绝不是闲的蛋疼,而是换成数组操作后会报各种错误.如果有疑问,琢磨下数组和字符串的转换就明白了。preg_replace只能针对于字符串,而不是数组。)
4.用file函数把备份文件装入一个数组中.再用array_filter()过滤。
剩下的就是数组操作了。但我仍然用两个变量($i,$sql_count)控制foreach的进度,以免array_filter()过滤不干净,造成空值执行mysql_query()报错。
jeongee用的是MYSQL命令行的source函数,这个在实际项目中可能不行吧,至少经我手配置的Linux服务器,基本上除非我用的时候,这些函数都是屏蔽掉的。
仅供参考,欢迎交流。



spt119 发表于 2012-8-21 20:29:24

占个沙发。
CI的数据库备份不只是mysqli,不知道为什么。有没有高手该下dbutil这个函数,让CI支持mysqli?毕竟,myslqi的效率要比mysql强上不少,不论是myisam还是innodb。

大道达人 发表于 2012-9-28 22:19:22

直接执行mysqldump不行嘛

大道达人 发表于 2012-10-24 18:12:07

      
//直接用mysql命令行
include APPPATH.'config/database.php';
                $file = BASEPATH.'../application/sql/cier.sql';

                $host = $db[$active_group]['hostname'];
                $user = $db[$active_group]['username'];
                $pwd= $db[$active_group]['password'];
                $db   = $db[$active_group]['database'];
                /*命令行导入*/
            exec("mysql -h{$host} -u{$user} -p{$pwd} $db < {$file} 2>&1", $output, $ret);
      if ($ret != 0)
      {
            die(implode('
', $output));
      }

julia 发表于 2013-12-26 08:23:22

大道达人 发表于 2012-10-24 18:12 static/image/common/back.gif


直接用mysql命令行 错误信息如下
'mysql' is not recognized as an internal or external command,operable program or batch file.

xiaozhuaisnow 发表于 2014-1-7 10:29:16

为什么不用工具呢?

sundyandy 发表于 2014-3-29 14:01:05

xiaozhuaisnow 发表于 2014-1-7 10:29
为什么不用工具呢?

比如呢?什么工具?第三方的?

xiaozhuaisnow 发表于 2014-4-18 16:18:07

sundyandy 发表于 2014-3-29 14:01
比如呢?什么工具?第三方的?

navicat 可以先导出为xml然后再导入的时候对应相应的字段和类型,以前我这样子倒过SqlServer往mysql迁移数据(数据包大概不到两个G)。前提是不穿插业务类型的,有业务类型的还得自己写代码。
页: [1]
查看完整版本: CI备份数据库后还原导入的方法(之一,希望有更多的办法)