Skip to main content

Command Palette

Search for a command to run...

知識閱讀 - 如何沒有 Downtime 的更新資料庫樣式

Published

在更新資料庫樣式的時候,會不會影響系統造成 Downtime,最重要的就是你的操作是否可以向下相容。 所以區分成兩個:向下相容、不向下相容

Backward-Compatible Operations

  • Add a table or a view:新加上 Table 和 View 對於舊的系統並不會有影響,所以不需要做額外的操作。但是要注意,不要在操作還沒完成就部署上新系統,那就會造成問題了。
  • Add a column:添加欄位,也沒有舊系統沒有影響。但是要注意是否有 NOT NULL constraint,因為 NOT NULL constraint,因為過去的資料就都會是空值,如果有預設值的話就還好處理。如果沒有預設值的話,就建議用以下三種方式來添加 constraint
    1. 新增沒有 constraint 的欄位
    2. 執行 database script 將其初始值填入欄位
    3. 加上 NOT NULL constraint
  • Remove a column that’s not used by the old and the new version of your application:此操作因為系統都不在使用該欄位,所以也是可以直接處理(當然前提是確定真的不需要了)
  • Remove constraints:不影響系統服務的操作

Backward-Incompatible Operations

針對這些操作,通常就是造成無法順利無 Downtime 的更新。會建議使用一些熱門的工具:Flyway 和 Liquibase。

  • Rename a column, a table or a view:今天欄位、資料表和視圖的改名,看起來很簡單。但是卻是最常見造成無法向下相容的問題,主要發生在 Rolling update 的時候。因為同時舊系統還在使用舊的地方,新系統又上線,怎麼在更新過程中兩邊的資料可以是同步的。
    • Option 1: Sync with database triggers:如果你的資料庫支援 trigger 的話,那這個操作就比較好處理了。
      1. 新增新欄位並且將舊資料複製過去,新增 Trigger 將新進入的資料同步到新欄位
      2. 執行 Rolling update
      3. 刪除舊資料(Column、Table、View)和 Trigger
    • Option 2: Sync programmatically:如果你的資料庫不支援 Trigger 的話,那就會建議將系統進入 Read-only 模式,不然可能會在更新過程丟失一些資料。
      1. 新增新欄位並且將舊資料複製過去
      2. 確定新系統會從舊欄位讀取和同時寫入到舊欄位和新欄位 - 先稱其為 new1。因為此時舊系統依舊可以寫入新資料或更新舊資料,所以要確定 new1 要可以處理新舊欄位之後就執行 Rolling update
      3. 確保 new1 都更新後,就可以在更新一版只有處理新欄位的系統 new2
      4. 刪除舊資料欄位
  • Change the data type of a column:基本上的操作跟 Rename 一樣,唯一的差別是需要更改資料型態
  • Remove a column or table or view that’s still used by the old version of your application:需要更新系統才有辦法操作刪除

Reference

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.