温馨提示×

Linux系统里ThinkPHP如何备份数据

小樊
42
2025-11-22 18:16:41
栏目: 编程语言

Linux下ThinkPHP数据备份实操指南

一 备份方案总览

  • 数据库备份优先使用mysqldump导出为**.sql**,稳定、可跨环境恢复,适合生产环境。
  • 项目文件备份使用tar.gz打包,便于迁移与版本留存(可选)。
  • 自动化通过Linux cron定时执行备份脚本,结合日志与保留策略实现无人值守。

二 方案一 使用ThinkPHP命令快速备份数据库

  • 生成命令
    • 进入项目根目录,执行:php think make:command Backup
    • 编辑文件:application/command/Backup.php
  • 示例代码(适配TP5/6)
<?php
namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Db;

class Backup extends Command
{
    protected function configure()
    {
        $this->setName('backup')
             ->setDescription('Backup the database');
    }

    protected function execute(Input $input, Output $output)
    {
        $cfg = config('database.default');
        $host = $cfg['hostname'] ?? '127.0.0.1';
        $port = $cfg['hostport'] ?? 3306;
        $user = $cfg['username'];
        $pass = $cfg['password'];
        $name = $cfg['database'];

        $dir = runtime_path() . 'backup' . DIRECTORY_SEPARATOR;
        if (!is_dir($dir)) mkdir($dir, 0755, true);

        $file = $dir . $name . '_' . date('Ymd_His') . '.sql';
        $cmd = sprintf(
            'mysqldump -h%s -P%s -u%s -p%s --single-transaction --routines --triggers --hex-blob --set-gtid-purged=OFF %s > %s',
            escapeshellarg($host),
            escapeshellarg($port),
            escapeshellarg($user),
            escapeshellarg($pass),
            escapeshellarg($name),
            escapeshellarg($file)
        );

        $output->writeln("Starting backup: {$file}");
        exec($cmd, $lines, $code);
        if ($code === 0) {
            $output->writeln("Backup success: {$file}");
        } else {
            $output->error("Backup failed with code {$code}");
            foreach ($lines as $l) $output->writeln($l);
        }
    }
}
  • 注册命令
    • TP5:在 application/command.php 的 commands 数组中添加 ‘app\command\Backup’
    • TP6:在 config/console.php 的 commands 数组中添加 ‘app\command\Backup’
  • 执行与定时
    • 立即执行:php think backup
    • 每天02:00自动备份(crontab -e)
      • 0 2 * * * /usr/bin/php /path/to/project backup >> /var/log/backup.log 2>&1
  • 说明
    • 使用 --single-transaction 可在InnoDB下不锁表;–hex-blob 处理二进制字段;–routines/–triggers 保留存储过程和触发器。
    • 出于安全,密码以参数传入,避免出现在进程列表;确保运行用户对备份目录有写权限

三 方案二 直接使用mysqldump与Shell脚本

  • 基本命令
    • mysqldump -h 主机 -u 用户 -p 数据库 > backup_2025-11-22.sql
  • 一键脚本示例 backup.sh
#!/usr/bin/env bash
set -Eeuo pipefail

DATE=$(date +%F_%H-%M-%S)
DB_HOST="127.0.0.1"
DB_PORT="3306"
DB_USER="root"
DB_PASS="YourStrongPass"
DB_NAME="tp5"
BACKUP_DIR="/opt/backups"

mkdir -p "$BACKUP_DIR"
OUT="$BACKUP_DIR/${DB_NAME}_${DATE}.sql"

mysqldump -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" \
  --single-transaction --routines --triggers --hex-blob --set-gtid-purged=OFF "$DB_NAME" > "$OUT"

# 可选:压缩
gzip "$OUT"

# 可选:保留最近7天
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql*" -mtime +7 -delete
  • 定时任务
    • 0 2 * * * /bin/bash /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
  • 说明
    • 适合无框架依赖的快速备份;同样建议将密码放入受控位置(如.my.cnf)或环境变量,避免命令行泄露。

四 备份项目文件与恢复步骤

  • 项目文件打包备份(可选)
    • tar -czvf tp5_backup_$(date +%F).tar.gz /var/www/tp5
  • 数据库恢复
    • 非压缩:mysql -h 主机 -u 用户 -p 数据库 < backup.sql
    • 压缩:gunzip < backup.sql.gz | mysql -h 主机 -u 用户 -p 数据库
  • 校验
    • 检查备份文件大小是否合理、首行是否为有效的 SQL 指令(如 CREATE TABLE/INSERT),必要时在测试库做一次恢复演练。

五 安全与运维要点

  • 权限最小化:备份目录仅对运行用户可写;数据库账号仅授予SELECT/SHOW VIEW/LOCK TABLES/TRIGGER等必要权限。
  • 凭据安全:避免在命令行或代码中硬编码密码;可使用环境变量或配置文件(权限设为600),并在脚本中引用。
  • 稳定性参数:InnoDB 建议使用 --single-transaction;如有视图/存储过程/触发器,增加 --routines/–triggers;导出大字段用 --hex-blob。
  • 日志与监控:将脚本输出重定向到日志文件,配合监控告警;定期抽样恢复验证可用性。
  • 保留策略:按日备份并保留7–30天;重要节点(发布前、迁移前)单独打标留存。

0