柴 新
(江蘇電力信息技術(shù)有限公司,南京 210024)
DB2數(shù)據(jù)庫是廣泛使用的大型關(guān)系型數(shù)據(jù)庫,事務日志在數(shù)據(jù)庫運行中扮演著非常重要的角色,沒有事務日志的參與,DB2數(shù)據(jù)庫就無法保證數(shù)據(jù)的一致性和可恢復性。數(shù)據(jù)庫中運行的事務會耗用日志存儲空間,如果有長久未提交事務或數(shù)據(jù)修改量巨大的大事務,容易出現(xiàn)事務日志空間被耗盡的現(xiàn)象,本文提出了針對性的防范措施。
所謂數(shù)據(jù)庫的一致性,就是當數(shù)據(jù)庫崩潰恢復或前滾到某一個時間點時,數(shù)據(jù)庫能夠保證已經(jīng)提交事務的數(shù)據(jù)都被寫入磁盤,而所有未提交和回滾事務都被撤銷。為了保障數(shù)據(jù)的一致性,數(shù)據(jù)庫需要有一種機制提供以下功能:
(1)若某事務回滾,數(shù)據(jù)庫需要知道被修改前的舊數(shù)據(jù)。
(2)數(shù)據(jù)庫發(fā)生崩潰時,保存在緩沖池中的已提交事務的數(shù)據(jù)可能還沒有寫入物理磁盤,磁盤上的數(shù)據(jù)還是舊數(shù)據(jù),如何保證已提交事務的數(shù)據(jù)不丟失?
在DB2中,正是事務日志提供了以上問題的解決方案。所謂事務日志,就是在一個事務被提交之后,保證該事務里修改后的數(shù)據(jù)能夠被寫入永久存儲介質(zhì)的一種機制,目的在于保證提交事務包含的數(shù)據(jù)不會丟失。為了提高系統(tǒng)的性能,DB2采用日志優(yōu)先算法,也就是先把記錄寫入日志文件,后將數(shù)據(jù)從緩沖池使用異步方式寫入磁盤。
DB2使用主日志和輔助日志文件來控制、分配日志存儲空間,當數(shù)據(jù)庫啟動后,就預先分配了規(guī)定數(shù)目的主日志文件,而輔助日志文件是當主日志文件的空間被耗盡后進行按需分配,當數(shù)據(jù)庫不再需要時會向操作系統(tǒng)釋放空間。
DB2有兩種方式來使用日志文件:循環(huán)日志模式、歸檔日志模式。循環(huán)日志模式就是對多個事務日志文件進行循環(huán)使用,每個事務日志文件的內(nèi)容會不斷被新日志條目數(shù)據(jù)所覆蓋,而歸檔日志模式與循環(huán)日志模式的最大區(qū)別就是事務日志文件的內(nèi)容在被新日志條目覆蓋之前首先被進行保存,這一保存的過程就被稱之為歸檔,歸檔日志模式保留了數(shù)據(jù)庫所有數(shù)據(jù)更改活動的完整軌跡,因而能夠支持時間點前滾恢復,也就是使用一個數(shù)據(jù)庫的完全備份映像加上其后的所有歸檔日志文件能將數(shù)據(jù)庫恢復到故障前時刻,并且歸檔日志模式能夠支持數(shù)據(jù)庫的在線備份。循環(huán)日志模式只能支持崩潰恢復和版本恢復,不能支持前滾恢復,并且只能支持數(shù)據(jù)庫離線備份,不能進行在線備份。所以,從以上對比可以看出,歸檔日志模式更能有效地保護數(shù)據(jù)庫安全,在生產(chǎn)環(huán)境中,基本上都是配置為歸檔日志模式,用在線備份加歸檔日志的方式來保護數(shù)據(jù)庫安全。
歸檔模式下,DB2在以下情況對事務日志文件進行歸檔:(1)事務日志文件被寫滿,即使事務日志文件仍然含有未提交事務;(2)事務日志文件未被寫滿,但發(fā)生以下任意一種情況:數(shù)據(jù)庫被取消激活、發(fā)出archive log命令、在線備份結(jié)束等。
使用DB2數(shù)據(jù)庫的信息系統(tǒng),若事務使用不當,會對數(shù)據(jù)庫運行造成嚴重影響,妨礙數(shù)據(jù)庫的并發(fā)性和可用性。包括下面兩種場景:
(1)未提交事務。一個事務中的sql語句執(zhí)行結(jié)束后,應馬上對事務進行提交或回滾,以釋放日志空間,但是如果在sql語句執(zhí)行結(jié)束后沒有提交或回滾事務,那么這種事務就可被稱為未提交事務,隨著時間推移系統(tǒng)中其他事務的進行,事務日志在不斷進行切換,其可用空閑空間會不斷減少,未提交事務持續(xù)的時間越久,其對數(shù)據(jù)庫造成的危害就可能會越高,即使該事務是一個修改數(shù)據(jù)量很小的小事務,其原因是包含著未提交事務的事務日志文件因不能被覆蓋重寫,造成數(shù)據(jù)庫無可用存儲空間記錄新的事務數(shù)據(jù)而停止數(shù)據(jù)處理,這時即使運行一個修改數(shù)據(jù)量很小的sql語句,DB2也會報出SQL0964C事務日志滿的錯誤。
(2)大事務。大事務是指修改數(shù)據(jù)量很大的事務,由于數(shù)據(jù)修改前的舊映像要保存在事務日志中,可能會因事務日志文件沒有足夠空間存儲被修改數(shù)據(jù)的舊映像而發(fā)生SQL0964C事務日志滿的錯誤。當這種情況發(fā)生時,大事務會回滾,并且新事務不能運行,直至大事務回滾完成釋放了日志空間。
以上兩種情況都會嚴重影響數(shù)據(jù)庫的可操作行或并發(fā)性,DB2的配置參數(shù)num_log_span可用來防范以上情況發(fā)生。它的作用是限制一個事務所跨越的日志文件的數(shù)量,當超過設置值時,事務被DB2系統(tǒng)自動中斷,事務回滾,日志釋放,從而保證數(shù)據(jù)庫繼續(xù)有空閑的日志空間來記錄新的事務數(shù)據(jù)。一般來說,事務設計要遵循數(shù)據(jù)修改量小、及時提交等原則,以能保證數(shù)據(jù)庫不會因為事務日志而出現(xiàn)故障。
事務日志對DB2數(shù)據(jù)庫有非常重要的作用,本文以DB2數(shù)據(jù)庫事務日志為研究對象,說明了不同場景下事務日志的不同配置模式,及應對事務日志空間耗盡的防范方法,對基于DB2開發(fā)的信息系統(tǒng)穩(wěn)定運行,希望對DBA能起到幫助作用。