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