像創建一個新表或添加新列的操作應該只對性能產生最小的影響並且是透明的,特別是當應用程序應用推薦的處理瞬態故障的模式時(例如通過利用Enterprise Library)。
大量更新或重新索引可能會導致爭用並影響應用程序的性能甚至導致錯誤。根據情況,瞬態故障處理也可以解決這個問題。
對正在升級的數據進行並行修改可能會導致難以處理的問題。這些都是一些可能的方案:
維護窗口
最簡單,最安全的方法是將應用程序脫機,備份數據庫,升級數據庫,更新應用,測試和使應用程序重新聯機。
只讀模式
此方法可避免使應用程序完全不可用,通過網上保持,但禁止改變數據庫的任何功能。用戶仍然可以在應用程序更新時查詢和查看數據。
分階段升級
這種方法是基於更改了數據庫結構和數據,並在應用程序代碼的精心策劃序列,以便在任何給定階段的應用程序版本,在線與當前兼容數據庫結構。
例如,假設我們需要在客戶記錄中引入「上次購買日期」字段。可以使用此序列:
- 將新字段添加到數據庫中的客戶記錄(不更新應用程序)。將新的字段默認值設置爲NULL。
- 更新應用程序,以便對於每次新的銷售,上次購買日期更新。對於舊銷售,字段保持不變,此時應用程序不查詢或顯示新字段。
- 在數據庫上執行一個批處理作業,爲所有仍然爲NULL的客戶更新此字段。可以在更新之間引入延遲,以便系統不會過載。
- 更新應用程序以開始查詢並顯示新信息。
這種方法有幾種變化,例如Zero-Downtime Database Deployment中描述的「擴展腳本」和「收縮腳本」的概念。這可以與feature toggles一起使用,以隨着升級階段的執行而改變應用程序的行爲。
可以將新列添加到記錄以表明它們已被轉換。應用程序邏輯可以適用於同時處理舊版本和新版本中的記錄。
實體框架可能會在選項中施加一些額外的限制,因爲它代表應用程序生成SQL語句,因此在規劃階段時必須考慮這一點。
臨時環境
更改生產數據庫結構和執行質量數據的變化是有風險的業務,特別是當它必須在一個特定的順序進行,而正在進入並改變數據的用戶。你的選擇來回復錯誤可能受到嚴重限制。
在執行生產環境的升級過程之前,有必要在單獨的臨時環境中進行大量測試和模擬。