在重装系统前,务必对服务器上的网站文件和数据库进行完整、可验证、离线/异地的备份。以下是专业、安全、可操作的分步指南(适用于 Linux 服务器,如 CentOS/RHEL/Ubuntu):
✅ 一、备份前准备
-
确认服务状态
systemctl status nginx/apache2 mysql/mariadb # 确保服务正常运行 -
停止写入(关键!避免备份期间数据不一致)
- 临时停站(生产环境建议在低峰期或维护窗口执行):
sudo systemctl stop nginx apache2 # 停止 Web 服务 sudo systemctl stop mysql mariadb # 停止数据库(或使用 `--single-transaction` 在线备份) - ⚠️ 若无法停库(如高可用生产环境),请跳至「数据库备份」部分使用在线安全方式。
- 临时停站(生产环境建议在低峰期或维护窗口执行):
-
检查磁盘空间(确保有足够空间存放备份包)
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/
✅ 五、验证备份有效性(❗极易被忽略但至关重要!)
- 解压检查文件结构
tar -tzf www-backup.tar.gz | head -20 # 查看前20个文件 - 检查 SQL 备份是否可读
head -n 20 all-databases.sql # 应看到 CREATE DATABASE / USE 等语句 grep "Dump completed" all-databases.sql # 确认结尾成功 - (可选)在测试环境还原验证
- 解压网站文件 → 启动 Nginx → 检查首页
mysql < all-databases.sql→ 登录检查表数量、关键数据是否存在
✅ 黄金法则:未验证的备份 = 没有备份。
📋 六、备份清单(重装前最后确认)
| 项目 | 是否完成 | 备注 |
|---|---|---|
| ✅ 网站源码 & 配置文件(Nginx/Apache/SSL) | ☐ | 已打包为 www-backup.tar.gz |
| ✅ 数据库(SQL 导出 或 MySQL 数据目录) | ☐ | 已生成 all-databases.sql 或 mysql-data-backup.tar.gz |
| ✅ 备份文件已拷贝至异地(NAS/云/另一台机器) | ☐ | 非同一块硬盘! |
| ✅ 校验码(MD5/SHA256)已生成并保存 | ☐ | 用于恢复前验证完整性 |
| ✅ 记录关键信息(数据库密码、域名绑定、PHP 版本、扩展模块) | ☐ | 写入 backup-notes.txt |
🚫 重装后快速恢复步骤(简要)
- 重装系统 + 安装相同环境(Nginx、PHP、MySQL 版本尽量一致)
- 恢复网站文件:
tar -xzf www-backup.tar.gz -C / - 恢复数据库:
- 若为 SQL 文件:
mysql -u root -p < all-databases.sql - 若为数据目录:停库 → 替换
/var/lib/mysql/→ 修复权限chown -R mysql:mysql /var/lib/mysql→ 启动
- 若为 SQL 文件:
- 恢复 Nginx/Apache 配置、SSL 证书、重启服务
- 测试访问、登录后台、检查订单/用户数据是否完整
💡 额外建议:
- 将上述流程写成 Shell 脚本(如
server-backup.sh),加入定时任务(cron)实现定期自动化备份; - 对核心业务,启用数据库主从复制 + Binlog 日志,支持秒级恢复;
- 使用 BorgBackup 或 Restic 实现去重、加密、增量备份;
- 文档化所有自定义配置(如 PHP 的
opcache、upload_max_filesize等),避免重装后遗漏。
如需我帮你生成一键备份脚本、恢复脚本,或针对你具体的环境(如宝塔面板、WordPress、Laravel、Docker 部署等)定制方案,请告诉我你的系统版本、Web 服务类型、数据库类型和目录结构,我可以立刻为你定制 👇
安全第一,备份无小事。祝你重装顺利,零数据丢失! 🛡️
云小栈