Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103681801
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-06 22:26:46

   来源:赛迪网技术社区    作者:sanandi

摘要:多数Oracle数据库管理员会遇到数据库的备份恢复和将某表中数据定期备份形成历史流水数据以便今后查询统计等问题,本文通过对Oracle数据库实用工具恢复管理器及DBMS_JOB包工作机制的分析,提出了应用Oracle数据库恢复管理器和利用DBMS_JOB包实现存储过程自动执行来解决问题的方法。

关键词:DBA、备份恢复、恢复管理器、DBMS_JOB包。

一. 引言

随着Oracle大型数据库系统在企业的广泛应用,系统数据量的快速增长,相信为数不少的Oracle DBA每天都在忙于做着重复的工作--对数据库进行备份。如果一旦哪一天疏忽了,而这一天系统又恰恰发生了故障,需要进行数据恢复,那么此时对 DBA来说可能就是一场灾难, 因为他可能无法完整地恢复数据库中的数据。此外,在数据库的应用中我们会经常碰到这样的需求:将一些重要数据表中的数据定期备份到另一些数据表中去。例如在企业员工工资管理系统中,每月工资报表打印完毕后,应将当月工资数据保存到工资历史库中去,以便今后查询及统计使用。通常我们采用存储过程来完成对数据的处理,这个过程由人工定期执行完成,操作起来很不方便。对于第一种情况,现在我们可利用Oracle据库实用工具恢复管理器来完成DBA每天必须做的备份工作,而且可设定一个固定的时间, 让系统自动进行备份。对后一种情况,我们可以使用DBMS_JOB包结合存储过程来实现数据处理的自动执行。下面笔者结合实践经验,分别介绍其实现方法。

二. Oracle数据库备份与恢复方式及特点

ORACLE 数据库备份分为物理备份和逻辑备份。物理备份是数据库文件拷贝的备份,冷备份、热备份属于物理备份。 导出/导入(EXPORT/IMPORT)工具用于进行逻辑备份。

导出(EXPORT)备份可拷贝数据与数据库定义,并以Oracle的内部格式保存为二进制文件。相反,利用Import则可将数据从二进制文件放回到Oracle数据库中。但是导出(EXPORT)备份机制不能提供时间点恢复,而且不能和归档重做日志文件一起使用。

冷备份是在数据库被正常关闭之后进行的数据文件的物理备份。当数据库被关闭时,被数据库使用的每一个文件都被备份下来。这些文件因而保持着数据关闭时的完整的映象。

热备份是在数据库运行的情况下,采用archivelog mode方式备份数据的方法。这涉及到将每个表空间设置为备份状态,然后备份其数据文件,最后将表空间恢复成正常的状态。数据库可以从这个备份中完全地恢复过来,也可以通过归档的重做日志回滚到前面时间的任一个点上。

上述几种备份方法的特性比较:

方法         类型                恢复特性

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

    Export导出   逻辑型     可以将任何数据库对象恢复到它被导出时的状态

    冷备份       物理型     可将数据库恢复到它被关闭时的状态

    热备份       物理型     可将数据库恢复到任一时间点的状态

以上几种备份方式都需要依赖DBA人工操作完成,从而增加了DBA维护系统的负担。当DBA需要维护多个Oracle数据库系统时,还容易导致操作失误,而且备份的数据不便于集中统一管理。

 

三. Oracle数据库恢复管理器及DBMS_JOB包概述

恢复管理器(RMAN)是一个使DBA能很方便地对数据库执行备份和恢复任务的Oracle应用工具,与以上介绍的几种方式不同,它能够提供DBA针对企业数据库备份与恢复操作的集中控制。RMAN可以将备份记录保存在恢复目录中,Oracle服务器保持对备份的跟踪。实际的物理备份拷贝将被存储在指定的存储系统上,可以是磁带或磁盘。RMAN将全部备份数据以Oracle特有的格式写入到"备份集"文件中,通过RMAN应用工具来读取。RMAN支持建立除逻辑备份以外的所有类型的备份。

下图显示了RMAN的功能框图。

利用RMAN进行备份恢复的条件是:

