Postgresql
架構更改和數據遷移到實時數據庫而不停機的最佳實踐?
如何在不停機的情況下對實時數據庫進行架構更改?
例如,假設我有一個 PostgreSQL 數據庫,其中包含一個包含各種使用者數據(如電子郵件地址等)的表,所有這些數據都與特定使用者相關聯。如果我想將電子郵件地址移動到新的專用表中,我必須更改架構,然後將電子郵件數據遷移到新表中。在不停止對原始表的寫入的情況下如何做到這一點?當然,當數據從舊表寫入新表時,新數據會繼續寫入舊表並被遺漏,對吧?
我想這個問題經常出現,但我找不到任何標準的解決方案來處理它。
This article處理了這個問題,但我並沒有真正理解第3步。他說要寫入兩個表,然後將舊數據從第一個表遷移到新表。如何確保只遷移舊數據?
你幾乎已經有了答案:
- 並行創建新結構
- 開始寫入兩個結構
- 將舊數據遷移到新結構
- 只寫和讀新結構
- 刪除舊列
至於step 3,使用這樣的東西(在一個事務中):
插入尚不存在的內容:
INSERT INTO new_tbl (old_id, data) SELECT old_id, data FROM old_tbl WHERE NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);
更新同時發生的變化:
UPDATE new_tbl SET data = old.data USING old_tbl WHERE new_tbl.old_id = old_tbl.old_id AND new_tbl.data IS DISTINCT FROM old_tbl.data;
新數據不會被觸及,因為它在兩個地方都是相同的。