书城计算机数据库原理及Oracle应用
31848700000021

第21章 数据库的保护(5)

8.2.1.4 恢复策略

通过备份建立数据库备份副本和登记日志文件后,就可以利用备份副本和日志文件进行故障恢复。

1.事务故障恢复

事务故障是指事务未运行至正常终点前被撤销。这时恢复子系统应对此事务做事务撤销处理(UNDO)。具体做法如下。

反向阅读日志文件,找出该事务的所有更新操作。

对每一个更新操作做逆处理。即若记录中是插入操作,则做删除操作;若记录中是删除操作,则做插入操作;若是修改操作,则用修改前的值替代修改后值。

如此处理直至读到此事务的开始标记,事务故障恢复完成。

事务故障的恢复是由系统自动完成的,不要用户干预。

2.系统故障恢复

系统故障(如掉电)发生时,造成数据库不一致的原因有两个:一是由于一些未完成事务对数据库的更新已写入数据库;二是由于一些已提交事务对数据库的更新还留在缓冲区还没来得及写入数据库。因此,恢复操作分三步实现:

根据日志文件,找出故障发生前的事务,区分哪些事务已提交,哪些事务未提交。将提交的事务放到重做(REDO)队列,将未提交的事务放到撤销(UNDO)队列。

对撤销队列中的事务进行撤销(UNDO)处理,反向扫描日志文件进行逆操作。

对重做队列中事务进行重做(REDO)处理,正向扫描日志文件进行重操作。

系统故障的恢复是由系统自动完成的,不要用户干预。

3.介质故障与病毒破坏的恢复

在发生介质故障和遭病毒破坏时,磁盘上数据库的物理文件被破坏,这是最严重的故障。恢复操作可以分为两个步骤。

重装最近备份的备份副本,使数据库恢复到备份时的一致状态。

装入日志文件,执行系统提供的恢复命令。

恢复命令读日志文件,找出已提交标记的事务将其放到重做队列;根据重做队列中记录,重做所有已完成事务,将数据库恢复至故障前某一时刻的一致状态。

介质故障的恢复需要人工干预,需要DBA执行上述恢复过程加以恢复。

数据库安全和恢复是数据库系统正常运行的保证。对于大型DBMS一般都提供了安全机制的保证,即由系统提供相应的功能。但对于小型DBMS并非都具有相应的功能,有时需要人工的辅助措施,用以保证数据库的安全和恢复。

8.2.2 Oracle系统的备份与恢复技术

8.2.2.1 备份与恢复的基本概念

Oracle数据库是由一组物理文件组成的,包括:联机重做日志文件、归档日志文件、控制文件、数据文件、参数文件。联机重做日志文件记录对数据库的所有修改;归档日志文件是重做日志文件的拷贝,但要求数据库必须运行在归档模式下才能产生归档日志文件;控制文件是包含数据库物理结构的二进制文件;数据文件记录数据库中表的数据、索引数据、临时数据、回退数据和数据字典数据;参数文件包含数据库初始化参数的文件。这些文件除了参数文件以外,内容基本上由系统自动维护。

为了使数据库能够正常工作,这些物理文件必须同时出现,而且必须是一致的。如果丢失了其中任何一个文件,数据库就可能无法启动,或者会在正常工作中产生中断。

Oracle系统一般发生四类故障:事务故障、系统故障、介质故障和计算机病毒。事务故障和系统故障不是很严重的故障,可以由Oracle系统根据日志文件自动恢复,不会导致数据库物理文件的破坏。而介质故障和计算机病毒是比较严重的故障,将导致数据库物理文件不能读写,数据库不能正常启动。所以必须对这些文件事先做一个备份,将其备份到磁盘或磁带上,一旦文件遭破坏不能启动数据库时,使用这些备份文件进行恢复。

备份就是将组成数据库的物理文件拷贝到一个外存(磁盘或磁带)上,以便在物理文件遭到破坏时可以使用这些备份文件进行恢复。

恢复就是在数据库遭到破坏时将这些数据库文件从磁盘或磁带复制到期望的位置上,然后启动数据库并进行恢复,使这些物理文件达到完全一致的过程。

