張西波
摘要:人工檢查AIMS數(shù)據(jù)的恢復(fù)情況費(fèi)時(shí)、費(fèi)力,還容易出錯(cuò),該文使用Python DB-API 訪問oracle和Sqlite3數(shù)據(jù)庫,實(shí)現(xiàn)AIMS數(shù)據(jù)恢復(fù)情況的檢查。AIMS的數(shù)據(jù)保存在oracle數(shù)據(jù)庫中,需要比較的表名放在SQLite3中,通過DB-API接口分別連接主用和備用Oracle數(shù)據(jù)庫,統(tǒng)計(jì)出每個(gè)表的行數(shù),統(tǒng)計(jì)結(jié)果放到文本文件中,通過比較文本文件來檢查數(shù)據(jù)的恢復(fù)情況。
關(guān)鍵詞:AIMS;Python;SQLite3
中圖分類號(hào):TP393.0 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)14-0011-02
Design and Implementation of Checking Software for AIMS Data Recovery
ZHANG Xi-bo
(Technical Support Department, Tianjin ATM Sub-bureau of North China ATMB, Tianjin 300300,China)
Abstract: It's time-consuming laborious and error prone to check recovery condition of AIMS data, I access Oracle and Sqlite3 database with Python DB-API. AIMS data was stored in oracle and the compared table name was stored in SQLite3, compare the total lines of every tables from the main and backup AIMS server to achieve checking.
Key words: AIMS; Python; SQLite3
1 引言
航班信息系統(tǒng)英文簡(jiǎn)稱AIMS,軟件版本2.5,它是天津空管業(yè)務(wù)中除thales自動(dòng)化處理系統(tǒng)以外的另一個(gè)重要生產(chǎn)系統(tǒng)。該系統(tǒng)為所有保障飛行安全運(yùn)行提供服務(wù),程序化和標(biāo)準(zhǔn)化管制員的日常操作,降低人為差錯(cuò)的可能性。在飛服、進(jìn)近、塔臺(tái)部門和外地管制部門之間傳遞信息,使管制單位的相關(guān)人員了解航空器飛行計(jì)劃、掌握飛行動(dòng)態(tài)、進(jìn)行相關(guān)業(yè)務(wù)數(shù)據(jù)處理。系統(tǒng)主要服務(wù)器由AIMS服務(wù)器和前置服務(wù)器組成,由于當(dāng)時(shí)AIMS系統(tǒng)沒有采用群集技術(shù),主備系統(tǒng)進(jìn)行切換時(shí)需要手工同步數(shù)據(jù)。保存在oracle數(shù)據(jù)庫中的數(shù)據(jù)采用手工方式備份,數(shù)據(jù)的恢復(fù)也只能使用手工方式,備份的腳本有好幾個(gè),備份的表有31個(gè),恢復(fù)后沒有程序進(jìn)行恢復(fù)效果的檢查,在工作中容易出現(xiàn)備份或恢復(fù)出現(xiàn)遺漏的情況,僅靠人工去比對(duì)話工作量很大也不現(xiàn)實(shí)。本文使用Python編寫程序,讓程序檢查,做數(shù)據(jù)恢復(fù)情況的檢查工作。
2 數(shù)據(jù)恢復(fù)情況軟件的設(shè)計(jì)
2.1 系統(tǒng)的連接和工作情況
航班信息系統(tǒng)主備用系統(tǒng)分別連在兩個(gè)不同的交換機(jī)上,由于主用服務(wù)器和備用服務(wù)器的ip地址完全一樣,平時(shí)正常工作的時(shí)候只有主用系統(tǒng)連接終端,備用系統(tǒng)沒有外接終端,系統(tǒng)的數(shù)據(jù)保存在oracle數(shù)據(jù)庫中,主備用系統(tǒng)之間數(shù)據(jù)的同步依靠exp和imp命令。系統(tǒng)的連接情況見圖1。日常需執(zhí)行腳本有導(dǎo)出今日明日計(jì)劃、 導(dǎo)入今日明日、導(dǎo)出空軍計(jì)劃、導(dǎo)入空軍計(jì)劃。主備切換需執(zhí)行腳本:導(dǎo)出資料庫、導(dǎo)入資料庫、導(dǎo)出航路、導(dǎo)入航路、導(dǎo)出用戶和設(shè)置、導(dǎo)入用戶和設(shè)置、導(dǎo)出今日明日、導(dǎo)入今日明日、導(dǎo)出空軍計(jì)劃、導(dǎo)入空軍計(jì)劃、導(dǎo)出長期非定期和導(dǎo)入長期非定期。冬春和夏秋航班換季時(shí)需要執(zhí)行腳本:導(dǎo)出長期非定期、導(dǎo)入長期非定期、導(dǎo)出今日明日計(jì)劃和導(dǎo)入今日明日計(jì)劃。
2.2 數(shù)據(jù)恢復(fù)情況檢查軟件的設(shè)計(jì)思想
為了減少差錯(cuò)和提高工作效率,編制程序作數(shù)據(jù)恢復(fù)情況的檢查,程序設(shè)計(jì)語言使用Python。Python是一種面向?qū)ο?、解釋型?jì)算機(jī)語言,它自帶一個(gè)輕量級(jí)的關(guān)系型數(shù)據(jù)庫SQLite3,SQLite3遵守?cái)?shù)據(jù)庫的四個(gè)要素:原子性、一致性、隔離性和持久性,支持事物操作,所有的維護(hù)來自于程序本身,Python非常容易讀取和保存數(shù)據(jù)到SQLite3。我把所有需要保存的oracle數(shù)據(jù)庫表名保存到SQLite3中。備份時(shí),根據(jù)SQLite3中的表名,統(tǒng)計(jì)出每個(gè)備份Oracle表的記錄數(shù),表名和每個(gè)表的行數(shù)寫入plan_main.txt文件,恢復(fù)時(shí)做同樣的操作,只是表名和每個(gè)表的行數(shù)寫入plan_back.txt文件。做檢查恢復(fù)情況時(shí),比較兩個(gè)文本中每個(gè)表的記錄行數(shù)就可以知道那個(gè)表已經(jīng)恢復(fù)好了,那個(gè)表還存在問題。
3 數(shù)據(jù)恢復(fù)情況軟件的實(shí)現(xiàn)
3.1 在SQLite3中建立需要備份表名的表
CREATE TABLE table_back (id INTEGER NOT NULL PRIMARY KEY, table_name TEXT, description TEXT);
Id字段為序號(hào),table_name字段為oracle數(shù)據(jù)備份中表的名字,description字段保存腳本操作時(shí)的名稱。
[ID\&table_name\&description\&1\&ZRINFO\&航路\&2\&today\&今日明日\&3\&TOD_CONFIG\&用戶和設(shè)置\&4\&COMPANY\&TOD_CONFIG\&…\&…\&…\&]
上表是需要備份表的例子。如果需要備份的表有變化,直接修改table_back中的數(shù)據(jù)就可以了,不用修改程序。
3.2 數(shù)據(jù)庫操作
Python對(duì)于關(guān)系數(shù)據(jù)庫的訪問制定了一個(gè)標(biāo)準(zhǔn),SQLite和Oracle數(shù)據(jù)庫都遵從這一規(guī)范,高級(jí)數(shù)據(jù)庫API定義了一組用于連接數(shù)據(jù)庫服務(wù)器、執(zhí)行SQL查詢并獲得結(jié)果的函數(shù)和對(duì)象。其中主要有兩個(gè)主要對(duì)象:一個(gè)用于管理數(shù)據(jù)庫連接的Connection對(duì)象,另一個(gè)用于執(zhí)行查詢的Cursor對(duì)象,首先創(chuàng)建連接對(duì)象,然后再創(chuàng)建Cursor對(duì)象,使用Cursor對(duì)象執(zhí)行sql操作。連接SQLite3比較容易,importi sqlite3內(nèi)置模塊后就可以了。連接Oracle數(shù)據(jù)庫相對(duì)麻煩一些,需要安裝cx_Oracle擴(kuò)展包,安裝Oracle客戶端軟件(oracle Install Client),配置成功后,才能對(duì)oracle數(shù)據(jù)庫進(jìn)行操作。連接數(shù)據(jù)庫時(shí),每種數(shù)據(jù)庫模塊都提供一個(gè)模塊級(jí)函數(shù)Connect(parameters)。其中實(shí)際使用的參數(shù)因數(shù)據(jù)庫不同而不同。
3.3 程序關(guān)鍵代碼
程序由三個(gè)python文件組成:aims_main.py(在AIMS主用服務(wù)器上運(yùn)行)、aims_back.py(在AIMS備用服務(wù)器上運(yùn)行)和aims_diff.py(每個(gè)表行數(shù)比較)
import cx_Oracle
import sqlite3
class table:#連接oracle 和SQLite3的類
def __init__(self,user_name,user_pass,service_name,file_name):
connstr=self.user_name+'/'+self.user_pass+'@'+self.service_nam
self.conn=cx_Oracle.connect(connstr) #連接數(shù)據(jù)庫
self.cursor=self.conn.cursor()
self.file_name=file_name
self.fd=open(self.file_name,'wb')
def count_table(self,table_name):
self.table_name=table_name
sqlstr="select count(*) from "+self.table_name
self.cursor.execute(sqlstr) #統(tǒng)計(jì)每個(gè)表的行數(shù)
num=self.cursor.fetchone()
import filecmp
x=filecmp.cmp("plan_main.txt","plan_back.txt") #每個(gè)表記錄數(shù)比較
if x :print(" same one ")
else :
print("different one ")
備份和恢復(fù)成功顯示”same one”,備份和恢復(fù)不成功顯示 “different one”,數(shù)據(jù)的比較用程序完成。程序執(zhí)行完后,為了便于查看比較情況,把輸出的文件導(dǎo)入Excel表中,選取部分表,比較情況見圖2。
4 結(jié)論
本設(shè)計(jì)采取程序和數(shù)據(jù)分離的想法,備份的表放在SQLite3數(shù)據(jù)庫中,備份的表發(fā)生改變時(shí)只需要使用SQLite3修改table_back,程序不用修改。本方案能夠很好地完成數(shù)據(jù)恢復(fù)情況的檢查工作。Python語言簡(jiǎn)潔、面向?qū)ο?、容易讀、易于擴(kuò)展和易于維護(hù),調(diào)試和修改都很方便,擁有一個(gè)強(qiáng)大的標(biāo)準(zhǔn)庫,標(biāo)準(zhǔn)庫提供了系統(tǒng)管理、網(wǎng)絡(luò)通信、文本處理、數(shù)據(jù)庫接口等功能,非常適合擴(kuò)展程序的功能。
參考文獻(xiàn):
[1] 周偉. Python開發(fā)技術(shù)詳解[M]. 機(jī)械工業(yè)出版社,2009:174-175.