APP下载

Oracle数据库数据跨平台备份与恢复的实现

2009-07-02刘义华

海峡科学 2009年5期
关键词:恢复跨平台备份

刘义华

[摘要] 从数据备份、恢复的灵活性出发,解析Oracle数据库表结构,给出了Windows环境下通过计算机VB语言对Oracle数据库的备份及恢复的实现方法和开发实例。

[关键词] Oracle 数据库 备份 恢复 跨平台 数据字典

Oracle数据库在铁路运输收入现代化管理中发挥着重要的作用,它存储着包括客运、货运、杂费等各类票据的历史数据,担负着客货票据的审核工作。因此对数据库的管理、备份,维护系统数据的安全就显得格外重要。不仅如此,如何充分地利用数据库的功能,在巨量的历史数据中快速获取我们所需数据,也是数据库管理的一项重要内容。实际工作中常常需要将数据库数据跨操作系统平台地备份和恢复,因此需要一种直观、灵活的工具软件,用于实现Oracle数据库数据在不同的平台上的备份与恢复、导出与导入。

1 传统的备份和恢复方法

Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备份是一种逻辑备份,冷备份和热备份是物理备份。

1.1 导出/导入(Export/Import)

利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。Oracle支持三种方式类型的输出,分别是:① 表方式(T方式),将指定表的数据导出。② 用户方式(U方式),将指定用户的所有对象及数据导出。③ 全库方式(Full方式),将数据库中的所有对象导出。

数据导入(Import)的过程是数据导出(Export)的逆过程,分别将数据文件导入数据库和将数据库数据导出到数据文件。这是一种常用的数据备份方法,但它最小的操作对象是表。而在实际工作中,经常需要以表内的某个字段(如时间字段)为条件进行操作,因此Export/Import方法就存在一定的局限性。

1.2 冷备份

冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外的位置的一种方法。因为它是将数据库文件完整地拷贝,因此需要占用大量的服务器资源。

1.3 热备份

热备份是在数据库运行的情况下,采用archivelog mode方式备份数据库的方法。

从以上对这三种方法的分析可以看出:操作都必须在服务器上执行,而且都是行命令方式提交。因此操作者不仅要了解数据库知识,还需熟知操作系统平台的各种命令,而且所生成的备份文件都是操作系统平台下的二进制数据文件。当数据库需要跨平台备份或移动时,以上方法就不适用了。笔者在实际工作中就遇到了这种情况。目前收入管理的操作系统平台是VMS操作系统加Oracle数据库。客货管理的各种数据库表空间都建立在这一个平台上,服务器磁盘空间就显得相对有限。而大量的历史数据又是运输收入分析的基础,因此必需将历史数据移动到其他操作系统平台上,如在Windows下建立Oracle数据库。由于Windows不能识别VMS下的数据文件,上述方法自然无法做到数据库表从VMS到Windows的移动。根据实际工作需要,笔者用计算机VB语言编制了一个工具软件,在C/S(客户端/服务器)模式下实现了一种简捷的、跨平台的数据库数据备份与恢复的方法,操作的范围大到表空间内所有的表,小至按表的字段值为操作条件,同时备份数据不仅用于数据恢复,还能够直接被再利用,如被EXCEL读取后再加工。下面笔者详细阐述该软件的设计原理及实现过程。

2 设计思路

2.1 备份

在C/S模式下运用Microsoft ActiveX数据对象(ADO)建立对Oracle数据库的连接,通过用户数据字典获取表空间内的所有表名、表的数据结构;建立一个能够按需要在程序运行过程中动态创建查询语句的模型,然后根据创建的查询条件创建数据集对象,将表名、表结构、查询条件以及数据集的所有数据导出到客户端。为了导出的数据能够兼有备份以外更多的用途,笔者使用文本文件存储备份数据,字段间使用ASC码中的TAB符间隔;

2.2 恢复

建立对Oracle数据库的连接后,判断表空间内是否存在欲恢复的表。如果有,而且数据结构与备份的数据结构一致,说明是在原数据库上恢复数据,通过SQL命令将数据导入相应的表内;如果没有,就根据表结构创建表,再将数据导入相应的表内。

由于是通过ADO连接数据库,而且备份文件存储于客户端,因此数据的导入导出不受数据库所在的操作系统平台限制,能够实现数据库数据跨平台的移动。

3 实现原理

表空间是Oracle数据库中最大的逻辑单位与存储空间单位,数据库系统通过表空间为数据库对象分配空间。数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系,可以直观地理解为具有行、列的表格。表中每列代表不同的对象属性、有不同的名称,统称为字段;表中每行则代表这组数据不同时段、状况下的取值。数据库采用数据字典的模式管理表空间。数据字典由一组特殊的表组成,以二维数组的形式记录表空间的所有信息,如数据字典TABLESPACE_NAME记录着表空间名及其类型,SYS.COL记录着表空间内所有表的数据结构等等。总之,数据库通过数据字典以表的结构形式来管理表以及其他数据库信息。数据库数据的导入导出不仅仅是对数据的操作,更重要的是获取表的数据结构。只有这样,才能在其他操作系统上克隆表结构,进而备份数据。下面,笔者详细阐述该软件编制的各个环节。