8.2.2.2 Oracle数据库归档模式的设置

Oracle数据库运行在归档模式时,归档进程ARCH将联机重做日志文件拷贝到磁带或磁盘介质上,即从联机重做日志文件产生归档日志文件,即备份已经发生的所有历史事务。

一旦决定让数据库运行在归档模式,就需要正确配置数据库。默认建立的数据库都是非归档模式。配置数据库归档模式有两种方法:一种方法是建立数据库时指定归档模式(即CREATE DATABASE命令中包含ARCHIVELOG关键字),每次启动数据库时自动设置为归档模式;另一种方法是在已有的非归档模式数据库上用Oracle命令重新指定归档模式。

下面介绍将非归档模式数据库设置为归档模式的步骤。

(1)复制文本参数文件initSID.ora

在启动数据库之前,先用操作系统命令将系统随机带的e:\Oracle\admin\Oracle\pfile\init.ora.12342文件改名为initSID.ora(其中SID代表数据库名,不同的数据库名对应的参数文件名不同),并且复制到e:\Oracle\ora92\database\目录下。

C:\copy e:\Oracle\admin\Oracle\pfile\init.ora.12342 e:\Oracle\ora92\database\initorcl.ora

2.编辑文本参数文件initSID.ora

用文本编辑器编辑initOrcl.ora参数文件,在该文件的末尾加三行分别设置三个参数的值。加一行logarchivestartTRUE,表示将logarchivestart参数值设置为TRUE,也就是将归档进程设置为自动。加一行logarchivedest′E:\Oracle\ora92\RDBMS′,表示将归档文件存储到E:\Oracle\ora92\RDBMS目录下。加一行logarchiveformat′arc%s.log′,表示归档文件存储的文件名为arc%s.log,%s表示日志文件的序列号,随着日志的切换,%s的值随之增大。如:arc01.log,arc02.log,arc03.log……即只要联机日志文件写满了,ARCH自动将其拷贝到logarchivedest参数指定的目录进行归档。

logarchivestartTRUE

logarchivedest′E:\Oracle\ora92\RDBMS′

logarchiveformat′arc%s.log′

3.重建二进制参数文件spfileSID.ora

由于Oracle 9i数据库启动时默认使用二进制参数文件spfileSID.ora,而不是文本参数文件initSID.ora,所以在文本参数文件中增加或修改参数设置,启动数据库时该参数设置不起作用。为了让刚修改或增加的参数起作用,必须根据修改后的文本参数文件initSID.ora重建二进制参数文件spfileSID.ora。

数据库启动后不能重建二进制参数文件spfileSID.ora,必须在数据库关闭后才能重建。按下列命令先关闭数据库,然后重建spfileSID.ora文件,让刚设置的logarchivestart,logarchivedest,logarchiveformat参数的设置生效。

SQL>connect/as sysdba

SQL>shutdown

数据库已经关闭。

已经卸载数据库。

Oracle 例程已经关闭。

SQL>create spfile from pfile

文件已创建。

(4)启动数据库到MOUNT状态

SQL>startup mount

Oracle 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

(5)修改数据库的归档模式(从非归档模式改为归档模式)

SQL>alter database archivelog

数据库已更改。

(6)打开数据库

SQL>alter database open

数据库已更改。

(7)验证归档参数设置的正确性

SQL>archive log list

数据库日志模式 存档模式

自动存档 启用

存档终点E:\Oracle\ora92\RDBMS

最早的概要日志序列58

当前日志序列60

SQL>

上述显示表示数据库已经运行在归档模式下,并且启用自动归档进程。

8.2.2.3 Oracle的备份方法

Oracle的备份可以分为物理备份和逻辑备份两类:物理备份是针对组成数据库的物理文件的备份;逻辑备份是用Oracle系统提供的EXPORT工具将组成数据库的逻辑单元(表、用户、数据库)进行备份,将这些逻辑单元的内容存储到一个专门的操作系统文件中。

1.物理备份

