PHP项目数据库备份如何定时执行

wen PHP项目 27

本文目录导读:

PHP项目数据库备份如何定时执行

  1. 方案一:Linux 服务器(最推荐,最稳定)
  2. 方案二:Windows 服务器
  3. 方案三:使用现成工具(纯PHP项目,无需系统权限)
  4. 关键保护措施(非常重要!)
  5. 总结推荐配置(Linux生产环境)

针对PHP项目的数据库定时备份,有几种成熟且可靠的方案,可以根据你的服务器环境(Linux/Windows)和权限来选择。

核心思路: 利用操作系统的定时任务(Cron / 任务计划程序)来调用一个PHP脚本或Shell脚本,脚本内部执行数据库导出命令(如 mysqldump)。


Linux 服务器(最推荐,最稳定)

利用 Crontab 定时执行 Shell 脚本或 PHP 脚本。

方法A:纯 Shell 脚本(最高效,推荐)

  1. 创建备份脚本 /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"
  2. 赋予脚本执行权限

    chmod +x /home/backup/backup.sh
  3. 设置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,但效率稍低)

  1. 创建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);
    }
  2. 设置Crontab

    crontab -e

    添加:

    0 3 * * * /usr/bin/php /home/backup/backup.php >> /var/log/db_backup.log 2>&1

Windows 服务器

利用 任务计划程序 调用PHP或批处理.

方法A:批处理 (.bat) 文件(简单)

  1. 创建文件 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%
  2. 设置任务计划程序

    • 打开 任务计划程序
    • 创建任务 -> 触发器(每天3点) -> 操作(启动程序 -> C:\backups\backup.bat

方法B:PHP 脚本(同上Linux,只是路径不同)

在任务计划程序中执行:C:\php\php.exe C:\backups\backup.php


使用现成工具(纯PHP项目,无需系统权限)

如果你没有服务器(如SSH)的root权限,或者使用的是虚拟主机(无crontab权限),可以在PHP项目内实现。

原理: 利用用户访问网站来触发备份。

  1. 创建一个受保护的PHP文件 admin/backup_db.php基本同上方PHP脚本(方案一方法B),但需要添加登录验证和IP限制。

  2. 设置一个外部定时任务(如cron-job.org)

    • cron-job.org 或类似网站注册。
    • 创建一个定时任务,设置URL为 http://yourdomain.com/admin/backup_db.php?key=your_secret_key
    • 频率设置为每天一次。

缺点: 备份文件会直接生成在网站目录下,容易被下载。务必将备份目录设为禁止Web访问(添加 .htaccessnginx deny)。


关键保护措施(非常重要!)

无论哪种方案,都必须做好以下事情,否则备份就是“裸奔”:

  1. 密码硬编码问题: 不要直接在脚本里明文写数据库密码。

    • 推荐: 使用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'])。
  2. 备份文件存储位置:

    • 绝对不要放在Web根目录(如 public_htmlwww)下。
    • 应放在 /var/backups//home/backups/ 等Web无法直接访问的路径。
  3. 数据安全性(云端备份):

    • 备份完成后,建议自动上传到异地(如阿里云OSS、AWS S3、腾讯COS),以防服务器硬盘故障。
    • 典型流程(Linux): mysqldump ... | gzip | aws s3 cp - s3://my-bucket/backup.sql.gz

总结推荐配置(Linux生产环境)

  1. 在服务器创建 /root/.my.cnf 配置数据库连接。
  2. 写一个Shell脚本,执行 mysqldumpgzipaws s3 cp 到云端。
  3. 使用 crontab -e 设置每天凌晨3点执行:0 3 * * * /root/scripts/backup.sh
  4. 定期(如每周)手动检查备份文件是否完整(很重要!备份可能失败)。

这样配置后,你的PHP项目数据库备份就能稳定、安全地自动运行了。

抱歉,评论功能暂时关闭!