加油
努力

在重装系统前,如何备份服务器上的网站文件和数据库?

在重装系统前,务必对服务器上的网站文件和数据库进行完整、可验证、离线/异地的备份。以下是专业、安全、可操作的分步指南(适用于 Linux 服务器,如 CentOS/RHEL/Ubuntu):


✅ 一、备份前准备

  1. 确认服务状态

    systemctl status nginx/apache2 mysql/mariadb  # 确保服务正常运行
  2. 停止写入(关键!避免备份期间数据不一致)

    • 临时停站(生产环境建议在低峰期或维护窗口执行):
      sudo systemctl stop nginx apache2  # 停止 Web 服务
      sudo systemctl stop mysql mariadb  # 停止数据库(或使用 `--single-transaction` 在线备份)
    • ⚠️ 若无法停库(如高可用生产环境),请跳至「数据库备份」部分使用在线安全方式。
  3. 检查磁盘空间(确保有足够空间存放备份包)

    df -h /backup  # 或 /tmp /home 等目标目录

📁 二、备份网站文件(静态 + 动态资源)

✅ 推荐方式:打包压缩 + 排除缓存/日志/临时文件

# 创建备份目录(建议用日期命名)
BACKUP_DIR="/backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"

# 假设网站根目录为 /var/www/html,含多个站点(如 /var/www/site1, /var/www/site2)
# 同时备份配置文件(Nginx/Apache)、SSL证书、自定义脚本等
tar -czf "$BACKUP_DIR/www-backup.tar.gz" 
  --exclude='/var/www/*/cache' 
  --exclude='/var/www/*/logs' 
  --exclude='/var/www/*/tmp' 
  --exclude='/var/www/*/node_modules' 
  /var/www 
  /etc/nginx/sites-enabled/ 
  /etc/nginx/conf.d/ 
  /etc/apache2/sites-enabled/ 
  /etc/letsencrypt/live/ 
  /etc/letsencrypt/archive/

说明:

  • 使用 -c(创建)、-z(gzip 压缩)、-f(指定文件名)
  • --exclude 避免备份无意义的大文件(日志、缓存、临时文件)
  • SSL 证书路径 /etc/letsencrypt/ 必须备份(含私钥!)

🔐 提示:若使用 Certbot 自动续期,备份 /etc/letsencrypt/ 即可复原证书;无需重新申请。


💾 三、备份数据库(MySQL/MariaDB)

✅ 方案 A:停库后全量备份(最简单可靠,适合可停机场景)

# 停止数据库(确保无写入)
sudo systemctl stop mariadb

# 备份整个数据目录(含系统库、权限表等,恢复最完整)
sudo tar -czf "$BACKUP_DIR/mysql-data-backup.tar.gz" /var/lib/mysql/

# 启动数据库(备份完成后立即恢复服务)
sudo systemctl start mariadb

✅ 方案 B:在线热备份(推荐!生产环境首选)

# 使用 mysqldump(需确保用户有 LOCK TABLES + SELECT 权限)
mysqldump --all-databases 
  --single-transaction           # InnoDB 一致性快照(不锁表)
  --routines --triggers --events   # 导出存储过程、触发器、事件
  --hex-blob                       # 安全导出二进制数据
  -u root -p > "$BACKUP_DIR/all-databases.sql"

# 或按库备份(更灵活,便于恢复单个库)
for db in $(mysql -u root -p -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|sys)"); do
  mysqldump -u root -p --single-transaction "$db" > "$BACKUP_DIR/${db}_$(date +%Y%m%d).sql"
done

⚠️ 注意:

  • --single-transaction 仅对 InnoDB 有效;MyISAM 表仍需加锁(建议升级或迁移)。
  • 若数据库较大(>1GB),添加 --compress--quick 减少内存占用。
  • 密码不要直接写在命令行(存在历史记录泄露风险)→ 使用配置文件:
    echo "[client]nuser=rootnpassword=your_secure_password" > ~/.my.cnf
    chmod 600 ~/.my.cnf
    mysqldump --all-databases > backup.sql  # 自动读取认证

