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

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

[复制链接]
发表于 2012-8-21 20:24:17 | 显示全部楼层 |阅读模式
项目中碰到一个备份和导入的需求,在坛子里找了一下,看到jeongee的http://codeigniter.org.cn/forums ... thread&tid=6626。原封照抄不行,就在这个基础上改动了一下。下面是代码:
PHP复制代码
 
$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服务器,基本上除非我用的时候,这些函数都是屏蔽掉的。
仅供参考,欢迎交流。



 楼主| 发表于 2012-8-21 20:29:24 | 显示全部楼层
占个沙发。
CI的数据库备份不只是mysqli,不知道为什么。有没有高手该下dbutil这个函数,让CI支持mysqli?毕竟,myslqi的效率要比mysql强上不少,不论是myisam还是innodb。
发表于 2012-9-28 22:19:22 CI中国手机版 | 显示全部楼层
直接执行mysqldump不行嘛
发表于 2012-10-24 18:12:07 | 显示全部楼层
  1.         
  2. //直接用mysql命令行
  3. include APPPATH.'config/database.php';
  4.                 $file = BASEPATH.'../application/sql/cier.sql';

  5.                 $host = $db[$active_group]['hostname'];
  6.                 $user = $db[$active_group]['username'];
  7.                 $pwd  = $db[$active_group]['password'];
  8.                 $db   = $db[$active_group]['database'];
  9.                 /*命令行导入*/
  10.             exec("mysql -h{$host} -u{$user} -p{$pwd} $db < {$file} 2>&1", $output, $ret);
  11.         if ($ret != 0)
  12.         {
  13.             die(implode('
  14. ', $output));
  15.         }
复制代码
发表于 2013-12-26 08:23:22 | 显示全部楼层
大道达人 发表于 2012-10-24 18:12

直接用mysql命令行 错误信息如下
'mysql' is not recognized as an internal or external command,operable program or batch file.
发表于 2014-1-7 10:29:16 | 显示全部楼层
为什么不用工具呢?
发表于 2014-3-29 14:01:05 | 显示全部楼层
xiaozhuaisnow 发表于 2014-1-7 10:29
为什么不用工具呢?

比如呢?什么工具?第三方的?
发表于 2014-4-18 16:18:07 | 显示全部楼层
sundyandy 发表于 2014-3-29 14:01
比如呢?什么工具?第三方的?

navicat 可以先导出为xml然后再导入的时候对应相应的字段和类型,以前我这样子倒过SqlServer往mysql迁移数据(数据包大概不到两个G)。前提是不穿插业务类型的,有业务类型的还得自己写代码。

本版积分规则