3.1 连接数据库

在C/S模式下采用ADO (Microsoft ActiveX Data Objects)来快速建立与数据库的连接。ADO具有高度的灵活性,它可以使用相同的编程模式连接到不同的操作系统平台下的Oracle数据库,而不管操作系统平台的特定特性,同时又具有较低的内存占用率。 因此当在需要跨平台移动数据的情况下,备份数据时连接原数据库,而当需要移动恢复数据时就连接目标数据库。实现连接数据库具体代码如下:

在工程菜单中引用Microsoft ActiveX Data Object 2. 5 Library

声明ADO连接对象为工程级全局变量

Public cnn As ADODB.Connection

cnn.ConnectionString = "PROVIDER=MSDASQL; " _

+ "DRIVER={Microsoft ODBC for Oracle};" _

+ "SERVER=" +数据库别名 + ";UID=" + 用户名 + ";PWD=" + 口令

3.2 获取表空间信息

在建立连接对象后,可以通过Exexute方法执行SQL命令,获取表空间信息。

SQL> SELECT TABLESPACE_NAME FROM USER_TABLES

从该语句的查询结果可以看出,数据字典视图USER_TABLES中存储有所有表名(TABLE_NAME字段)及其所属的表空间名(TABLESPACE_NAME字段)。记录集(Recordset)对象是ADO操作数据最常用的对象。因此通过执行上述SQL命令创建并打开记录集,即可获取所有表名及其所属的表空间名。程序代码如下:

Public cnn As ADODB.Connection‘声明ADO连接对象

Public rds As ADODB.Recordset ‘声明记录集Recordset对象

cnn.Open

rds.Open "SELECT TABLE_NAME, TABLESPACE_ NAME FROM USER_TABLES", cnn, adOpenDynamic, adLockOptimistic

Do While rds.EOF = False

List1.AddItem Trim(rds.Fields("TABLE_NAME"))

rds.MoveNext

Loop

rds.Close

cnn.Close

3.3 获取表数据结构

数据字典视图SYS.COL中存储所有表的数据结构。以下SQL命令检索出表中字段的定义信息。

SQL> desc sys.col

名称 是否为空? 类型

------------------ -------- ----

TNAME NOT NULL VARCHAR2(30) 表名

COLNO NOT NULL NUMBER 字段序号

CNAME NOT NULL VARCHAR2(30) 字段名

COLTYPE VARCHAR2(9) 字段类型

WIDTH NOT NULL NUMBER 字段宽度

SCALE NUMBER 小数点位数

PRECISION NUMBER 整数位数

NULLS VARCHAR2(19)

DEFAULTVAL LONG

同样是通过创建记录集,便可以获取表的数据结构。在实现数据移动时,能够在新的数据库表空间中克隆表的数据结构。

3.4 建立条件设置模型

对数据库的备份通常是以表为单位进行操作,但随着日积月累,表中的记录数将越来越大。以客票数据为例,路局每月客票的售票量就达560万以上,一年仅这一项数据的保存记录近7千万条。如果仍以表为单位操作,不但会重复地浪费空间资源,备份或恢复的过程将很漫长,过程中受意外事件干扰而中断的概率也很高。因此笔者设计了一套条件查询的设置模型,引入SQL命令中的条件查询功能,将备份/恢复的操作单位由表缩小到以表中任意一个字段值为条件的查询范围,实现大表分阶段的备份/恢复,既节省时间,又节省磁盘空间。如对客票数据表,就可以按时间字段为条件,以月为单位备份/恢复数据。条件设置模型就是在操作者和数据库之间建立一个平台,由操作者输入或动态选择生成带条件的SQL查询命令。当然,如果没有设置任何条件,那么程序将生成无条件的SQL查询命令,操作的范围就是整个表。

条件设置模型包含以下三部分:

3.4.1数据库列表

通过单项或多项选择方式选中欲操作的表,并列于其中。

3.4.2 SQL命令手工编辑

对于具有相同数据结构的一组表或都具有共同字段的一组表,在选中这一组表后直接在该编辑区手工输入SQL的条件。如客票数据库中每个表都有一个记录日期的字段“RQ”,如果想备份2008年1月的数据,就可以选中数据表后在编辑区输入“RQ=200801”,那么条件设置模型就会将所选中的表加入该条件生成一组SQL命令。对于多条件的情况同样适用,只是在两个条件句之间加入“AND”或“OR”表示两句是“并且”还是“或者”的逻辑关系。如上例改为备份南昌站2008年1月的数据,就可以选中数据表后在编辑区输入“ZM=南昌AND RQ=200801”(其中ZM是表示站名的字段名称)。

3.4.3字段参数动态设置

