CodeIgniter 默认不记录数据库操作,需通过关闭查询日志、采用软删除、记录审计日志及实施备份策略来保障删除操作的安全性与可追溯性。

CodeIgniter 默认的日志系统不会记录数据库操作,所谓“删除日志记录”实际是指避免敏感操作(如 DELETE、UPDATE)被意外留存或泄露。真正需要关注的是:如何安全地执行数据库删除操作,同时确保关键数据可追溯、可恢复,而非单纯“删日志”。
关闭或限制数据库调试日志输出
CodeIgniter 在开发模式下可能将 SQL 语句(含 DELETE)写入日志文件(如 application/logs/),这存在安全风险。可通过以下方式控制:
- 在 application/config/database.php 中,将
$db['default']['log_threshold'] = 0;(0 表示关闭查询日志) - 确保生产环境的 ENVIRONMENT 设为
'production',此时即使 log_threshold > 0,CI 也不会记录敏感 SQL - 若需临时排查问题,可调高阈值(如设为 2),但上线前务必还原
用软删除替代物理删除
避免真正删除数据,是保留操作痕迹最有效的方式。CodeIgniter 原生不提供软删除,但可轻松实现:
- 在数据表中添加字段,如
deleted_at DATETIME NULL或is_deleted TINYINT(1) DEFAULT 0 - 修改模型中的
delete()方法:不执行DELETE FROM,而是更新该标记字段 - 所有
get()查询默认加条件WHERE deleted_at IS NULL(可用作用域或基础模型统一处理)
手动记录关键删除操作到审计表
对必须物理删除的场景(如 GDPR 合规清理),应单独记入审计日志表(如 audit_logs):
- 建表包含字段:
id, table_name, record_id, action ('delete'), user_id, ip_address, created_at - 在执行
$this->db->delete()前,用$this->db->insert()写入审计记录 - 建议封装成一个通用方法,例如
$this->audit->log_delete('users', 123);
备份与定期归档策略
日志和数据留存不能只靠代码,还需基础设施配合:
- 数据库每日全量备份 + 每小时 binlog 增量备份,保留至少 7 天
- 对高频变更表(如订单、日志)启用按月分区或归档到历史库
- 将
application/logs/目录挂载到独立存储,并设置自动轮转(如 logrotate)

