物理备份又可分为数据库运行在非归档方式下的脱机备份(冷备份)、数据库运行在归档模式下的联机备份(热备份)。

(1)非归档模式下物理冷备份

非归档模式下的冷备份是指在数据库关闭的情况下将组成数据库的所有物理文件全部备份到磁盘或磁带。这种备份方法适合数据库运行于非归档模式。

首先保证数据库在非归档模式(默认是非归档模式),接着关闭数据库,然后用操作系统命令将组成数据库的所有物理文件(包括控制文件、数据文件、重做日志文件)进行完全备份,备份到指定的Oracle目录下(如h盘)。执行下列命令完成非归档模式下的物理冷备份。

关闭数据库:

SQL>connect/as sysdba

SQL>shutdown

数据库已经关闭。

已经卸载数据库。

Oracle 例程已经关闭。

SQL>exit

备份整个数据库:

C:\copy e:\Oracle\oradata\Oracle\*.*h:\Oracle\cold\/*备份整个数据库*/

重新启动数据库:

SQL>connect/as sysdba

SQL>startup

Oracle 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

数据库已经打开。

(2)归档模式下物理冷备份

按8.2.2.2节中介绍的步骤设置数据库的归档模式,并确认数据库已运行在自动归档模式。并且进行日志切换三次(假设数据库有三个日志文件组,所以日志切换三次),以便将所有日志信息都存储到归档文件。接着关闭数据库,然后用操作系统命令将组成数据库的所有物理文件(包括控制文件、数据文件、重做日志文件)进行完全备份,备份到指定的Oracle目录下(如h盘)。将归档日志文件也备份到该Oracle目录下,备份完成后重新打开数据库。归档模式下物理冷备份可通过执行以下命令来完成。

日志切换归档所有联机日志文件:

SQL>connect/as sysdba

SQL>alter system switch logfile/*产生日志切换*/

SQL>alter system switch logfile

SQL>alter system switch logfile

关闭数据库:

SQL>connect/as sysdba

SQL>shutdown

数据库已经关闭。

已经卸载数据库。

Oracle 例程已经关闭。

SQL>exit

备份整个数据库及归档日志文件:

C:\copy e:\Oracle\oradata\Oracle\*.*h:\Oracle\cold\/*备份整个数据库*/

C:\copy e:\Oracle\ora92\RDBMS\arc*.*h:\Oracle\arch\/*备份归档日志文件*/

重新启动数据库:

SQL>connect/as sysdba

SQL>startup

Oracle 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

数据库已经打开。

(3)归档模式下物理热备份

归档模式下的热备份是指在数据库打开的情况下将组成数据库的控制文件,以及与各个表空间对应的数据文件备份到磁盘或磁带,当然必须将归档日志文件也一起备份。这种备份方法要求数据库必须运行在归档模式。

在执行物理热备份之前,首先要确保数据库的监听程序已正常启动。

启动Oracle数据库和监听程序的方法是:在Windows NT或Windows 2000或Windows XP或Windows ME等操作系统下,只要在“控制面板”的“管理工具”的“服务”窗口中,将OracleServiceSID 服务启动(其中SID代表数据库的名,即数据库名不同,WINDOWS下的服务名也不同),就启动了数据库;将OracleOraHome92TNSListener服务启动,就启动了监听程序,此时才能监听客户端发来的连接请求。

接着按8.2.2.2节中介绍的步骤设置数据库的归档模式,并确认数据库已运行在自动归档模式。

然后查询数据字典确认SYSTEM、USERS表空间所对应的数据文件,命令如下:

SQL>connect/as sysdba

SQL>SELECT filename,tablespacename FROM dbadatafiles

查询结果如下:

FILENAME TABLESPACENAME

——

E:\Oracle\ORADATA\ORCL\SYSTEM01.DBF SYSTEM

E:\Oracle\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1

E:\Oracle\ORADATA\ORCL\INDX01.DBF INDX

E:\Oracle\ORADATA\ORCL\TOOLS01.DBF TOOLS

E:\Oracle\ORADATA\ORCL\USERS01.DBF USERS

