ESC

開始輸入,可搜尋發票、服務、域名、工單,以及 更多...

搜尋... Ctrl+K
Linux 伺服器

Linux 伺服器備份教程:rsync 異地備份、tar 定時備份、MySQL 資料庫備份與 restic 備份到 S3

5 個步驟 12 分鐘閱讀 12 次閱讀 0
本文目錄

硬碟故障、誤刪檔案、被入侵勒索都可能讓資料瞬間丟失,可靠的 Linux 伺服器備份是運維的底線。本文給出四種互相補充的方案:rsync 同步到另一台伺服器、tar + cron 定時打包、MySQL/MariaDB 資料庫自動備份與輪轉、restic 加密備份到 S3 相容物件儲存,最後演示如何驗證恢復。命令適用於 Debian/Ubuntu 與 Rocky Linux/AlmaLinux。

建議遵循 3-2-1 原則:至少 3 份資料、2 種介質、1 份在異地。只放在同一塊磁碟上的備份無法防止硬碟損壞或整機被入侵。需要第二臺伺服器或更大的資料盤存放備份,可聯絡客服確認配置。

步驟 1:用 rsync 備份到另一台伺服器

rsync 只傳輸變化的部分,適合網站目錄、配置檔案等的增量同步。先在備份機上建立普通使用者 backup 和目錄 /backup/web01,再在源伺服器上生成專用 SSH 金鑰(金鑰登入可參考“SSH 金鑰”教程)。--delete 會刪除目標端多餘的檔案,第一次務必用 -n 預演。

# Install rsync on BOTH servers
apt install -y rsync        # Debian / Ubuntu
dnf install -y rsync        # Rocky Linux / AlmaLinux

# On the source server: dedicated key for backups
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub -p 22 [email protected]

# Preview first (-n = dry run), then run for real
rsync -aHn --delete -e "ssh -i /root/.ssh/backup_key -p 22" \
  /etc /var/www [email protected]:/backup/web01/
rsync -aH --delete -e "ssh -i /root/.ssh/backup_key -p 22" \
  /etc /var/www [email protected]:/backup/web01/

步驟 2:tar + cron 定時打包備份

rsync 是“映象”,源端誤刪後同步一次備份端也會被刪除;因此再配合 tar 每天生成帶日期的壓縮包,保留最近 7 天。指令碼用 find -mtime 自動清理舊檔案,然後寫入 crontab 每天凌晨執行。

cat > /usr/local/bin/backup-files.sh <<'EOF'
#!/bin/bash
set -euo pipefail
DEST=/backup/files
KEEP_DAYS=7
mkdir -p "$DEST"
# tar exit code 1 = "file changed while reading", which is acceptable
tar -czpf "$DEST/files-$(date +%F).tar.gz" /etc /var/www /root || [ $? -eq 1 ]
find "$DEST" -name 'files-*.tar.gz' -mtime +$KEEP_DAYS -delete
EOF
chmod 700 /usr/local/bin/backup-files.sh
/usr/local/bin/backup-files.sh && ls -lh /backup/files

# Schedule: crontab -e
10 3 * * * /usr/local/bin/backup-files.sh >> /var/log/backup.log 2>&1

步驟 3:MySQL/MariaDB 資料庫自動備份與輪轉

直接複製正在執行的資料庫檔案很可能得到損壞的備份,正確做法是用 mysqldump 或 mariadb-dump 匯出。--single-transaction 對 InnoDB 表做一致性快照且不鎖表;指令碼會逐個庫匯出並 gzip 壓縮,保留 14 天。密碼寫在許可權 600 的 /root/.my.cnf 中,避免出現在命令列與程序列表裡。

# Credentials (skip if root can log in to MariaDB/MySQL via unix_socket)
cat > /root/.my.cnf <<'EOF'
[client]
user=root
password=YourDatabaseRootPassword
EOF
chmod 600 /root/.my.cnf

