本文目录导读:

针对PHP项目的数据库定时备份,有几种成熟且可靠的方案,可以根据你的服务器环境(Linux/Windows)和权限来选择。
核心思路:
利用操作系统的定时任务(Cron / 任务计划程序)来调用一个PHP脚本或Shell脚本,脚本内部执行数据库导出命令(如 mysqldump)。
Linux 服务器(最推荐,最稳定)
利用 Crontab 定时执行 Shell 脚本或 PHP 脚本。
方法A:纯 Shell 脚本(最高效,推荐)
-
创建备份脚本
/home/backup/backup.sh#!/bin/bash # --- 配置参数 --- DB_USER="your_db_user" DB_PASS="your_db_password" DB_NAME="your_database_name" BACKUP_DIR="/var/backups/mysql" # 备份文件名格式:数据库名_年-月-日_时-分-秒.sql DATE=$(date +%Y-%m-%d_%H-%M-%S) FILENAME="${DB_NAME}_${DATE}.sql" FULL_PATH="${BACKUP_DIR}/${FILENAME}" # --- 开始备份 --- # 创建备份目录(如果不存在) mkdir -p ${BACKUP_DIR} # 执行 mysqldump 命令 mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${FULL_PATH} # --- 可选:压缩备份文件(节省空间)--- gzip ${FULL_PATH} # 压缩后的文件名为:xxx.sql.gz # --- 可选:清理7天前的旧备份 --- find ${BACKUP_DIR} -type f -mtime +7 -name "*.sql*" -exec rm {} \; # --- 输出日志(可选)--- echo "Backup completed: ${FULL_PATH}.gz" -
赋予脚本执行权限
chmod +x /home/backup/backup.sh
-
设置Crontab定时任务
crontab -e
在打开的编辑器里添加一行(下面例子是每天凌晨3点执行):
0 3 * * * /bin/bash /home/backup/backup.sh >> /var/log/db_backup.log 2>&1
语法:
分钟 小时 日 月 周 命令(0 3 * * *= 每天3:00 AM)
方法B:PHP 脚本(如果不想碰Shell,但效率稍低)
-
创建PHP脚本
/home/backup/backup.php<?php $db_user = 'your_db_user'; $db_pass = 'your_db_password'; $db_name = 'your_database_name'; $backup_dir = '/var/backups/mysql'; $filename = $db_name . '_' . date('Y-m-d_H-i-s') . '.sql'; $full_path = $backup_dir . '/' . $filename; // 创建目录 if (!is_dir($backup_dir)) { mkdir($backup_dir, 0755, true); } // 执行 mysqldump 命令 $command = "mysqldump -u{$db_user} -p{$db_pass} {$db_name} > {$full_path} 2>&1"; exec($command, $output, $return_var); if ($return_var === 0) { // 压缩 exec("gzip {$full_path}"); echo "Backup successful: {$full_path}.gz"; } else { echo "Backup failed: " . implode("\n", $output); } -
设置Crontab
crontab -e
添加:
0 3 * * * /usr/bin/php /home/backup/backup.php >> /var/log/db_backup.log 2>&1
Windows 服务器
利用 任务计划程序 调用PHP或批处理.
方法A:批处理 (.bat) 文件(简单)
-
创建文件
C:\backups\backup.bat@echo off set DB_USER=your_db_user set DB_PASS=your_db_password set DB_NAME=your_database_name set BACKUP_DIR=C:\backups\mysql set DATE=%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2% set FILENAME=%DB_NAME%_%DATE%.sql set FULL_PATH=%BACKUP_DIR%\%FILENAME% if not exist %BACKUP_DIR% mkdir %BACKUP_DIR% "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" -u%DB_USER% -p%DB_PASS% %DB_NAME% > %FULL_PATH%
-
设置任务计划程序
- 打开
任务计划程序 - 创建任务 -> 触发器(每天3点) -> 操作(启动程序 ->
C:\backups\backup.bat)
- 打开
方法B:PHP 脚本(同上Linux,只是路径不同)
在任务计划程序中执行:C:\php\php.exe C:\backups\backup.php
使用现成工具(纯PHP项目,无需系统权限)
如果你没有服务器(如SSH)的root权限,或者使用的是虚拟主机(无crontab权限),可以在PHP项目内实现。
原理: 利用用户访问网站来触发备份。
-
创建一个受保护的PHP文件
admin/backup_db.php基本同上方PHP脚本(方案一方法B),但需要添加登录验证和IP限制。 -
设置一个外部定时任务(如cron-job.org)
- 在 cron-job.org 或类似网站注册。
- 创建一个定时任务,设置URL为
http://yourdomain.com/admin/backup_db.php?key=your_secret_key。 - 频率设置为每天一次。
缺点: 备份文件会直接生成在网站目录下,容易被下载。务必将备份目录设为禁止Web访问(添加 .htaccess 或 nginx deny)。
关键保护措施(非常重要!)
无论哪种方案,都必须做好以下事情,否则备份就是“裸奔”:
-
密码硬编码问题: 不要直接在脚本里明文写数据库密码。
- 推荐: 使用MySQL的
~/.my.cnf文件(Linux)。- 创建
/root/.my.cnf[mysqldump] host=localhost user=your_db_user password=your_db_password
chmod 600 /root/.my.cnf(只允许root读取)。- 脚本中的命令简化为:
mysqldump your_db_name > backup.sql
- 创建
- 次选: 从环境变量读取(
$_ENV['DB_PASS'])。
- 推荐: 使用MySQL的
-
备份文件存储位置:
- 绝对不要放在Web根目录(如
public_html、www)下。 - 应放在
/var/backups/或/home/backups/等Web无法直接访问的路径。
- 绝对不要放在Web根目录(如
-
数据安全性(云端备份):
- 备份完成后,建议自动上传到异地(如阿里云OSS、AWS S3、腾讯COS),以防服务器硬盘故障。
- 典型流程(Linux):
mysqldump ... | gzip | aws s3 cp - s3://my-bucket/backup.sql.gz
总结推荐配置(Linux生产环境)
- 在服务器创建
/root/.my.cnf配置数据库连接。 - 写一个Shell脚本,执行
mysqldump、gzip、aws s3 cp到云端。 - 使用
crontab -e设置每天凌晨3点执行:0 3 * * * /root/scripts/backup.sh - 定期(如每周)手动检查备份文件是否完整(很重要!备份可能失败)。
这样配置后,你的PHP项目数据库备份就能稳定、安全地自动运行了。