张西波
摘要:人工检查AIMS数据的恢复情况费时、费力,还容易出错,该文使用Python DB-API 访问oracle和Sqlite3数据库,实现AIMS数据恢复情况的检查。AIMS的数据保存在oracle数据库中,需要比较的表名放在SQLite3中,通过DB-API接口分别连接主用和备用Oracle数据库,统计出每个表的行数,统计结果放到文本文件中,通过比较文本文件来检查数据的恢复情况。
关键词:AIMS;Python;SQLite3
中图分类号:TP393.0 文献标识码:A 文章编号: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 引言
航班信息系统英文简称AIMS,软件版本2.5,它是天津空管业务中除thales自动化处理系统以外的另一个重要生产系统。该系统为所有保障飞行安全运行提供服务,程序化和标准化管制员的日常操作,降低人为差错的可能性。在飞服、进近、塔台部门和外地管制部门之间传递信息,使管制单位的相关人员了解航空器飞行计划、掌握飞行动态、进行相关业务数据处理。系统主要服务器由AIMS服务器和前置服务器组成,由于当时AIMS系统没有采用群集技术,主备系统进行切换时需要手工同步数据。保存在oracle数据库中的数据采用手工方式备份,数据的恢复也只能使用手工方式,备份的脚本有好几个,备份的表有31个,恢复后没有程序进行恢复效果的检查,在工作中容易出现备份或恢复出现遗漏的情况,仅靠人工去比对话工作量很大也不现实。本文使用Python编写程序,让程序检查,做数据恢复情况的检查工作。
2 数据恢复情况软件的设计
2.1 系统的连接和工作情况
航班信息系统主备用系统分别连在两个不同的交换机上,由于主用服务器和备用服务器的ip地址完全一样,平时正常工作的时候只有主用系统连接终端,备用系统没有外接终端,系统的数据保存在oracle数据库中,主备用系统之间数据的同步依靠exp和imp命令。系统的连接情况见图1。日常需执行脚本有导出今日明日计划、 导入今日明日、导出空军计划、导入空军计划。主备切换需执行脚本:导出资料库、导入资料库、导出航路、导入航路、导出用户和设置、导入用户和设置、导出今日明日、导入今日明日、导出空军计划、导入空军计划、导出长期非定期和导入长期非定期。冬春和夏秋航班换季时需要执行脚本:导出长期非定期、导入长期非定期、导出今日明日计划和导入今日明日计划。
2.2 数据恢复情况检查软件的设计思想
为了减少差错和提高工作效率,编制程序作数据恢复情况的检查,程序设计语言使用Python。Python是一种面向对象、解释型计算机语言,它自带一个轻量级的关系型数据库SQLite3,SQLite3遵守数据库的四个要素:原子性、一致性、隔离性和持久性,支持事物操作,所有的维护来自于程序本身,Python非常容易读取和保存数据到SQLite3。我把所有需要保存的oracle数据库表名保存到SQLite3中。备份时,根据SQLite3中的表名,统计出每个备份Oracle表的记录数,表名和每个表的行数写入plan_main.txt文件,恢复时做同样的操作,只是表名和每个表的行数写入plan_back.txt文件。做检查恢复情况时,比较两个文本中每个表的记录行数就可以知道那个表已经恢复好了,那个表还存在问题。
3 数据恢复情况软件的实现
3.1 在SQLite3中建立需要备份表名的表
CREATE TABLE table_back (id INTEGER NOT NULL PRIMARY KEY, table_name TEXT, description TEXT);
Id字段为序号,table_name字段为oracle数据备份中表的名字,description字段保存脚本操作时的名称。
[ID\&table_name\&description\&1\&ZRINFO\&航路\&2\&today\&今日明日\&3\&TOD_CONFIG\&用户和设置\&4\&COMPANY\&TOD_CONFIG\&…\&…\&…\&]
上表是需要备份表的例子。如果需要备份的表有变化,直接修改table_back中的数据就可以了,不用修改程序。
3.2 数据库操作
Python对于关系数据库的访问制定了一个标准,SQLite和Oracle数据库都遵从这一规范,高级数据库API定义了一组用于连接数据库服务器、执行SQL查询并获得结果的函数和对象。其中主要有两个主要对象:一个用于管理数据库连接的Connection对象,另一个用于执行查询的Cursor对象,首先创建连接对象,然后再创建Cursor对象,使用Cursor对象执行sql操作。连接SQLite3比较容易,importi sqlite3内置模块后就可以了。连接Oracle数据库相对麻烦一些,需要安装cx_Oracle扩展包,安装Oracle客户端软件(oracle Install Client),配置成功后,才能对oracle数据库进行操作。连接数据库时,每种数据库模块都提供一个模块级函数Connect(parameters)。其中实际使用的参数因数据库不同而不同。
3.3 程序关键代码
程序由三个python文件组成:aims_main.py(在AIMS主用服务器上运行)、aims_back.py(在AIMS备用服务器上运行)和aims_diff.py(每个表行数比较)
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) #连接数据库
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) #统计每个表的行数
num=self.cursor.fetchone()
import filecmp
x=filecmp.cmp("plan_main.txt","plan_back.txt") #每个表记录数比较
if x :print(" same one ")
else :
print("different one ")
备份和恢复成功显示”same one”,备份和恢复不成功显示 “different one”,数据的比较用程序完成。程序执行完后,为了便于查看比较情况,把输出的文件导入Excel表中,选取部分表,比较情况见图2。
4 结论
本设计采取程序和数据分离的想法,备份的表放在SQLite3数据库中,备份的表发生改变时只需要使用SQLite3修改table_back,程序不用修改。本方案能够很好地完成数据恢复情况的检查工作。Python语言简洁、面向对象、容易读、易于扩展和易于维护,调试和修改都很方便,拥有一个强大的标准库,标准库提供了系统管理、网络通信、文本处理、数据库接口等功能,非常适合扩展程序的功能。
参考文献:
[1] 周伟. Python开发技术详解[M]. 机械工业出版社,2009:174-175.