Yii定时备份需封装mysqldump为控制台命令,配合系统cron调度;关键步骤包括:编写BackupController、安全传参、压缩命名、日志记录、权限配置及失败告警与自动清理。

Yii中实现定时备份的核心思路
Yii本身不提供内置的数据库定时备份功能,需结合PHP系统命令(如mysqldump)与操作系统级定时任务(Linux cron 或 Windows 任务计划程序)来完成。关键在于:把备份逻辑封装成可独立执行的Yii控制台命令,并确保其具备可重复、可记录、可恢复的特性。
编写可调度的Console Command
在commands/目录下创建一个备份命令类,例如BackupController.php:
- 继承
\yii\console\Controller,重写actionIndex()作为默认入口 - 使用
\yii\db\Connection获取当前DB配置,拼接mysqldump命令参数(注意处理密码安全,推荐用~/.my.cnf配置文件方式而非明文传参) - 用
exec()或shell_exec()调用系统命令,捕获返回值和错误输出 - 生成带时间戳的备份文件名(如
backup_20240520_143022.sql.gz),并用gzip压缩节省空间 - 写入日志(可用
Yii::info()配合FileTarget)记录成功/失败、文件路径、大小、耗时
配置系统级定时任务
以Linux为例,在终端运行crontab -e添加一行:
0 2 * * * /usr/bin/php /var/www/myapp/yii backup/index >> /var/log/backup-cron.log 2>&1
含义是每天凌晨2点执行backup/index命令。注意检查几点:
- 确保
php路径正确(用which php确认) - Web用户与cron执行用户权限一致,避免因目录写入权限导致备份失败
- 设置
PATH环境变量(可在crontab顶部加PATH=/usr/local/bin:/usr/bin:/bin) - 首次部署后手动运行一次命令验证流程是否通
增强健壮性与运维友好性
生产环境建议补充以下机制:
-
自动清理旧备份:在命令末尾加入逻辑,保留最近7天或最多20个备份文件,用
find /path/to/backups -name "*.sql.gz" -mtime +7 -delete -
失败告警:备份失败时调用邮件发送函数(如
mail()或集成SMTP扩展),或推送至企业微信/钉钉机器人 -
校验与测试还原:定期(如每周)抽取一个备份文件,用
mysql命令导入到测试库,验证SQL完整性 -
支持多库/表级备份:通过命令行参数指定
--db=my_db或--tables=user,order,提升灵活性


















