linux

Linux系统里ThinkPHP如何备份数据

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

Linux下ThinkPHP数据备份实操指南

一 备份方案总览

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

<?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);
        }
    }
}

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

#!/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
看了该问题的人还看了