基于XML的异构数据库归档系统的设计与实现
2013-10-15李育岭万晓冬
李育岭,万晓冬
(南京航空航天大学自动化学院,江苏 南京 210016)
0 引言
随着企业信息化建设的深入,数据库平台产生海量历史数据,并且这些数据还在持续增长。很多使用频率极低的历史数据占据着数据库运行系统大量的存储空间,影响着系统的运行效率。因此必须将系统中的历史数据迁移出数据库运行系统,将有限的资源释放出来,确保系统稳定运行。
数据库归档技术能够有效解决海量历史数据影响系统运行的问题,相对于数据备份而言,数据库归档技术能够实现数据的快速归档和重构。它也能够实现数据管理功能,为以后的数据查询和分析提供便利。
目前大部分的数据库系统都有自己专用的备份和归档机制来处理历史数据,这些归档工具有各自的应用特点和局限,往往需要人为的干预,并且自动化程度不是令人满意。对于一个复杂的异构数据库平台,它们无法提供很好的解决方案。随着信息化的发展,企业的海量数据越来越多的存在于异构数据库环境中,使得某一数据库平台中的归档数据在其它平台中很难被共享和利用。企业对异构数据库环境中的数据库归档系统的需求日益迫切,研究和开发此类归档系统具有重要的现实意义。
XML在现有的数据库和编程语言中具有很强的通用性,其特有的异构性、可扩展性及灵活性,使其在数据交换和传输中成为一种标准。它提供了适合表示半结构化数据的松散树型结构,可以用来描述各种复杂数据,这些复杂数据可以被不同的程序读取。目前主流数据库系统都加强了对XML的支持,这为开发基于XML的异构数据库归档系统奠定了基础,提高了系统开发的可行性。
本文重点研究XML与关系数据库之间双向映射机制,设计归档系统的模型,屏蔽异构数据库环境中差异性,完成数据的管理、转换和共享,实现数据在异构环境中归档的功能。
1 异构数据库归档系统整体设计
本系统采用C/S架构,以实现多用户实时归档,统一管理的目标。每一个归档的发起者都是一个客户端,将数据库的结构及约束信息和记录信息按照统一的格式映射到XML文件中,归档的数据最终以XML文档的形式生成。重构时则将XML文档中含有的数据库信息映射到数据库中,实现数据库的重构。而服务器主要是管理、存储和传送XML文档,对客户端的请求命令进行解析,做出正确响应,满足客户端数据归档、重构和信息查询的要求。
系统从逻辑上自下而上可以划分为4个层次,分别是:底层异构数据库环境、异构数据库的统一访问接口、数据的转换和双向映射以及用户响应和分布式归档管理。为了便于开发实现,将系统的上述4个层次整合成几个主要模块,将紧密关系的功能集中在一起,使程序结构更加合理。
系统主要由客户端和服务器端两部分组成,系统体系结构如图1所示。
图1 数据库归档系统框架图
网络通讯与命令解析模块在服务器端和客户端都存在。客户端发向服务端的信息主要有归档请求、数据库表的查询以及其它状态检测信息。服务器端也实时地向客户端返回状态信息、XML文件以及查询结果等。这样系统就可以实现分布式远程在线归档的功能。服务器端对归档的XML文件进行统一管理和存储,建立用户查询索引,方便数据的重构。
客户端通过数据库统一访问接口连接访问异构数据库平台,用户需要提供基本信息,如数据库服务器IP、连接端口、用户名、密码、数据库名等,并选择相应的数据库类型,就可以访问异构环境。这是对多种数据库访问方法的一种集成,让归档系统能够适应异构数据库环境。
客户端包含了归档系统中的两个关键模块,数据库归档模块和数据库重构模块。归档模块中主要是从数据库中获取表的结构信息和记录信息,生成统一格式的XML文档,数据库重构模块则从XML文件中读取表的结构信息,在数据库中建立表的基本结构,再将XML中的记录值填充到数据库中,实现整个重构过程。
2 系统关键技术实现
2.1 异构数据源的统一格式表示
为了使生成的XML归档文件能够在异构数据库环境中传递数据信息,将XML文件划分为结构区和记录区,将数据库的表结构和记录值分别映射到XML文档的结构区和记录区。建立结构区的目的是为了保持关系数据库中的各表及各列的约束条件和内外关系,保证数据在结构上的完整性和一致性。任何数据库平台都能从XML归档文件中获取到数据库的原貎,这样在重构时能够最大限度地与原数据保持一致。该系统利用SQL语句,从3种数据库系统中获取数据库表名、表数量、主键、外键、列名、列数量、列类型、长度、精度、是否允许为空、默认值、外键所在的表的表名及在此表的列名等重要信息。当然,不同的数据库平台还带有各自特有的信息,如MySQL数据库中表创建时指定的引擎类型等。这些与库表信息紧密相联的信息映射到XML的结构区,作为重构库表的依据。
表结构和约束关系导出到XML结构区的格式如下:
<dbstructure>
<dbname>mydb</dbname>//表所属的数据库名
<dbtype>Oracle</dbtype>//数据库类型
<tablestructure>//表的结构信息
<tablename>stu_score</tablename>//表名
<primarykey> //主键信息
<primarykeyname>stu_id</primarykeyname>
//主键键名
<primarykeytype>number</primarykeytype>
//主键数据类型
</primarykey>
<foreignkey> //外键信息
<foreignkeyname>course_name</foreignkeyname>//外键键名
<foreignkeyftablename>course</foreignkeyftablename>//外键所在表名
<foreignkeyfcolumnname>course_name<foreignkeyfcolumnName>//外键关联表中的列名
</foreignkey>
<columnsinfo> //列信息
<columncount>5</columncount>//表中列数量
<column>//第一列的信息
<columnname>stu_id</columnname>//列名称
<columntype>number</columntype>//列的数据类型
<columnprecision>2</columnprecision>//列的数据位数
<columnscale>0</columnscale>//列的精度
<columnlength>22</columnlength>//列的长度
<columnisnullable>NO</columnisnullable>//列是否为空
<columndefault>0</dolumndefault> //列默认值
</column>
…//其它列
</tablestructure>
2.2 异构数据库环境数据类型映射关系的建立
在该归档系统中,XML归档文件中包含的数据库信息可能会在各个数据库平台中重新构建出来,而各数据库平台的数据类型各异,因此,需要建立异构环境数据库数据类型映射表,来实现库表的跨平台重构。
不同数据库系统,都有自己的一套数据类型。这些数据类型在名称、长度和精度上有很大的差异。随着数据库系统的不断发展和升级,数据类型的种类也越来越多。虽然如此,数据库在满足用户使用的基本要求上,却有着极大的共性。数据类型都分为数值型、字符型、长字符型等,这个共性给数据库数据类型转换带来了可能和方便。通过分析异构数据库中各数据类型的特征,找出和建立它们之间的对应关系,达到数据源跨平台的目的。
本文所研究的3种数据库平台在数据库重构时存在9种映射关系(包含自身映射),为了尽可能多地考虑数据的完整性和最大兼容性,将表示范围小的数据类型映射到同等范围或者表示范围大的数据类型中去,尽量避免将表示范围大的数据类型映射到表示范围小的数据类型中去。例如,MySQL的VARCHAR类型映射到Oracle中,依然是VARCHAR,但反过来Oracle的VARCHAR类型映射到MySQL中,对应的则是TEXT类型,因为MySQL中的VARCHAR类型表示的字符存储容量已不能满足 Oracle中VARCHAR的需求了。
在C++程序设计中,利用STL中的MAP关联容器来实现这种对应关系,将源数据库数据类型作为XML文档的数据类型查询方,而将查询到的对应项作为重构的目标数据库的数据类型项。
2.3 表记录的导出
目前主流数据库平台对XML给予很大支持,能够让用户方便地将库表记录从库中导出到XML文件中去,但各个平台产生的XML文件格式差异很大,限制了它的通用性。在该系统中,先将数据库中表的记录通过自身机制导出到XML文件中去,然后再通过系统中的转换模块,将记录的存储格式转换成统一的格式保存到XML文档的记录区中,和结构区共同来表达一个完整的可重构的数据表。
VC++环境中,通过数据库访问组件执行SQL语句,来完成相应的数据操作,将数据库中的记录导出到XML文件中去。
从Oracle 10g数据库中导出记录到XML文件中的命令:
spool F:oracle_arc.xml;
他是最会讲“段子”的科普达人,最受青少年欢迎的明星专家。他参与了上海科技馆、自然博物馆的筹建,并承担了上海自然博物馆近500块中英文展板的编写工作;
selectDBMS_XMLQuery.getXml('select*from tablename')from dual;
spool off
当然还必须根据记录的大小和要生成的格式设定其它的参数,比如 pagesize、long、linesize、heading、trimspool等,参数设定不当会出现XML文件不完整,记录值不全的问题。
从MySQL5数据库中导出记录到XML文件中的命令:
mysql-h ip-X-u*-p*-e"use dbname;select*from tablename;" >F:mysql_arc.xml
上面命令中IP指MySQL服务器IP地址,*分别表示用户名和登录密码。
从SQL Server中导出记录到XML文件中的命令:
select*from tablename for XML Auto
再将结果集利用VC++中的ADO技术存入到XML文件中即可。
上面生成的XML文件在格式有一定的差异,通过转换,将导出的数据转换成以下格式:
<tablerecord>//表记录区
<record stu_id="0302001"course_name="英语"stu_score="86"/>//第一条记录值
<record stu_id="0302002"course_name="英语"stu_score="65"/>//第二条记录值
…
</tablerecord>
将记录导出到XML文件中后,通过对比原表中记录的数量和XML导出的记录数,检验数据的完整性;通过随机比较某些记录项的值,检验数据的一致性。
在导出表信息的同时,生成详细的日志。记录下操作者、表名、日期、任务名称、是否成功、XML文件名称和存储位置等信息,以便用户查询分析。
3 结束语
本文设计并实现了基于XML的数据库归档系统,利用数据库平台对XML的支持, 通过数据格式和数据类型的转化,屏蔽平台差异性,达到异构环境的数据归档和重构的目的。系统的分布式设计,使其更贴近企业的真实应用环境。在 MSSQL Server 2005,MySQL5,Oracle 10g这3种异构数据库环境的实际应用中,总体效果良好。
[1]江勇,于建武,刘镇.基于Schema的XML文档和关系模式的映射研究[J].科学技术与工程,2008,8(2):407-410.
[2]刘洪星,陈明,张学敏.几种基于EER的XML概念模式的研究[J].武汉理工大学学报,2006,28(5):25-28.
[3]刘雍.将关系数据库的查询结果转换为XML文档[J].琼州学院学报,2009(2):18-21.
[4]石海霞.基于XML的数据库中间件技术与应用研究[D].杭州:浙江工业大学,2008:29-30.
[5]刘伟.基于Schema的XML模式与关系模式映射算法的研究[J].计算机应用与软件,2006,23(3):113-115.
[6]吴洁明,万励,莫智懿,等.基于关系数据库的XML存储技术[J].制造业自动化,2011,33(1):7-9.
[7]任剑岚.SQL Server 2005对XML的支持分析报告[J].电脑知识与技术,2011,7(2):274-275.
[8]李为,蔡英蔚,徐辉.基于多线程的异构数据库集成平台的设计实现[J].现代电力,2008,25(5):69-72.
[9]陈巍,刘艺雯.数据库数据迁移测试软件的研究与实现[J].安徽工程科技学院学报,2010,25(4):35-39.
[10]冯春辉.基于关系数据库的XML映射机制研究[J].煤炭技术,2010,29(12):136-137.
[11]郝少化,韩燮.基于XML技术的异构关系数据库集成模型[J].计算机工程与设计,2010,31(24):5285-5288.
[12]王军,张兴忠.XML与全文检索在CMS数据归档中的应用[J].电脑开发与应用,2011,25(1):70-72.
[13]刘慧琳.基于XML和数据库的数据映射研究[J].西南民族大学学报,2008,34(3):610-612.
[14]吴明娟,李晟.基于XML的历史数据归档与重构策略的研究与应用[J].电脑开发与应用,2008,25(2):5-7.