E:\Oracle\ORADATA\ORCL\TEST.ORA USERS

E:\Oracle\ORADATA\ORCL\TEST2.ORA DUSERS

因为SYSTEM表空间中存放数据字典信息,所以SYSTEM表空间不能脱机,只能进行联机备份。上述查询标明SYSTEM表空间对应的数据文件为:E:\oracle\oradata\orcl\system01.dbf。

SQL>ALTER TABLESPACE system BEGIN BACKUP

SQL>host copy E:\oracle\oradata\orcl\system01.dbf h:\Oracle\hot\

SQL>ALTER TABLESPACE system END BACKUP

非SYSTEM表空间可以进行联机备份,也可以进行脱机备份。USERS表空间对应的数据文件有三个,分别为e:\oracle\oradata\orcl\test.ora,e:\oracle\oradata\orcl\test2.ora和e:\oracle\oradata\orcl\users01.dbf。因为对USERS表空间采用脱机备份,所以必须先将USERS表空间脱机,然后采用操作系统命令将其所对应的数据文件备份到其他介质上。

SQL>ALTER TABLESPACE users OFFLINE

SQL>host copy e:\oracle\oradata\orcl\test.ora h:\oracle\hot\

SQL>host copy e:\oracle\oradata\orcl\test2.ora h:\oracle\hot\

SQL>host copy e:\oracle\oradata\orcl\users01.dbf h:\oracle\hot\

数据库中其他表空间都可以用与USERS表空间相同的方法进行联机或脱机备份。

使用下列命令将当前联机重做日志文件存储为归档日志文件,以便以后恢复时使用。

SQL>ALTER SYSTEM ARCHIVE LOG CURRENT

或者使用下列命令切换所有的联机日志文件,以便将所有日志信息都存储到归档文件。

SQL>ALTER SYSTEM SWITCH LOGFILE/*产生日志切换*/

SQL>ALTER SYSTEM SWITCH LOGFILE

SQL>ALTER SYSTEM SWITCH LOGFILE

然后可用下列命令备份控制文件,产生一个二进制副本,放在h盘的目录下。

SQL>ALTER DATABASE BACKUP CONTOLFILE TO′h:\oracle\hot\control1.ctl′

如果归档日志文件被破坏了,并且归档日志文件没有备份,数据库仍然不能恢复到失败点。所以归档日志文件应该备份到指定的设备上(如h盘),以便恢复时使用。但因为归档日志文件的内容是不变的,所以可以在数据库打开或关闭的情况下用下列操作系统命令备份。

C:\copy e:\oracle\ora92\rdbms\arc*.*h:\oracle\arch\/*备份归档日志文件*/

2.逻辑备份

逻辑备份就是使用Oracle提供的工具EXPORT将数据库中的数据卸出后存放到一个专门的操作系统文件中。

(1)卸出的模式

Export工具提供了四种卸出模式:表、用户、数据库和表空间,分别指定不同的参数可以按不同模式卸出。

表模式表示可以卸出指定表的定义、表的数据、表上的权限、触发器、约束条件、表上的索引等内容。所有拥有CREATE SESSION权限的用户都可以卸出它们自己的表,需要拥有EXPFULLDATABASE角色权限的用户才能卸出别的用户的表。

用户模式表示所有拥有CREATE SESSION权限的用户都可以卸出自己建立的对象(包括表、视图、私有数据库链路、快照、序列生成器、同义词、存储过程、函数、包等)。拥有EXPFULLDATABASE角色权限的用户才能卸出别的用户所拥有的对象。

整个数据库模式表示只有拥有EXPFULLDATABASE角色权限的用户才能执行全数据库卸出。在这种模式下可以卸出除了SYS用户所拥有的对象以外的数据库所有对象,包括:表空间、撤销段、用户、权限、公共数据库链路、公共同义词等对象的定义和相应的数据。

表空间模式用于从一个数据库往另一个数据库迁移表空间时使用。这种卸出模式只卸出表空间和表空间上对象的定义,但不卸出数据。

