文章主要向大家講述的是專家答疑之DB2 Capture程序的正確解析,我們大家都知道DB2 Capture程序是一個非常關鍵的應用程序,在數據庫復制的實際解決方案中表現尤為突出。這個程序的主要的作用就是追蹤在DB2服務器上對復制源所做的更改。
如果有更改的話,會將這些更改的記錄保存在一張特殊的表中(CD表)。
通常情況下,這個應用程序時運行在控制服務器上。不過具體運行在哪個位置,根據操作系統的不同可以有不同的選擇。作為數據庫管理員,必須要將Capture程序牢牢的掌握在手中。讓其在關鍵的時候發揮關鍵的作用。具體的來說,需要在必要的時候,啟動如下幾個DB2 Capture程序相關的進程。
一、工程程序進程
如上圖所示,既然Capture程序主要用來監測數據源表的變動並將相關的記錄保存到CD表中,那麼必然要有一個進程,好像一只眼睛一樣,時刻盯著數據源表數據的的變化情況。如果有變化的話,即使告知其他進程。這個進程就叫做工作程序進程。通常情況下,當啟動Capture進程的時候,這個工作程序進程就會啟動。
工作程序進程與復制源所駐留的DB2數據庫相連,監視復制源的更改情況。同時,其也決定了Capture程序的啟動方式(即根據相關的參數來決定是以熱啟動方式或者以冷啟動方式來啟動Capture程序)。當這個工作程序進程啟動的時候,它就會讀取活動的數據庫日志,以判斷相關的復制源(如基礎表、視圖)等等是否進行了更改。
只要啟動了這個進程,那麼這個監測會一直持續下去。也就是說,並不是用戶對復制源作了更改,才觸發這個進程。而是無論復制源是否有更改,這個進程一直都存在(只要啟動了DB2 Capture程序)。對於這個進程,筆者認為數據庫管理員需要從以下幾個方面去了解。
一是其監測的內容來源。工作程序進程會讀取活動的數據庫日志。不過對於DB2數據庫來說,數據庫日志包括兩部分,分別為重做日志緩存與重做日志文件。由於內存的速度要比硬盤速度快的多,所以為了提高數據庫的性能,系統往往是先將數據存儲在內存中。然後在符合一定的條件下,再將內存中的數據保存到數據文件中。
而內存中的事務日志又可以分為兩類,分別為已落實的事務記錄(即已經遞交的事務)與未落實的事務記錄(還沒有遞交的事務)。工作程序進程在工作過程中,會收集內存中屬於每個事務的所有記錄,並每個一個固定的時間將收集到的已經落實的事務寫入到對應的CD表中。故其數據源其實是內存中已經落實了的事務記錄。
二是需要注意,一個時間間隔的問題。即隔多少時間,將相關的記錄保存到CD表中。如果這個時間間隔設置的比較長,那麼數據的同步性就比較差。而如果設置的比較短的話,又會影響數據庫的性能。一般情況下,只要采取數據庫的默認設置即可。但是如果數據源表中的數據更改非常頻繁,則需要根據實際情況來合理調整這個時間參數,以提高數據庫性能。
筆者的建議是,先采用默認的值,並進行數據庫性能的監測。如果發現這個值不合適的話,則可以適當調整並繼續監測其對數據庫性能的影響。經過幾次調試之後,就可以得到一個相對合理的時間間隔值。
二、修剪進程
如上圖所示,工作DB2 Capture程序進程會將復制源表的變化都保存到CD表中。而這個CD表中的數據又會根據不同的應用最終復制到其他的目的表中。也就是說,這個CD表只是一個中間表。一般用戶不會直接從這個表中讀取數據,而是通過其他的表來訪問CD表中的相關信息。此時就會引出一個新的問題。即隨著時間的推移,這個CD表中的數據會越來越多。
這不僅會影響數據庫的性能,而且還會浪費存儲的空間。由於CD表中的數據會根據一定的規則復制到目標表中。為此就需要有一種機制,來不定時的清理CD表中的數據,將垃圾數據清除出去。此時就需要用到修剪進程。
根據實際的應用,這個CD表中的數據可以分為兩種類型。一是CD表中的數據已經被復制到其他目的表中了,此時這個CD表中的數據已經沒有任何作用了。二是CD表中的數據雖然沒有被復制到其他表中,但是已近過了有效期限。此時這個數據也已經沒有用途了,也需要清除。針對這兩種不同的情況,又可以將修剪進程分為正常修剪進程與保留限制進程。
正常修剪進程就是指,當修剪集表和修剪控制表中的值顯示已經將組成這些行的事務復制到依賴於該CD表的所有目標表時,就會將CD表中的相關行以及工作單元表中相應的行刪除。簡單的說,就是需要用到這個CD表中的目標表已經將數據復制過去了,此時這個CD表中的相關記錄就會被刪除。不過需要注意,修剪也不是時刻進行的。
也就是說,不是目的表將CD表中的數據復制過去,這個表中的數據就被刪除了。另外需要注意的是,目的表只是把CD表中的數據復制過去,而不是剪貼過去。這主要是因為可能有多張目的表需要用到這個CD表中的數據。修剪進程會沒隔一段時間來檢查一下,是否滿足這個條件。如果滿足的話,就將CD表中的記錄刪除。而這個時間間隔是由參數PRUNE_INTERVAL決定的。
很顯然這個參數的值會影響到修剪進程的效率。如何這個參數的值設置的比較大,那麼修剪進程作業的時間間隔就會比較長,這在一定程度上會提高數據庫的性能。但是如果設置的太長的話,則CD表中的記錄就會比較多,又會給數據庫的性能造成負面的影響。為此數據庫管理員必須要根據復制源數據更新的頻率,在必要的情況下要手工調整這個參數。
如果目的表永遠不從這個CD表中復制記錄,難道修剪進程永遠不刪除CD表中的記錄嗎?其實不然。在修剪進程中,除了正常修剪之外,還有一個保留限制修剪。這個這個修剪中,進程會檢查CD表中某些記錄的存在時間,是否超過了有效期。如果超過了的話,則保留限制修剪進程就會刪除CD表中的行以及工作單元表中相應的行。
這個CD表中的有效期是有參數RETENTION_LIMIT來控制的。顯然這個參數也非常的重要。如果這個參數設置的比較短,那麼可能還沒等用戶復制記錄,表中記錄就會因為過了有效期而導致數據被刪除。但是如果設置的比較長的話,那麼垃圾數據就會越來越多,浪費存儲空間,影響數據庫性能。
對此筆者的建議是,數據庫管理員需要在性能、存儲空間、RETENTION_LIMIT參數之間取得一個均衡的值。一般情況下,只要數據庫性能與存儲空間允許,則最好將這個參數的值設置的比較長一點。以免這表中的數據在目的表還沒有復制之前就被刪除。
除了以上這兩個進程外,DB2 Capture程序還有管理進程、串行化進程等等。不過這些進程要麼是數據庫自動管理的,要麼就是對於Capture程序的影響不是很大。總之,不是數據庫管理員關注的重點,為此筆者就不做過多的闡述。筆者認為,從數據庫性能的角度考慮,數據庫管理員主要是要關注這個幾個進程中涉及到的時間間隔參數。
這些參數是把雙刃劍。設置的好,可以提高數據庫性能。如設置的不好,相反會降低數據庫的效率。