1.建立一个recovery_catalog,存放RMAN使用和维护着的目标数据库的信息,RMAN使用这些信息去决定如何执行备份和恢复的请求。通常是把它建在另一个Oracle数据库的一个模式里,即需要建立一个用户,该用户需要有recovery_catalog_owner权限。

2.目标数据库必须是在archivelog模式下运行,因为这样,日志才能归档,而RMAN正是利用归档日志进行数据恢复,所以这是一个必备条件。同时archivelog模式也是数据库在线备份的必备条件。

3.RMAN备份中,如果采用磁带机备份,需要安装第三方介质管理库(MML)。

恢复管理器保存在RMAN中注册的全部数据库的记录。当RMAN被用来启动备份或恢复数据库时,它将目标数据库与恢复目录中可用的数据库ID进行验证。如果条件一致,RMAN对目标数据库至少建立两个通道,其中一个通道只是对目标数据库的一个远程调用,使用PL/SQL接口来执行备份与恢复操作。RMAN使用它自己的PL/SQL引擎编译这些用户命令,并在目标数据库上执行这些命令。执行过程不需要用户干预,RMAN记录追踪在数据库上执行的全部备份与恢复操作,因而在很大程度上避免了DBA错误导致的危险。同时RMAN提供了多种命令用于检查和测试数据库备份集与拷贝,并确保备份文件完整无缺且能够用于实现恢复。由上述可见,采用恢复管理器做备份与恢复的管理与其他方式相比较具有明显的优势,可大大减少DBA做备份工作的工作量和操作失误。

DBMS_JOB包是Oracle提供的内部函数包,提供了管理和调度作业队列中的作业定时执行的控制机制。所有作业由SNP后台进程执行。 当SNP进程运行一个作业时,进程将首先创建会话,并恢复作业运行时的环境参数,再调度作业运行。DBMS_JOB包的主要功能有:提交Submit(),执行Run(),删除Remove()等。这样,我们就可以用这个包将创建的存储过程放入Oracle数据库系统的作业队列中去,由系统按时调度运行。

四. 应用实例

4.1 RMAN做数据库在线备份应用实例

这里以某公司业务处理计算机中心数据库为例。用户系统配置为:两台HP9000小型机(host1、host2),操作系统为HP-UX11.0,Oracle数据库版本为8.0.5。两台机上各有一个Oracle数据库实例,分别运行不同的业务处理系统。用户要求设备7X24小时在线工作,原则上运行时不允许数据库关闭。这就使得我们只能采用在线备份方式解决问题。为安全起见,我们在另一台IBM服务器(host3)上安装Windows2000及一个独立的Oracle数据库,恢复目录就建在这个数据库中,这台服务器还配置了一台磁带加载机,备份数据存放在磁带上,这样即便哪台机器出现故障我们也能够实现数据库的完全恢复,不过DBA应注意定期做恢复目录数据库的备份。在备份策略上,我们采用了全备份与归档日志备份相结合的方式,既不占用过多的系统时间,也相应减少了备份的数据量。备份策略如下:

(1) 每周日晚11:00做数据库在线全备份。

(2) 每天12:00,18:00 做数据库归档日志文件的在线备份。

建立备份机制的操作如下(以host1机为例):

1) 建立恢复目录并注册目标数据库。

SVRMGR> create tablespace rmanspace datafile 'rmandata' size 500m;

SVRMGR> create user rman identified by rman default tablespace 

        Rmanspace temporary tablespace temp;

SVRMGR> grant connect,resource,recovery_catalog_owner to rman;

以上为建立RMAN表空间和用户。

$ sqlplus rman/rman

sql> start "/ora_01/app/oracle/product/8.0.5/rdbms/admin/catrman";

--执行创建恢复目录操作

$ rman target system/manager@host1 rcvcat rman/rman@host3;

                                       --连接目标数据库和恢复目录

rman> register database;               --将目标数据库注册到恢复目录中

rman> resync catalog;                  --进行同步目录操作

2) 将目标数据库改为归档模式运行。

SVRMGR> connect internal

SVRMGR> startup mount [dbname]

SVRMGR> alter database [dbname] archivelog; --起用归档模式