这是一个与数据库互动的过程,涉及这几个区:字段区、逻辑关系区、字段值区。全过程分以下步骤:(以备份2008年1月的数据为例)

① 在数据库列表双击选中欲操作的表(如选择表LCTJ),字段区列出该表的所有字段,等待选择;

② 在字段区双击选中欲操作的字段(选择字段RQ),逻辑关系区提供如=、>、>=、<、<=、LIKE等比较运算符;

③ 在逻辑关系区选中“=”,这时字段值区以列表的形式列出RQ字段在表内不重复的值;

④ 选择值(200801)

通过以上四个步骤便生成了一条标准的条件SQL语句(SELECT * FROM LCTJ WHERE RQ=200801)。如果是多条件的情况,只要重复步骤②、③、④即可实现。而步骤③是通过选中比较运算符时触发一个事件来实现RQ字段在表内不重复的值的列表。该事件对RQ字段冠以DISTINCT关键字进行查询(SELECT DISTINCT RQ FROM LCTJ),就能从表中把RQ字段的所有不重复的数据读出来,并赋予字段值区。

3.5 数据备份

数据备份包括备份三部分内容:备份条件、表的数据结构、数据。备份内容以文本文件形式存储,记录内数据之间以ASCII码中的TAB符间隔。之所以采用这种存储形式,是因为在实际工作中经常需要数据库中的某部分数据进行一些数据分析工作,并不是为了备份数据。而这种存储形式的数据就能够直接被诸如EXCEL之类的软件所读取进行数据再利用。

3.5.1记录备份条件

将对表所设置的备份条件记录下来,实际上就是保存下条件设置模型所生成的SQL语句。它不但记录了表名及备份时的数据环境的信息,同时也是为数据恢复做准备。

3.5.2记录表的数据结构

首先通过对数据字典视图SYS.COL的查询结果,获取表的每一个字段的名称、数据类型以及字段长度;其次是通过对数据字典视图USER_TABLES的查询结果获取表所属的表空间名;最后将完整的数据结构记录在备份文件中。

3.5.3备份数据

备份数据是用条件设置模型所生成的SQL语句通过ADO打开数据记录对象RecordSet,该对象所生成的记录集就是符合SQL条件的所有要备份的数据,然后使用该对象的各种方法将所有记录按既定的格式保存到备份文件中。

以下是以备份南昌站2008年1月的数据为例的程序代码:

Public cnn As ADODB.Connection

Public rds As ADODB.Recordset

cnn.Open

rds.Open “SELECT * FROM LCTJ WHERE RQ=200801 AND ZM=‘南昌”, cnn, adOpenDynamic, adLockOptimistic

Do While rds.EOF = False

For ii = 0 To rds.Fields.Count – 1 对每条记录的所有字段进行循环取数

If (ii <> rds.Fields.Count - 1) Then

If (IsNull(rds.Fields(ii)) = True) Then 对字段数据为空的特别处理

Print #1, ""; Chr(9);

Else

Print #1, rds.Fields(ii); Chr(9);

End If

Else

If (IsNull(rds.Fields(ii)) = True) Then对字段数据为空的特别处理

Print #1, ""; Chr(9)

Else

Print #1, rds.Fields(ii); Chr(9)

End If

End If

Next ii

rds.MoveNext

Loop

cnn.Close

3.6 数据恢复

3.6.1判断所连接的数据库内是否存在要恢复的表

如果是在原位上恢复数据,表自然是存在的;但如果要在另外平台上重新建立数据库,那么就需要新建表。首先从备份文件中读取表名,通过对数据字典视图USER_TABLES

的TABLE_NAME字段的查询判断表是否存在。如果表不存在,那么从备份文件中读取表的数据结构后发送SQL的CREATE命令新建一个同名同结构的表。

3.6.2清除表内与备份条件相符的原有记录

为了防止数据的重复,保持数据的完整性和唯一性,在正式恢复数据之前从备份文件中读取备份时的条件语句,删除表内与此条件相符的所有记录。

3.6.3恢复数据

经上述准备,就可以进行恢复数据的步骤了。只要逐一读取数据记录,通过辨别TAB分隔符获取每个字段的数据,并将其写入表内,直至最终完整地将数据恢复,结束了全过程。

4 结语

该软件采用VB+数据库ADO技术,实现了Oracle数据跨操作系统平台的数据备份与恢复的过程,特别是加入了SQL条件,使得备份与恢复的范围更加灵活,同时备份数据兼顾再利用的功能,满足了运输收入信息化管理工作的实际需要。

猜你喜欢

恢复跨平台备份
利用云备份微信聊天记录
一款游戏怎么挣到全平台的钱?
潜力双跨平台:进阶:谁将跨入下一个“十大”?
如何只备份有用数据而不备份垃圾数据
全方位备份,就用Acronis True Image
Windows10应用信息备份与恢复
基于C++语言的跨平台软件开发
利用存储系统恢复服务器系统
基于C++语言的跨平台软件开发的设计