1. 程式人生 > >軟件開發階段數據庫升級維護策略

軟件開發階段數據庫升級維護策略

要素 文件夾 函數名 有一種 一個表 3.2 由於 刪除 需求

軟件開發階段數據庫升級維護策略

一 為什麽要維護升級

1.1 現狀和出現的問題

如果你開發一個的項目,沒有用到數據庫,那麽你不用維護數據庫。

如果你開發一個項目,用到數據庫了,但是從不用修改,那麽數據庫的維護也相對的簡單。

當你開發一個大的項目,數據庫有很多表,視圖,存儲過程,數據庫分成了幾個,開發的團隊很大,開發的周期很長,由於業務的需求數據庫的變動相對較大(沒有好的DBA,這個已經是事實,就不要再這方面下工夫了),此時數據庫的維護應該采用什麽樣的策略?

先不說我們采用什麽樣的策略,看看我們會遇到什麽樣的問題:

a. 每次發版本的時候,數據庫的腳步或數據總是拖後腿的關鍵東西

b. 誰有改了視圖?

c. 誰又改了字段?誰刪除了表?誰添加了字段?

d. 上次發版本就修改過什麽字段?

e. 客戶正式機上跑的數據庫是V1.0 的,但是我們的新版本是V3.0的,數據庫就變了什麽?

f.現在都是V2.0的程序了,但是測試要測試V1.0的版本,那麽?

為什麽會出現這樣的問題?對於這些問題我們又該采取什麽應對措施?

出現這樣的問題原因很簡單,我們沒有做好數據庫版本的管理,沒有統一的入口對數據庫進行修改操作,每個人在需要的時候,都自己在數據庫中添加,刪除或修改某些表,試圖,存儲過程等,造成混亂的效果。

問題的根源找到了,那麽就沒有問題了,畢竟沒有解決不了的問題,關鍵是別再問題的基礎之上去處理問題,那樣問題沒有盡頭。

1.書庫庫的修改工作有統一的入口點,由一個人或幾個人來協同處理,但是要保證唯一的一份修改記錄文檔(當然可以備份,最好是一個人來處理,如果幾個人來協同處理,那麽一定要保證操作的是同一份文檔)。

2.制定數據庫的備份還原策略,沒有必要天天備份數據庫,但是每次發版本或者有重大變化的時候一定要備份數據庫,同時備份的策略中,包含數據庫備份的地址,備份的規則(如按時間或版本進行命名)。

3.從數據庫的初始原型搭建開始,建立一個跟蹤數據庫變化記錄的升級程序,該程序可以是讀取每次修改腳本(如果采用腳本的形式,腳本命名很關鍵,畢竟我們要保證每次升級都需要執行的腳本),還有一種比較笨拙但是比較有效的方式將腳本根據時間,版本,維護的人維護記錄等寫入到程序中,但是要不斷的維護數據庫的升級程序,但是小小的開銷卻能夠帶來不錯的效果。

4.制定嚴格的數據庫修改制度,如果沒有制度,所有的準備都沒有用,每個人還是我行我素,修改了也不通知那個入口,跟沒有維護一樣。

1.2 分析

首先從數據庫的結構入手,我們知道數據庫組成結構有:二維表,視圖,存儲過程,函數,索引等,他們一些相互獨立,一些相互依賴的關系化存在,共同組成了一個完整的數據庫。

1.2.1 二維表

最簡單的數據庫是由多張二維表構成,只要維護好每一張表就維護好了整個數據庫,那麽我們維護的基本單元就是二維表。一張二維表的生命周期大致分為,原型期,升級期。所謂原型期是我們在最初設計數據庫的時候所確定下來的表結構,也就是創建並初始化表。升級期則是對表的結構進行增加,刪除,修改的過程。從這兩點可以看出,我們只需要保持一份完整的表創建並初始化數據sql腳本,和記錄每一次表的修改記錄即可。對於每一次修改我們都去更新我們的創建並初始化數據sql腳本,以保持他的完整性

1.2.2 視圖

視圖依賴於一張或多張二維表,也就是說視圖維護的基礎在於二維表首先是完整的。那麽視圖在很大程度上接近二維表的維護,在他的生命周期中也就是維護完整的創建sql腳本,不需要記錄每一次修改腳本。

1.2.3 存儲過程與函數

在ddd之後這種數據庫特性的接口使用並不多,但是也是一個非常重要的組成要素。存儲過程的維護應該是比較簡單的,我們不需要記錄他的變更過程,只需要一直維護他的完整的定義sql腳本即可,函數與存儲過程也一樣,他們都是在表的基礎上相對獨立的,只需要維護他的sql完整性即可。

二 怎樣維護升級

有了前面提到的一些現狀,產生問題的原因,以及一些分析思路,那麽我們怎麽來維護數據庫的升級呢?

首先這裏解決的數據庫升級是在開發階段,因為開發階段數據庫處於極不穩定期,他的變更是時常的。我們維護數據庫的思路:

1) 數據庫變更是必須的,也就是在原型基礎上確實不能滿足需要的,進行變更升級

2) 在每一次變更過程中都需要確保整個表,視圖,存儲過程,函數是完整的,然後在確保我們的數據庫是完整的,這裏的完整性是指創建一個數據庫的初始化sql腳本,他包括了創建語句和初始化數據語句,且需要確保他們的順序關系和依賴關系。

3) 數據庫的升級分為初始化和補丁升級,所謂的初始化是執行一個數據庫初始化sql腳本,補丁升級在已經經過了初始化過程的數據庫基礎上進行的一些列變更。

4) 變更,是指對表,視圖的字段的增加,刪除,修改記錄,每一次變更應確保他的影響達到最低,因為數據庫有可能已經存在一些數據了。同時變更應盡量降低sql腳本的bug。

三 數據庫升級維護實現

3.1 sql腳本記錄

每一個表,每一個視圖,存儲過程,函數有且僅有一個sql創建和初始化腳本,以表名,視圖名,存儲過程名,函數名創建文件夾,每一次變更均放置在各自的文件夾下面以日期命名,同一天只能有且僅有一個變更文件。初始化腳本與文件夾同名。

3.2 程序化升級

開發一桌面程序,提供初始化數據庫和升級功能。其中初始化數據庫是用於創建並初始化數據庫。升級功能則會在程序每次啟動過程中檢測有無升級腳本,以提示用戶是否需要升級該提示可以通過程序掃描sql腳本文件是否與上一次已升級的腳本文件一致如果不一致則提示升級,以實現精準化變更升級補丁執行。

3.3 sql腳本源碼托管

將sql腳本以文本文件形式保存,但是托管在tfs中,每一個sql腳步內部寫明本次sql補丁的原因,時間,由誰編寫。並且該文件保存在vs的工程中以assets靜態資源形式保存,在vs中修改他的屬性為不編譯,且每次重新生成即可。

3.4 用戶使用

用戶在首次使用該程序時候,在部署的版本中找到升級程序,打開執行初始化數據庫即可。對於以後的每次部署版本時候,只需要打開升級程序查看有無升級提示即可,如果有則執行升級即可,如果升級的過程中出現bug,可到bug日誌文件中查找到sql執行異常對應的sql編寫者,然後告知他出現bug,讓他修復,重新發版。

軟件開發階段數據庫升級維護策略