唯一靠谱的自动化备份方案是绕开thinkphp的db:backup命令,改用mysqldump+cron:因前者不支持事务一致性、不导出存储过程与触发器、大表易崩且静默失败;后者通过--single-transaction、--routines、--triggers等参数保障一致性与完整性,并配合--defaults-file传参、空文件校验及7天自动清理实现安全无忧备份。

ThinkPHP插件自动备份数据库脚本【安全无忧】需要绕开框架自带的db:backup命令,因其不支持事务一致性、不导出存储过程与触发器、大表必崩且静默失败——半夜备份为空却无报警,第二天才发现三张核心表根本没备份进去。
用独立Shell脚本替代插件调用
直接在项目根目录新建backup.sh,内容如下:
#!/bin/bash
DB_NAME="your_db_name"
BACKUP_DIR="/data/backups"
CNF_FILE="/data/www/my.cnf"
mkdir -p "$BACKUP_DIR"
/usr/bin/mysqldump \
--defaults-file="$CNF_FILE" \
--default-character-set=utf8mb4 \
--single-transaction \
--routines \
--triggers \
--events \
--hex-blob \
--set-gtid-purged=OFF \
"$DB_NAME" > "$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql"
这一步必须用--defaults-file传参,明文写密码会出现在ps aux里被所有人看到。
校验是否生成有效内容:
if [ ! -s "$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql" ]; then
echo "ERROR: backup file is empty" | logger -t db-backup
exit 1
fi
保留最近7天备份:
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql" -mtime +7 -delete
配置MySQL专用认证文件
创建/data/www/my.cnf,权限设为600:
[client]
user = your_db_user
password = your_db_pass
host = localhost
port = 3306
【必须执行chmod 600 /data/www/my.cnf】否则其他用户可读取数据库密码。
测试脚本能否连通:
mysqldump --defaults-file="/data/www/my.cnf" --databases mysql -l1 >/dev/null && echo "OK"
接入系统级定时任务
第一步:确认PHP进程用户能执行mysqldump
su -c "which mysqldump" -s /bin/bash www-data
第二步:编辑www-data用户的crontab
sudo -u www-data crontab -e
第三步:添加行(每日凌晨2:15执行):
15 2 * * * cd /var/www/project && /bin/bash /var/www/project/backup.sh >> /var/log/backup.log 2>&1
第四步:手动运行一次验证日志输出
sudo -u www-data /bin/bash /var/www/project/backup.sh
第五步:检查/var/log/backup.log末尾是否有“backup file is empty”字样——有则立即排查CNF文件路径或MySQL权限。
上传至云盘(可选增强)
方法一:用rclone同步
在backup.sh末尾追加:
rclone copy "$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql" remote:thinkphp-backup/ --transfers=2 --log-file=/var/log/rclone-upload.log
方法二:用腾讯云COS CLI
coscmd upload -r "$BACKUP_DIR/" "cos-backup/" --ignore ".log$" --timeout=600
注意:rclone远程端点必须提前用rclone config交互式配置好,且remote:thinkphp-backup目录需有写权限。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











