程世民
( 武漢大學(xué)經(jīng)濟(jì)與管理學(xué)院, 武漢430072 )
鐵路客票系統(tǒng)已經(jīng)在全國鐵路聯(lián)網(wǎng)運(yùn)行了多年,圍繞客票系統(tǒng)這根主線,客運(yùn)站有時會針對客票營銷、經(jīng)營管理等方面進(jìn)行二次開發(fā),或者需要利用客票系統(tǒng)的一些基礎(chǔ)數(shù)據(jù)。為此,不同類型的數(shù)據(jù)庫之間的數(shù)據(jù)轉(zhuǎn)換就顯得尤其重要。鐵路客票系統(tǒng)后臺均采用Sybase Sqlserver數(shù)據(jù)庫,而基層客運(yùn)站使用的最多的是Microsoft SqlServer數(shù)據(jù)庫,為了快速地進(jìn)行兩庫之間的數(shù)據(jù)遷移而又不損失數(shù)據(jù)精度,武漢鐵路局武昌車站根據(jù)實(shí)際工作需要,研究出了一種利用前端開發(fā)工具(PowerBuilder)進(jìn)行數(shù)據(jù)有效遷移的方法。
數(shù)據(jù)轉(zhuǎn)換就是從一個數(shù)據(jù)存儲體導(dǎo)入或?qū)С鰯?shù)據(jù)到另一個數(shù)據(jù)存儲體中。對于SQL Server來說,轉(zhuǎn)換數(shù)據(jù)意味著將源數(shù)據(jù)存儲體中的數(shù)據(jù)輸入到SQL Server,或是從SQL Server輸出數(shù)據(jù)到目標(biāo)數(shù)據(jù)存儲體中。在這兩個過程中,可以對數(shù)據(jù)進(jìn)行變換,使其滿足簡單或復(fù)雜的輸入數(shù)據(jù)到目標(biāo)數(shù)據(jù)存儲體中之前所必須解決的問題。
數(shù)據(jù)轉(zhuǎn)換執(zhí)行以下任務(wù):
(1)向數(shù)據(jù)庫中加入數(shù)據(jù):輸入數(shù)據(jù)到數(shù)據(jù)庫中。
(2)存檔:加載數(shù)據(jù)庫備份,一種特殊的數(shù)據(jù)輸出形式(數(shù)據(jù)庫和日志被拷貝)。
(3)遷移數(shù)據(jù):改變數(shù)據(jù)表示,重構(gòu)數(shù)據(jù)。
以下的SQL Server工具、語句和實(shí)用程序提供數(shù)據(jù)轉(zhuǎn)換功能:
(1)Transact-SQL語句INSERT和SELECT INTO。
(2)用于數(shù)據(jù)存檔的工具和語句。
(3)數(shù)據(jù)轉(zhuǎn)換服務(wù)(DTS)。
(4)成批復(fù)制程序(Bcp)和BULK INSERT語句。
INSERT語句用來向表中插入一行或多行。SELECT INTO語句用來創(chuàng)建新表并插入由查詢選定的行。以上兩個語句都有嚴(yán)格限制功能,只能用來插入(復(fù)制)少量的行。DTS的目的是在不同的數(shù)據(jù)存儲體之間進(jìn)行數(shù)據(jù)的輸出、輸入和轉(zhuǎn)換。這一工具支持同種和異種的數(shù)據(jù)存儲體,它包含數(shù)個組件,是進(jìn)行該類數(shù)據(jù)轉(zhuǎn)換的首選。Bcp(成批復(fù)制程序)是一個非常有用的實(shí)用程序,它可以從/向一個數(shù)據(jù)文件中復(fù)制SQL Server數(shù)據(jù)。因此,Bcp經(jīng)常被用來從一個關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS)向SQL Server數(shù)據(jù)庫中轉(zhuǎn)換大量的數(shù)據(jù)。
武昌車站的系統(tǒng)配置為:HP UNIX,Sybase SQL Server12.0。提供的工具有:
(1)Transact-SQL語句INSERT和SELECT INTO。
(2)Isql實(shí)用程序。
(3)Bcp實(shí)用程序。
(4)安裝復(fù)制服務(wù)器。
IsQL是Sybase SQL Server提供的一個非常實(shí)用的應(yīng)用程序,在與數(shù)據(jù)庫交互時非常方便,利用其-i和-o選項(xiàng),可以利用提前生成好的批處理.sql文件進(jìn)行批量傳輸數(shù)據(jù)。Sybase的復(fù)制服務(wù)器解決方法主要是為高速的、基于事務(wù)的復(fù)制設(shè)計(jì)的,用于監(jiān)視數(shù)據(jù)庫的事務(wù)日志,一旦一個事務(wù)日志被標(biāo)記,它就被提交給數(shù)據(jù)庫,利用該方法需要較高的專業(yè)知識,配置也較為困難。
在實(shí)際工作中,若單獨(dú)使用上述DBMS提供的數(shù)據(jù)轉(zhuǎn)換工具會有許多局限,而且要實(shí)現(xiàn)自動編程很困難,尤其是在異構(gòu)數(shù)據(jù)庫間實(shí)現(xiàn)自動復(fù)制數(shù)據(jù)很困難?,F(xiàn)以武昌車站為例介紹數(shù)據(jù)遷移的實(shí)例。武昌車站要根據(jù)客票系統(tǒng)中的售票銷售存根二次開發(fā)進(jìn)行月度售票員業(yè)績獎金掛鉤考核,根據(jù)車站制定的銷售策略(如不同季節(jié)的長短途銷售張數(shù),本局和外局銷售客票收入等)按收入萬元單價或銷售張數(shù)千張單價由系統(tǒng)自動計(jì)算完成。獎金考核系統(tǒng)需從客票系統(tǒng)Sybase SQL Server中遷移數(shù)據(jù)(基礎(chǔ)車次、??空颈砑霸露仁燮贝娓恚┑搅硪粋€Microsoft SQL Server系統(tǒng)中(車站根據(jù)售票存根進(jìn)行二次開發(fā)以便對每名售票員月度業(yè)績進(jìn)行考核和獎金掛鉤),應(yīng)用開發(fā)用到了客戶端數(shù)據(jù)庫開發(fā)工具PowerBuilder6.5,利用該工具提供的Data Pipe Object(數(shù)據(jù)管道對象)進(jìn)行編程、實(shí)現(xiàn)。
從A系統(tǒng)(基于UNIX的Sybase SQL Server客票系統(tǒng))向B系統(tǒng)(基于Windows2000的Microsoft SQL Server的武昌車站信息服務(wù)系統(tǒng))復(fù)制A系統(tǒng)的實(shí)時應(yīng)用數(shù)據(jù)庫表(共700多張)。
利用客戶端開發(fā)開具PowerBuilder提供的數(shù)據(jù)管道對象(Data PipeLine)在兩個數(shù)據(jù)源間建立連接、按規(guī)則建立管道對象和復(fù)制策略、設(shè)定相關(guān)參數(shù)屬性,形成最終應(yīng)用,進(jìn)行數(shù)據(jù)復(fù)制。經(jīng)測試,復(fù)制效率可達(dá)到:2 000行/s,比其它方法的效率高出很多。
(1)創(chuàng)建數(shù)據(jù)管道,統(tǒng)一用p_表名命名,以便以后用循環(huán)處理。創(chuàng)建時在MAX_ERROR處選擇NO_LIMIT,COMMIT ROWS選擇1000,并選中EXTEND ATTIBUTES,最重要的是若為第1次使用此應(yīng)用,可以在TABLE和Key處選用默認(rèn)值,在OPTIONS處選中Create-Add Table,這樣的話就可以在B系統(tǒng)中完全創(chuàng)建同A系統(tǒng)中的表(連帶擴(kuò)展屬性)。
(2)在PowerBuilder的數(shù)據(jù)庫畫板中創(chuàng)建兩個數(shù)據(jù)源con_sourceA和con_sourceB,用以連接A系統(tǒng)和B系統(tǒng)。
(3)創(chuàng)建DataPipe對象:p_pipe,設(shè)置3個文本屬性值:st_read,st_write,st_error,用以記載數(shù)據(jù)傳輸過程中讀、寫和出錯的行數(shù),實(shí)例化該對象:p_pipe i_p_pipe。
(4)在PB中創(chuàng)建主界面,如圖1。需循環(huán)處理的表名數(shù)據(jù)窗口、出錯顯示的數(shù)據(jù)窗口、開始按鈕、退出按鈕和提示文本框等。
圖1 PB中創(chuàng)建的主界面
現(xiàn)將開始按鈕的主要部分腳本代碼列出如下:
//實(shí)例化變量
iPipe = create pipe_obj
//初始化
……
//連接源數(shù)據(jù)庫SQLCA
//連接目的數(shù)據(jù)庫SQLCB
iPipeReturn = iPipe.Start(SQLCA,SQLCB,dw_error)
IF iPipeReturn <> 1 THEN
GOTO Label_Error
END IF
……
//正常復(fù)制完表后,進(jìn)行一些善后處理(斷開數(shù)據(jù)庫、變量復(fù)位等)
st_1.TEXT = "復(fù)制表:"+sTable-Name+"完成!"
(5)編譯形成最終應(yīng)用。
(1)可方便地在不同的DBMS之間復(fù)制數(shù)據(jù)且不改變源DBMS中的表的各項(xiàng)屬性。
(2) 可靈活地添加需復(fù)制的表,可靈活地選擇復(fù)制方式(Create<創(chuàng)建方式>或Refresh:Delete/Insert<刷新方式>)。
(3) 靈活地容錯及設(shè)置事務(wù)的功能。
在實(shí)際工作中還遇到若B系統(tǒng)與A系統(tǒng)除了DBMS不同外,且IP不在同一個網(wǎng)段該怎么樣實(shí)現(xiàn)DBMS之間的數(shù)據(jù)轉(zhuǎn)換呢?比如:
A:客票應(yīng)用主系統(tǒng)→Unix,Sybase
B:武昌車站客運(yùn)服務(wù)信息系統(tǒng)→Win2000,Sqlserver
C:武昌車站網(wǎng)站系統(tǒng)→Win2000,Sqlserver(與A、B不同網(wǎng)段)
若需從A→C遷移數(shù)據(jù),此時可以:
(1) 建立應(yīng)用,先用B做中間代理,先對B復(fù)制數(shù)據(jù)。
(2) 利用前面提到的快速復(fù)制工具Bcp,在B中將數(shù)據(jù)形成本地硬盤文件。
(3) 用ftp將B中的本地硬盤文件數(shù)據(jù)打包上傳至C系統(tǒng)。
(4) 對包展開。
(5) 再次利用Bcp將展開后的硬盤文件復(fù)制到C系統(tǒng)中的DBMS中,此時Bcp的命令行參數(shù)要用in。
客運(yùn)站還有許多方面需要用到數(shù)據(jù)遷移,隨著客票系統(tǒng)自身的發(fā)展和完善,圍繞客票系統(tǒng)的二次開發(fā)應(yīng)用也會越來越豐富。
數(shù)據(jù)遷移還涉及到數(shù)據(jù)格式、數(shù)據(jù)存儲、數(shù)據(jù)精度等多個方面,在上述方法的基礎(chǔ)上如何將本系統(tǒng)繼續(xù)擴(kuò)展至XML、WebService等還需要做進(jìn)一步地研究和細(xì)化。
[1] 中華人民共和國鐵道部.鐵路旅客運(yùn)輸規(guī)程[S] . 北京:中國鐵道出版社,2007.
[2] 孫玫肖. 售票應(yīng)用中的常見問題及解決方法[J] . 鐵路計(jì)算機(jī)應(yīng)用,2002,11(7).