Codeigniter3导出数据库如何生成批量插入格式的备份文件
CodeIgniter 3 导出数据库备份生成批量INSERT语句实现
问题描述
使用CodeIgniter 3自带数据库工具类导出数据库备份时,默认生成的SQL文件为逐行单条INSERT语句,非批量插入格式,会导致后续导入速度慢、执行耗时长,甚至触发PHP最大执行时间限制导致导入失败。
当前实现代码如下:
- 加载数据库工具类
$this->load->dbutil();
- 备份配置参数
$format = array( 'ignore' => array($this->ignore_directories), 'format' => 'zip', 'filename' => 'db_backup_' . $date . '.sql', 'add_insert' => TRUE, 'newline' => "\n" );
- 执行备份生成文件
$backup = $this->dbutil->backup($format);
解决方法
CodeIgniter 3原生dbutil类未提供批量INSERT的配置开关,可通过以下两种方式实现需求:
- 扩展原生数据库工具类
在application/libraries目录下创建扩展类文件,类名前缀与配置项subclass_prefix保持一致(默认值为MY_,即文件名为MY_Dbutil.php),重写备份方法内的INSERT语句生成逻辑:遍历单表数据时,将多行记录的VALUES部分拼接到同一条INSERT语句后,最终输出INSERT INTO 表名 (字段列表) VALUES (行1值),(行2值),...(行N值);格式的批量插入语句。注意控制单条INSERT语句的总长度,不要超过MySQL服务端max_allowed_packet参数限制,建议单条语句大小控制在1MB以内,避免导入时报错。 - 备份生成后二次处理SQL内容
拿到原生备份内容后,先从zip压缩包中提取纯SQL文本,通过正则匹配连续指向同一张表的单条INSERT语句,提取每条语句的VALUES段拼接合并,重新组装为批量INSERT格式后,再重新打包为zip文件即可。处理时需要对SQL字符串内的分号、引号做边界判断,避免误截断正常字段内容。
注意:不要直接修改system目录下的框架核心文件,否则后续框架升级会覆盖自定义修改,优先使用类扩展方式实现定制逻辑。
内容的提问来源于stack exchange,提问作者Firefog
相关产品推荐
相关产品推荐