✅ 方案 C:物理备份(Percona XtraBackup —— 企业级首选)

适用于超大数据库(TB级)、零停机、增量备份:

# 安装(Ubuntu)
sudo apt install percona-xtrabackup-80

# 全量备份(自动处理事务日志,支持流式压缩)
xtrabackup --backup --target-dir="/backup/xtrabackup/full_$(date +%Y%m%d)" 
  --compress --parallel=4

# 后续可做增量备份(节省空间与时间)

✅ 优势:速度快、不锁表、支持压缩/加密/流式传输到远程。
📘 学习成本略高,但值得为关键业务部署。


🌐 四、备份到异地/离线(防服务器故障)

# 1. 本地校验完整性
md5sum "$BACKUP_DIR"/*.tar.gz "$BACKUP_DIR"/*.sql > "$BACKUP_DIR/backup-checksums.md5"

# 2. 上传到远程服务器(推荐)
rsync -avz --progress "$BACKUP_DIR/" user@backup-server:/backup/your-server/

# 3. 或上传到云存储(示例:AWS S3)
aws s3 cp "$BACKUP_DIR/" s3://your-backup-bucket/your-server/ --recursive

# 4. 或挂载 NAS / 外接硬盘(物理隔离更安全)
mount /dev/sdb1 /mnt/external
cp -r "$BACKUP_DIR" /mnt/external/

✅ 五、验证备份有效性(❗极易被忽略但至关重要!)

  1. 解压检查文件结构
    tar -tzf www-backup.tar.gz | head -20  # 查看前20个文件
  2. 检查 SQL 备份是否可读
    head -n 20 all-databases.sql  # 应看到 CREATE DATABASE / USE 等语句
    grep "Dump completed" all-databases.sql  # 确认结尾成功
  3. (可选)在测试环境还原验证
    • 解压网站文件 → 启动 Nginx → 检查首页
    • mysql < all-databases.sql → 登录检查表数量、关键数据是否存在

黄金法则:未验证的备份 = 没有备份。


📋 六、备份清单(重装前最后确认)

项目 是否完成 备注
✅ 网站源码 & 配置文件(Nginx/Apache/SSL) 已打包为 www-backup.tar.gz
✅ 数据库(SQL 导出 或 MySQL 数据目录) 已生成 all-databases.sqlmysql-data-backup.tar.gz
✅ 备份文件已拷贝至异地(NAS/云/另一台机器) 非同一块硬盘!
✅ 校验码(MD5/SHA256)已生成并保存 用于恢复前验证完整性
✅ 记录关键信息(数据库密码、域名绑定、PHP 版本、扩展模块) 写入 backup-notes.txt

🚫 重装后快速恢复步骤(简要)

  1. 重装系统 + 安装相同环境(Nginx、PHP、MySQL 版本尽量一致)
  2. 恢复网站文件:tar -xzf www-backup.tar.gz -C /
  3. 恢复数据库:
    • 若为 SQL 文件:mysql -u root -p < all-databases.sql
    • 若为数据目录:停库 → 替换 /var/lib/mysql/ → 修复权限 chown -R mysql:mysql /var/lib/mysql → 启动
  4. 恢复 Nginx/Apache 配置、SSL 证书、重启服务
  5. 测试访问、登录后台、检查订单/用户数据是否完整

💡 额外建议:

  • 将上述流程写成 Shell 脚本(如 server-backup.sh),加入定时任务(cron)实现定期自动化备份;
  • 对核心业务,启用数据库主从复制 + Binlog 日志,支持秒级恢复;
  • 使用 BorgBackup 或 Restic 实现去重、加密、增量备份;
  • 文档化所有自定义配置(如 PHP 的 opcacheupload_max_filesize 等),避免重装后遗漏。

如需我帮你生成一键备份脚本恢复脚本,或针对你具体的环境(如宝塔面板、WordPress、Laravel、Docker 部署等)定制方案,请告诉我你的系统版本、Web 服务类型、数据库类型和目录结构,我可以立刻为你定制 👇

安全第一,备份无小事。祝你重装顺利,零数据丢失! 🛡️

云服务器