尹 飛,熊 政,祝永晉
(江蘇方天電力技術(shù)有限公司,江蘇 南京 211102)
江蘇電網(wǎng)電能量計量系統(tǒng)是江蘇省電力公司為加強內(nèi)部管理和輸電網(wǎng)內(nèi)部成本核算,實現(xiàn)集約化經(jīng)營的需要,并為電力市場的進一步發(fā)展提供技術(shù)與數(shù)據(jù)儲備而建。該系統(tǒng)主要用于完成下網(wǎng)側(cè)計量關(guān)口點的電能量采集、處理,系統(tǒng)的采集全部在II區(qū)調(diào)度數(shù)據(jù)網(wǎng),而在此基礎上做的應用基本都在III/IV區(qū)甚至要面向Internet,因此數(shù)據(jù)庫的同步是必須的環(huán)節(jié)。電能量采集涉及的電能表數(shù)量多、采集周期短,數(shù)據(jù)容量較大,不適宜采用全量同步的方式,因此需要研究增量式的數(shù)據(jù)抽取和數(shù)據(jù)裝載。
為了有效捕捉增量數(shù)據(jù)變化,對已有數(shù)據(jù)的掃描是必須面對的問題[1]。目前有5種技術(shù)可以達到數(shù)據(jù)增量更新的要求,如圖1所示。
方法1是掃描已經(jīng)打上時間戳的數(shù)據(jù)。當一個應用對記錄的最近一次修改打上時間戳時,同步程序掃描就能夠很有效地進行。
圖1 幾種數(shù)據(jù)增量更新方法
方法2是掃描增量文件。增量文件僅記錄應用中所發(fā)生的改變,有了增量文件,掃描的過程就會高效。增量文件的生成可以由改造應用來完成,但所帶來的問題是增加了數(shù)據(jù)庫容量,且不方便人工干預。
方法3是掃描日志文件或?qū)徲嬑募?。利用日志文件的一個問題就是它的內(nèi)部格式是針對系統(tǒng)用途構(gòu)建的,必須使用某種技術(shù)手段作為日志文件內(nèi)容輸出的接口,因而使用完全依賴于專門的數(shù)據(jù)庫廠商,依賴性太大,不靈活。
方法4就是修改所有應用程序的數(shù)據(jù)更新代碼,統(tǒng)一生成增量數(shù)據(jù)拷貝。但是,這種方法通常行不通,主要是因為基于數(shù)據(jù)的應用太多,要實現(xiàn)此方法必須修改所有程序。
方法5是將“前”,“后”兩個映像文件進行比較。使用此方法需在第1次抽取時就對數(shù)據(jù)庫進行快照(Snapshot)。進行另外一個抽取時,就進行另外一個快照。再將兩個快照逐次比較來確定數(shù)據(jù)的修改。
根據(jù)電能量計量系統(tǒng)數(shù)據(jù)庫的現(xiàn)狀,結(jié)合了第1和第2這2種方法,制定了增量數(shù)據(jù)識別方案。
在全量數(shù)據(jù)源上打時間戳,在數(shù)據(jù)插入、更新時寫入時間戳,在刪除數(shù)據(jù)時記錄下該條記錄的刪除時間戳、表名、主鍵,根據(jù)系統(tǒng)的配置定期掃描表內(nèi)時間戳和刪除記錄時間戳,判斷時間順序優(yōu)化生成增量數(shù)據(jù),生成數(shù)據(jù)包,在目標數(shù)據(jù)處匹配/裝載。由于基于結(jié)果的同步方式,數(shù)據(jù)裝載時的順序可能不滿足源數(shù)據(jù)庫數(shù)據(jù)表之間的約束條件,在目標數(shù)據(jù)庫上應當關(guān)閉數(shù)據(jù)表之間的約束[2]。程序框架如圖2所示。
圖2 程序框架
不影響源數(shù)據(jù)安全,盡可能少影響源數(shù)據(jù)庫性能;數(shù)據(jù)同步過程可以控制,同步時間粒度由用戶自行設置,同步進程可以監(jiān)控;要同步的數(shù)據(jù)表可配置,同步時間粒度可單獨設置;支持物理隔離裝置和網(wǎng)絡兩種方式同步,支持向多個目標數(shù)據(jù)庫同步;支持監(jiān)視新建的數(shù)據(jù)表,自動在目標數(shù)據(jù)庫上新建新表,默認同步新表。同步程序分為服務端程序和客戶端程序兩個部分,服務端程序負責增量數(shù)據(jù)規(guī)則設置、自動創(chuàng)建觸發(fā)器、自動添加時戳字段、定期自動抽取數(shù)據(jù)、優(yōu)化抽取的數(shù)據(jù)、生成同步數(shù)據(jù)包,客戶端程序負責定期獲取同步數(shù)據(jù)包、解析同步數(shù)據(jù)包、匹配/裝載同步數(shù)據(jù)。程序數(shù)據(jù)流程見圖3。
圖3 程序數(shù)據(jù)流程
為了能在現(xiàn)有數(shù)據(jù)庫上捕獲數(shù)據(jù)改動,知道數(shù)據(jù)更新時間,需對現(xiàn)有的數(shù)據(jù)庫進行改動,增加對應的域及觸發(fā)器。各種改動情況的說明如表1所示。
表1 數(shù)據(jù)庫改動情況
(1)更新管理表:表中記錄數(shù)據(jù)表的Schema、名稱、是否需同步、同步時間粒度、最后同步時間,配合定期掃描數(shù)據(jù)庫中的新建表,可自動同步建新表到目標數(shù)據(jù)庫。
(2)刪除記錄表:因為不是基于日志方式,所以必須記錄下被刪除的記錄,相對于日志方式的優(yōu)勢在于無需記錄下該條記錄的所有信息,只要記錄下主鍵信息。我們仔細研究了電能量計量系統(tǒng)中所有數(shù)據(jù)表的結(jié)構(gòu),只有極個別表沒有主鍵,因此只需對一兩張表進行改動。此表將根據(jù)系統(tǒng)的配置要求僅保留一段時間以免數(shù)據(jù)量大而影響性能。
(3)時間戳字段:為了能提取出增量,時間戳是必須的,配合刪除記錄表就可以抽取出完整的增量數(shù)據(jù),同時也可以實現(xiàn)人工抽取增量。
針對電能量計量系統(tǒng)的DB2數(shù)據(jù)庫的增量數(shù)據(jù)抽取可以采用2種方法:DB2提供的Export方法和語句生成法[3]。
(1)Export方法:適用于增量數(shù)據(jù)非常大,對同步速度要求非常高的情況,將增量的數(shù)據(jù)用DB2的CLI指令Export導出到文件,再將文件中的數(shù)據(jù)通過Import命令導入到目標數(shù)據(jù)庫中,從而完成數(shù)據(jù)從數(shù)據(jù)源到目標庫的同步,一旦有數(shù)據(jù)插入失敗,后面的數(shù)據(jù)將無法繼續(xù)。
(2)語句生成法:此方法是將增量數(shù)據(jù)逐條生成語句,并對其中具有相關(guān)性的進行優(yōu)化合并,生成一個Command List,在目標數(shù)據(jù)庫上,分組采用事務的方式提交,對于執(zhí)行失敗的語句將記錄在日志中,后面的語句繼續(xù)執(zhí)行。
對比2種方法,其中Export方法對數(shù)據(jù)庫的結(jié)合較緊,性能較好,但不具有通用性,同時程序可控性較差,因此采用語句生成法,便于對數(shù)據(jù)同步的全過程控制。
考慮到同步可能面對隔離裝置和網(wǎng)絡兩種情況,統(tǒng)一采用數(shù)據(jù)包文件的方式來同步數(shù)據(jù)。同步數(shù)據(jù)包中主要包括生成的Command List和大值字段(LOB)文件。CommandList包括2種格式,一種是標準的SQL語句,客戶端拿到后直接執(zhí)行即可,一種是約定格式的裝載大值字段的語句,該語句需要客戶端程序進行解析后執(zhí)行。為了提高執(zhí)行效率,建議兩種格式的語句分開以指定的文件名單獨存放。
客戶端程序拿到數(shù)據(jù)包之后,需對指定文件名的Command List進行解析,順序是先執(zhí)行純SQL的List,再執(zhí)行加載大值字段的List。在執(zhí)行過程中出現(xiàn)錯誤的語句記錄在日志中,在整個過程結(jié)束后統(tǒng)一在監(jiān)控界面顯示,可重試裝載,并可根據(jù)用戶配置自動重試及重試失敗后發(fā)送相關(guān)反饋至服務端。
(1)基于結(jié)果的增量抽取,無需對原有的應用程序做改動,沒有基于過程同步時的順序性,減少了不同數(shù)據(jù)表之間的干擾。
(2)由于各個數(shù)據(jù)表之間同步的相對獨立性,可以對要同步表進行個性化配置,設置是否同步及同步的時間粒度。
(3)采用同步數(shù)據(jù)包來傳遞同步數(shù)據(jù),兼容了物理隔離裝置及網(wǎng)絡方式,適用范圍更廣。
(4)采用語句生成法同步數(shù)據(jù),具有較強的可控性,同時也具有較強的通用性。
基于結(jié)果的數(shù)據(jù)庫增量同步,抓住了數(shù)據(jù)變動的源頭,考慮了電能量計量系統(tǒng)應用現(xiàn)狀,提高了抽取的準確性、數(shù)據(jù)裝載的效率,同時提供了健壯的異常處理能力,并且具有很強的靈活性和適用性。當然數(shù)據(jù)裝載的效率還需要進一步提高以便滿足數(shù)據(jù)量日益增加的需要。
[1]史晶波.在DB2中提取增量數(shù)據(jù)的一種方法[J].計算機與數(shù)字工程,2004,32(6):15-16.
[2]薩師煊.數(shù)據(jù)庫系統(tǒng)概論(第3版)[M].北京:高等教育出版社,2002.
[3]李志偉.DB2基礎教程[M].北京:清華大學出版社,2003.