(2)卸出运行方式

卸出运行方式有三种:交互方式、命令行方式和参数文件方式。

交互方式卸出时首先在操作系统提示符c:\下输入EXP,然后EXPORT工具会一步一步提示用户回答系统提出的问题,根据用户的回答,EXPORT工具卸出相应的内容。按用户卸出模式举例说明交互方式的使用过程。

如果希望按用户模式卸出,则在“(1)E(整个数据库)(2)U(用户)或(3)T(表):(2)U>”后面输入“U”表示按用户卸出。下列卸出命令完成将scott用户所拥有的全部对象卸出到e:\oracle\fuser.dmp文件中。

E:\>exp

Export:Release 9.2.0.1.0-Production on 星期三1 月19 12:02:18 2005

(c)Copyright 1982,2002,Oracle Corporation.All rights reserved.

用户名:scott/tiger

连接到:Oracle 9i Enterprise Edition Release 9.2.0.1.0-Production

With the Partitioning and Java options

PL/SQL Release 9.2.0.1.0-Production

输入数组读取缓冲区大小:4096>

导出文件:EXPDAT.DMP>e:\oracle\fuser.dmp

(1)E(整个数据库)(2)U(用户),或(3)T(表):(2)U>U

导出权限(yes/no):yes>

导出表数据(yes/no):yes>

压缩范围(yes/no):yes>

即将导出scott的对象……

.即将导出scott的表通过常规路径……

..正在导出表ARTKEY 15 行被导出

..正在导出表BBOARDINFOR 8 行被导出

..正在导出表BCHILDTAB 5 行被导出

.正在导出同义词

.正在导出视图

.正在导出存储的过程

.正在导出引用完整性约束条件

.正在导出触发器

.正在导出快照

.正在导出快照日志

在没有警告的情况下成功终止导出。

命令行方式就是将交互方式中所有用户回答的内容全部写在命令行上,每一个回答的内容作为某一关键字的值。EXPORT工具命令行的语法如下:

EXP[KEYWORD]{VALUE|(VALUE,VALUE……)}

[[[,]KEYWORD]{VALUE|(VALUE,VALUE……)}]……

其中:KEYWORD是关键字。VALUE是为关键字赋的值。EXPORT工具常用的关键字包括:USERID、OWNER、TABLES、FULL和FILE。

USERID指定使用EXPORT工具连接到Oracle的用户名/口令。

OWNER指定按用户模式卸出时的用户名。

TABLES指定按表模式卸出时的表名。

FULLY表示按整个数据库卸出。

FILE指定存储卸出对象内容的专门操作系统文件。

FULLY、OWNER用户名和TABLES表名这三个关键字,只能定义其中一个,不能同时定义。如果选择FULLY,表示按整个数据库卸出,需要拥有EXPFULLDATABASE角色权限。如果选择OWNER用户名,表示按用户卸出。如果选择TABLES表名,表示按表卸出。

例8-47 用命令行方式将scott用户的dept和emp两张表导出到文件emp.dmp中。

C:\EXP USERIDscott/tiger TABLES(dept,emp)FILEc:\oracle\emp.dmp

参数文件就是存放上述关键字和相应值的一个文件,然后将该文件名作为命令行的PARFILE关键字的值。如果在参数文件中没有列出的关键字,该关键字就采用其默认值。

例8-48 用参数文件方式将scott用户的dept和emp两张表导出到文件C:\Oracle\f1.dmp中。

先用文本编辑器编辑一个参数文件,名为C:\PAR1.TXT,内容如下:

USERIDscott/tiger

TABLES(dept,emp,bonus)

FILEC:\oracle\f1.dmp

LOGC:\oracle\log1.log

QUERY″WHERE deptno IN(10,20,30)″

然后执行EXPORT工具时使用该参数文件(包含路径)。该参数文件表示将scott用户下的dept、emp、bounus表中部门号为10、20、30的数据卸出到f1.dmp文件中,卸出过程中的消息写到log1.log文件中。执行命令如下:

C:\EXP PARFILEC:\PAR1.TXT