ESC

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

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

網站伺服器遷移教程:rsync與mysqldump零停機搬家

6 個步驟 8 分鐘閱讀 20 次閱讀 0
本文目錄

更換機房、升級配置或從其他服務商搬家時,最擔心的就是資料丟失和長時間停機。本文介紹一套經過大量實踐驗證的遷移流程:用 rsync 增量同步檔案、用 mysqldump 遷移資料庫、提前降低 DNS TTL 平滑切換,大部分網站可以把停機時間控制在幾分鐘以內。

要點速覽

  • 平滑的網站伺服器遷移關鍵在於提前降低 DNS TTL、先全量同步再增量同步、在新伺服器測試通過後再切換 DNS。
  • 遷移前應至少提前 24 小時把網站 A 記錄的 DNS TTL 降到 300 秒甚至 60 秒,讓各地 DNS 快取在切換前過期。
  • rsync 的首次全量同步可以在網站正常執行時進行,最終增量同步只傳輸變化的檔案,因此速度很快。
  • 對於 InnoDB 表,mysqldump 的 --single-transaction 引數可以在不鎖表的情況下匯出一致性快照。
  • IMIDC 為在香港、日本、新加坡、美國等地開通雲伺服器或獨立伺服器的客戶提供免費遷移協助服務。

適用環境 / 準備工作

  • 源伺服器與目標伺服器均為 Linux(Ubuntu、Debian、Rocky Linux、AlmaLinux 等)
  • 兩臺伺服器都能以 root 或 sudo 使用者 SSH 登入,並已安裝 rsync
  • 目標伺服器已部署與源伺服器相同或相容的執行環境(Nginx/Apache、PHP、MySQL/MariaDB)

安裝 rsync:

# Debian / Ubuntu
apt install -y rsync
# RHEL / Rocky / AlmaLinux
dnf install -y rsync

遷移前檢查清單

檢查項 說明
完整備份 遷移前對源伺服器做一次完整備份或快照
磁碟空間 用 df -h 和 du -sh 確認目標盤空間充足
軟體版本 對比 PHP、MySQL、Nginx 版本,避免高版本不相容
配置檔案 記錄虛擬主機配置、計劃任務(crontab -l)、SSL 證書位置
硬編碼 IP 檢查程式或配置中是否寫死了舊伺服器 IP
郵件與第三方 確認 MX 記錄、API 白名單、支付回撥地址等是否依賴舊 IP
DNS TTL 至少提前 24 小時降低 TTL

操作步驟

一、提前降低 DNS TTL

登入域名 DNS 管理後臺,將網站相關 A 記錄的 TTL 從預設值(常見為 3600 秒或更長)改為 300 秒甚至 60 秒。這一步要在正式切換前至少等待一個原 TTL 週期,各地遞迴 DNS 快取才會過期。可以用下面的命令檢視當前 TTL:

dig example.com A +noall +answer

輸出中域名後的數字即剩餘 TTL 秒數。

二、配置 SSH 金鑰,免密傳輸

在目標伺服器上生成金鑰並推送到源伺服器(採用"拉取"方式,便於在新機器上操作):

ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
ssh-copy-id -p 22 root@源伺服器IP

三、用 rsync 首次全量同步檔案

在目標伺服器上執行(示例同步網站目錄):

rsync -avzP -e "ssh -p 22" root@源伺服器IP:/var/www/ /var/www/

引數說明:-a 歸檔模式,保留許可權、屬主和時間戳;-v 顯示詳情;-z 傳輸壓縮;-P 顯示進度並支援斷點續傳。注意源路徑末尾的 / 表示同步目錄內容,漏寫會多巢狀一層目錄。

正式執行前,可以加 -n(--dry-run)預覽將要傳輸的檔案;需要排除快取或日誌目錄時使用 --exclude:

rsync -avzPn --exclude 'cache/' --exclude '*.log' -e "ssh -p 22" root@源伺服器IP:/var/www/ /var/www/

首次全量同步可以在網站正常執行時進行,不影響業務。

四、用 mysqldump 遷移資料庫

在源伺服器匯出資料庫。對於 InnoDB 表,--single-transaction 可以在不鎖表的情況下得到一致性快照:

mysqldump -u root -p --single-transaction --routines --triggers --events --default-character-set=utf8mb4 dbname | gzip > /root/dbname.sql.gz

傳輸到目標伺服器:

rsync -avP -e "ssh -p 22" root@源伺服器IP:/root/dbname.sql.gz /root/

在目標伺服器上建立資料庫與使用者並匯入:

mysql -u root -p -e "CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p -e "CREATE USER 'dbuser'@'localhost' IDENTIFIED BY '強密碼'; GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'localhost'; FLUSH PRIVILEGES;"
gunzip < /root/dbname.sql.gz | mysql -u root -p dbname

匯入後可以抽查表數量是否一致:

mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='dbname';"

五、在新伺服器上測試

不修改 DNS,而是在本地電腦的 hosts 檔案中把域名臨時指向新 IP(Windows 位於 C:\Windows\System32\drivers\etc\hosts,macOS/Linux 為 /etc/hosts):

203.0.113.20  example.com www.example.com

逐一檢查首頁、登入、上傳、支付回撥等關鍵功能,確認無誤後刪除這條 hosts 記錄。

六、最終增量同步並切換 DNS

  1. 在源站開啟維護模式或暫停寫入,避免切換期間產生新資料。
  2. 再次執行 rsync,此時只會傳輸變化的檔案,速度很快。如需讓目標目錄與源目錄完全一致,可加 --delete(會刪除目標端多餘檔案,請謹慎使用)。
  3. 重新匯出並匯入一次資料庫。
  4. 修改 DNS 的 A 記錄指向新伺服器 IP。由於 TTL 已降低,幾分鐘內大部分訪客即會訪問到新伺服器。
  5. 觀察新伺服器訪問日誌,確認流量已切換後,再把 TTL 調回正常值。

建議源伺服器保留至少 3–7 天再釋放,以便需要時回滾。

常見問題 FAQ

rsync 傳輸中斷了怎麼辦?

直接重新執行同一條命令即可,rsync 會跳過已傳完的檔案,-P 引數還支援大檔案斷點續傳。

資料庫很大,匯出太慢怎麼辦?

可以加 --quick 減少記憶體佔用,並通過管道壓縮邊匯出邊傳輸;數十 GB 以上的資料庫可以考慮物理備份工具(如 Percona XtraBackup 或 mariabackup)或主從複製方式遷移。

遷移後網站中文亂碼?

一般是匯出與匯入時字元集不一致。請確保匯出時指定 --default-character-set=utf8mb4,目標資料庫同樣使用 utf8mb4。

切換 DNS 後部分使用者仍訪問舊伺服器?

這是部分運營商 DNS 快取未過期所致,通常在原 TTL 時間內自然消失。這也是舊伺服器需要保留幾天的原因。

總結

一次平滑的遷移,關鍵在於"提前降 TTL、先全量後增量、測試後再切換"。如果你計劃把網站或業務搬到 IMIDC,我們提供免費遷移協助服務:在香港、日本、新加坡、美國等地開通雲伺服器或獨立伺服器後,提交工單說明源環境與遷移需求,技術人員會與你溝通具體方案和時間視窗;遷移過程中有任何疑問,也可以隨時通過 7x24 小時工單獲得支援。

相關產品

相關閱讀

這篇文章有幫助嗎?

相關教程