cat > /usr/local/bin/backup-db.sh <<'EOF'
#!/bin/bash
set -euo pipefail
DEST=/backup/mysql
KEEP_DAYS=14
mkdir -p "$DEST"
CLIENT=$(command -v mariadb || command -v mysql)
DUMP=$(command -v mariadb-dump || command -v mysqldump)
for DB in $("$CLIENT" -N -e "SHOW DATABASES" | grep -Ev '^(information_schema|performance_schema|sys)$'); do
  "$DUMP" --single-transaction --routines --triggers --events "$DB" \
    | gzip > "$DEST/$DB-$(date +%F_%H%M).sql.gz"
done
find "$DEST" -name '*.sql.gz' -mtime +$KEEP_DAYS -delete
EOF
chmod 700 /usr/local/bin/backup-db.sh

# Schedule: crontab -e
20 2 * * * /usr/local/bin/backup-db.sh >> /var/log/backup.log 2>&1

步驟 4:用 restic 加密備份到 S3 相容儲存

restic 支援去重、加密和快照,可備份到 AWS S3、Cloudflare R2、MinIO 等任意 S3 相容儲存。上一步生成的資料庫備份目錄也一併上傳,即可實現異地儲存。forget --prune 按日/周/月策略保留快照並釋放空間。

# Install restic
apt install -y restic                                   # Debian / Ubuntu
dnf install -y epel-release && dnf install -y restic    # Rocky / AlmaLinux

# Repository settings for an S3-compatible bucket
cat > /root/.restic.env <<'EOF'
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
export RESTIC_REPOSITORY=s3:https://s3.example.com/my-backup-bucket/web01
export RESTIC_PASSWORD_FILE=/root/.restic.pass
EOF
openssl rand -base64 32 > /root/.restic.pass
chmod 600 /root/.restic.env /root/.restic.pass

. /root/.restic.env
restic init
restic backup /etc /var/www /backup/mysql
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic snapshots

# Schedule: crontab -e
40 3 * * * { . /root/.restic.env && restic backup -q /etc /var/www /backup/mysql && restic forget -q --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune; } >> /var/log/restic.log 2>&1
restic 倉庫密碼丟失後資料無法恢復,請把 /root/.restic.pass 和 S3 金鑰另外儲存在安全的地方(例如密碼管理器),不要只存在被備份的伺服器上。

步驟 5:定期測試備份恢復

沒有驗證過的備份不能算備份。建議每月至少做一次恢復演練:解壓檔案到臨時目錄、把資料庫匯入測試庫核對資料量、用 restic check 檢查倉庫完整性。也可以在一台新伺服器上完整恢復一次,記錄所需時間。

# Files: list an archive and extract one directory to a temp folder
tar -tzf /backup/files/files-2026-10-01.tar.gz | head
mkdir -p /tmp/restore
tar -xzf /backup/files/files-2026-10-01.tar.gz -C /tmp/restore etc/nginx

# Database: import into a throw-away database and compare
mysql -e "CREATE DATABASE restore_test"
gunzip -c /backup/mysql/shop-2026-10-01_0220.sql.gz | mysql restore_test
mysql -e "SELECT COUNT(*) FROM restore_test.orders"
mysql -e "DROP DATABASE restore_test"

# restic: verify the repository and restore the latest snapshot
. /root/.restic.env
restic check
restic restore latest --target /tmp/restic-restore --include /etc/nginx

常見問題

備份佔滿了磁碟怎麼辦?

調小 KEEP_DAYS,排除快取、日誌等無需備份的目錄(tar 用 --exclude),並儘量把備份轉移到另一台伺服器或物件儲存。磁碟清理方法見“磁碟空間不足”教程。

cron 任務沒有執行?

檢查 /var/log/backup.log 和 journalctl -u cron(Rocky 為 crond)。cron 的 PATH 很短,指令碼中請使用完整路徑,並確認指令碼有執行許可權。

資料庫很大,匯出時會影響網站嗎?

InnoDB 加 --single-transaction 不會鎖表,但會佔用磁碟 I/O,建議放在訪問低峰執行;超大庫可考慮 mariadb-backup 或 Percona XtraBackup 做物理熱備。

如果按以上步驟操作後問題仍未解決,請提交工單聯絡 IMIDC 7×24 技術支援,並附上伺服器 IP、系統版本、執行過的命令和完整報錯資訊,方便工程師快速定位。

這篇文章有幫助嗎?

相關教程