Postgresql

架構更改和數據遷移到實時數據庫而不停機的最佳實踐?

  • January 3, 2016

如何在不停機的情況下對實時數據庫進行架構更改?

例如,假設我有一個 PostgreSQL 數據庫,其中包含一個包含各種使用者數據(如電子郵件地址等)的表,所有這些數據都與特定使用者相關聯。如果我想將電子郵件地址移動到新的專用表中,我必須更改架構,然後將電子郵件數據遷移到新表中。在不停止對原始表的寫入的情況下如何做到這一點?當然,當數據從舊表寫入新表時,新數據會繼續寫入舊表並被遺漏,對吧?

我想這個問題經常出現,但我找不到任何標準的解決方案來處理它。

This article處理了這個問題,但我並沒有真正理解第3步。他說要寫入兩個表,然後將舊數據從第一個表遷移到新表。如何確保只遷移舊數據?

(我在 Heroku 上使用 PostgreSQL。)

你幾乎已經有了答案:

  1. 並行創建新結構
  2. 開始寫入兩個結構
  3. 將舊數據遷移到新結構
  4. 只寫和讀新結構
  5. 刪除舊列

至於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;

新數據不會被觸及,因為它在兩個地方都是相同的。

引用自:https://dba.stackexchange.com/questions/10913