軟件開發階段數據庫升級維護策略sql
一 爲何要維護升級數據庫
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,讓他修復,從新發版。