恢复步骤

14. 系统管理

恢复步骤

本指南详细介绍了在出现问题或数据丢失时,如何通过备份恢复系统。

⚠️ 重要提示

在进行恢复操作之前,请确保您具备以下条件:

  • ✓ 拥有服务器的 SSH 访问权限
  • ✓ 管理员权限
  • ✓ 可用于恢复的有效备份
  • ✓ 完成操作所需的充足时间

步骤 1:确定要恢复的备份

# Elencare tutti i backup disponibili
ls -lah /home/achille616/backups/cnc-ecommerce/

# Output esempio:
# CNC-Simulator-Italia_2025-12-18-02-00-00.zip  (backup completo)
# CNC-Simulator-Italia_2025-12-18-06-00-00.zip  (backup solo DB)
# CNC-Simulator-Italia_2025-12-18-12-00-00.zip  (backup solo DB)

步骤 2:提取备份

# Creare una cartella temporanea
mkdir -p /tmp/backup-restore

# Estrarre il backup
cd /tmp/backup-restore
unzip /home/achille616/backups/cnc-ecommerce/NOME_BACKUP.zip

步骤 3A:恢复数据库

# Il database è nel file db-dumps/*.sql o *.sql.gz

# Se è compresso:
gunzip db-dumps/mysql-*.sql.gz

# Ripristinare il database con credenziali da .env:
cd /var/www/cnc-ecommerce
mysql -u $(grep DB_USERNAME .env | cut -d '=' -f2) \
      -p$(grep DB_PASSWORD .env | cut -d '=' -f2) \
      $(grep DB_DATABASE .env | cut -d '=' -f2) < /tmp/backup-restore/db-dumps/mysql-*.sql

步骤 3B:恢复文件

# Ripristinare storage (uploads, file utente)
cp -r /tmp/backup-restore/storage/app/public/* /var/www/cnc-ecommerce/storage/app/public/

# Ripristinare file .env (se necessario)
# ATTENZIONE: Verificare prima le differenze!
diff /tmp/backup-restore/.env /var/www/cnc-ecommerce/.env
# Se OK:
# cp /tmp/backup-restore/.env /var/www/cnc-ecommerce/.env

步骤 4:验证权限

cd /var/www/cnc-ecommerce

# Ripristinare proprietà
chown -R achille616:www-data storage
chown -R achille616:www-data bootstrap/cache

# Ripristinare permessi
chmod -R 775 storage
chmod -R 775 bootstrap/cache

步骤 5:清理缓存

cd /var/www/cnc-ecommerce
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear

步骤 6:清理临时文件

rm -rf /tmp/backup-restore

✅ 最终验证

恢复完成后,请确认:

  • ✓ 网站可访问且运行正常
  • ✓ 数据库中包含正确的数据
  • ✓ 上传的文件是否可见
  • ✓ 主要功能运行正常

自动恢复脚本

为了自动化恢复过程,你可以创建一个 Bash 脚本:

#!/bin/bash
# save as: /home/achille616/restore-backup.sh

if [ -z "$1" ]; then
    echo "Uso: ./restore-backup.sh NOME_FILE_BACKUP.zip"
    echo "Esempio: ./restore-backup.sh CNC-Simulator-Italia_2025-12-18-02-00-00.zip"
    exit 1
fi

BACKUP_FILE="/home/achille616/backups/cnc-ecommerce/$1"
TMP_DIR="/tmp/backup-restore-$(date +%s)"
WEB_DIR="/var/www/cnc-ecommerce"

echo "🔄 Ripristino da: $BACKUP_FILE"

# Verifica esistenza backup
if [ ! -f "$BACKUP_FILE" ]; then
    echo "❌ Backup non trovato: $BACKUP_FILE"
    exit 1
fi

# Estrazione
echo "📦 Estrazione backup..."
mkdir -p $TMP_DIR
cd $TMP_DIR
unzip -q $BACKUP_FILE

# Ripristino database
echo "💾 Ripristino database..."
cd $WEB_DIR
DB_USER=$(grep DB_USERNAME .env | cut -d '=' -f2)
DB_PASS=$(grep DB_PASSWORD .env | cut -d '=' -f2)
DB_NAME=$(grep DB_DATABASE .env | cut -d '=' -f2)

SQL_FILE=$(find $TMP_DIR/db-dumps -name "*.sql" -o -name "*.sql.gz" | head -1)

if [[ $SQL_FILE == *.gz ]]; then
    gunzip $SQL_FILE
    SQL_FILE="${SQL_FILE%.gz}"
fi

mysql -u $DB_USER -p$DB_PASS $DB_NAME < $SQL_FILE

# Ripristino file storage
if [ -d "$TMP_DIR/storage/app/public" ]; then
    echo "📁 Ripristino file storage..."
    cp -r $TMP_DIR/storage/app/public/* $WEB_DIR/storage/app/public/
fi

# Permessi
echo "🔐 Aggiornamento permessi..."
chown -R achille616:www-data $WEB_DIR/storage
chmod -R 775 $WEB_DIR/storage

# Cache
echo "🧹 Pulizia cache..."
cd $WEB_DIR
php artisan config:clear
php artisan cache:clear
php artisan view:clear

# Cleanup
echo "🗑️  Pulizia file temporanei..."
rm -rf $TMP_DIR

echo "✅ Ripristino completato!"

使用该脚本的方法:

# Rendilo eseguibile
chmod +x /home/achille616/restore-backup.sh

# Esegui il ripristino
./restore-backup.sh CNC-Simulator-Italia_2025-12-18-02-00-00.zip

部分恢复(仅恢复部分表)

若只需恢复数据库中的特定表:

# Estrarre solo alcune tabelle
mysql -u USER -p DB_NAME -e "SELECT * FROM table_name" > table_backup.sql

# Usare mysqldump per tabelle specifiche
mysqldump -u USER -p DB_NAME table1 table2 > partial_backup.sql

💡 提示

请定期在测试环境中测试恢复流程,以确保在需要时一切都能正常运行。