業務變更導致表結構調整,如何在不停機或極短停機下完成資料遷移?本文對比四大主流方案原理、實施步驟、優缺點與適用場景,助您依業務約束選擇最佳路徑。
| 方案 | 停機時間 | 實施複雜度 | 資料一致性 | 適用場景 |
|---|---|---|---|---|
| 定點停機遷移 | 長(隨資料量線性增長) | 低 | 強 | 資料量小、可接受停機窗口 |
| Binlog 解析同步 | 極短(1-2 分鐘) | 中高 | 最終一致 | 資料量大、有 Binlog、可容忍秒級延遲 |
| 觸發器雙寫 | 極短(1-2 分鐘) | 中 | 強(同步) | 表結構變更不大、寫入 QPS 可接受額外開銷 |
| UDF / 中間件攔截 | 極短 | 高 | 視實作而定 | 已有中間件層、或願意投入開發成本 |
mysqldump + 結構調整 + LOAD DATA / INSERT ... SELECT)。缺點:資料量大時停機不可控;優點:邏輯簡單、無額外組件依賴。
解析 Master Binlog(Row 格式最佳),按新表結構轉換寫入新庫。同步追上後,停應用、等延遲歸零、切換。
mysqldump --single-transaction --master-data=1 導入新庫。ROW 格式(避免非確定性函數、觸發器副作用)。在舊表建立 AFTER INSERT/UPDATE/DELETE 觸發器,同步寫入新表。全量導入後,開啟主從複寫追平,切換。
CREATE TRIGGER trg_tbl_ins AFTER INSERT ON old_tbl FOR EACH ROW
BEGIN
INSERT INTO new_db.new_tbl (col1, col2, ...) VALUES (NEW.col1, NEW.col2, ...);
END;
-- 同理 UPDATE/DELETE
REPLACE/INSERT IGNORE)。INSERT/UPDATE/DELETE 時推送資料到外部系統(如 Kafka、HTTP、另一 MySQL)。lib_mysqludf_json + memcached_functions_mysql,將變更序列化為 JSON 推送到 Memcached 協定端點,消費端寫入新庫。無縫遷移本質是成本與風險的權衡。Binlog 解析是目前生產環境最成熟、通用性最強的方案;觸發器適合中小規模、強一致需求;中間件/UDF 適合已有平台化基礎設施的團隊。無論選哪種,**充分測試、完善回滾、分批實施**是鐵律。