SVRMGR> archive log start                       --启动自动归档模式

SVRMGR> alter database [dbname] open;           --打开数据库

修改数据库初始化参数文件init.ora,定义归档模式(自动)、归档日志文件保存路径、归档日志文件命名方法,重新启动数据库。

3)建立全备份脚本文件hotbackup.rcv。

connect target internal/oracle@host1

connect rcvcat rman/rman@host3

run { allocate channel t1 type 'SBT_TAPE';

backup 

    incremental level 0

    skip inaccessible

    tag hot_db_bk_level0

    filesperset 5

    format 'bk_%s_%p_%t' (database);

--备份全部数据库控制文件和数据文件

sql 'alter system archive log current';

backup

    filesperset 20

    format 'al_%s_%p_%t' (archivelog all delete input);

--备份归档日志,备份成功后删除归档日志。若不成功,则不做删除。

}

归档日志备份脚本hotarcbackup.rcv文件如下:

connect target internal/oracle@host1

connect rcvcat rman/rman@host3

run { allocate channel t1 type 'SBT_TAPE';

sql 'alter system archive log current';

backup

          filesperset 20

format 'al_%s_%p_%t' (archivelog all delete input);

}
 

4) 利用Unix的crontab命令定期自动执行备份脚本

Crontab命令用于指定一个文件,其行计划命令以固定时间间隔执行。Cron是一个永久进程,它由/etc/rc.local启动执行。Cron程序读取、解释并执行crontab文件。我们将需自动定期执行备份的脚本文件写成shell命令行方式存入crontab文件中,由系统定期调度执行。Crontab文件的每一行由六个域(minutes、hours、day of month、month、day of week、command)组成,域之间用空格或Tab分开。

现在,我们在目标机上编写一个文件,用以启动自动备份进程。文件名定为Oracle,文件将放在/var/spool/cron/crontabs 目录下。Oracle文件内容:

  0 23 * * 0 /oracle/rman/rman cmdfile ‘hotbackup.rcv’ 

  # 星期天23点对数据库执行在线全备份 

  0 12,18 * * * /oracle/rman/rman cmdfile ‘hotarcbackup.rcv’ 

  # 每天12点,18点执行归档文件备份

经过以上的操作后,系统每天自动产生两个归档日志备份,每个星期天产生一个数据库完全备份。DBA需要做的是,隔几天换一盘磁带(更换磁带的周期取决于备份文件的大小和磁带的容量)和用RMAN定期检查备份执行情况。

执行恢复操作的RMAN脚本文件restore.rcv如下(在host1上运行):

connect target

connect rcvcat rman/rman@host3

run { allocate channel t1 type 'SBT_TAPE';

      allocate channel t2 type 'SBT_TAPE';

      restore controlfile;

      sql 'alter database mount';

      restore database;

      recover database;

      sql 'alter database open resetlogs';

    }

4.2 存储过程定期自动执行的实例

以下为将Salary表数据定时转入Salary_history表的应用实例:

创建存储过程
SQL> create or replace procedure ProcEmp

  IS

  begin

     insert into Salary_history (EmpId,EmpName,DptName,Salary,Month)

     select EmpId,EmpName,DptName,Salary,
     to_char(sysdate,'yyyy-mm') from Salary;

   commit;

   end ProcEmp;

/

提交作业

SQL> variable jobno number;

SQL> begin

        DBMS_JOB.SUBMIT(:jobno, 

      'ProcEmp;', 

      SYSDATE, 'SYSDATE + 30'); --每30天运行一次

       commit;

     end;

     /

运行作业

SQL>begin

       dbms_job.run(:jobno);

    end;

    /

五. 结语

Oracle实用工具RMAN的应用为DBA管理多个Oracle数据库提供了集中备份管理与恢复控制的机制,大大地减轻了DBA的工作压力,而DBMS_JOB包的使用增强了存储过程的应用功能,这样,他们就可以从备份数据及重复处理数据的繁琐中解脱出来,去做其它更有意义的工作。而数据库既实现了在线磁带备份,又实现了异机备份集中管理,相应提高了系统运行的安全性

阅读(580) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~