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
四 备份项目文件与恢复步骤
五 安全与运维要点