欢迎来到福编程网,本站提供各种互联网专业知识!
您的位置:网站首页 > 数据库 > Oracle

Oracle RMAN快速入门指南

发布时间:2007-03-07 作者: 来源:转载
正在看的ORACLE教程是:OracleRMAN快速入门指南。前言:这篇文章主要介绍RMAN的常用方法,其中包含了作者一些自己的经验,里面的实验也基本全在WIN2K和ORACLE8.1.6环境下测试成功(因为这个环境比较容易实现)。本文借鉴了网上一些高手的相关文章,希望大侠们不
正在看的ORACLE教程是:Oracle RMAN快速入门指南。

前言:

这篇文章主要介绍RMAN的常用方法,其中包含了作者一些自己的经验,里面的实验也基本全在WIN2K和ORACLE8.1.6环境下测试成功(因为这个环境比较容易实现)。

本文借鉴了网上一些高手的相关文章,希望大侠们不要见怪,此处一并谢过。

这篇文章主要是在北京出差期间写的,回到家后整理修改了一下,时间比较仓促,同时因为篇幅有限,一些技术细节不能一一覆盖了,只希望能够帮助新手入门的作用,想真正熟练掌握RMAN,必须经过较长时间的实践磨练才可以,尤其需要在工程中获得宝贵的故障解决经验。

1.什么是RMAN?

RMAN可以用来备份和还原数据库文件、归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。

注意:RMAN不能用于备份初始化参数文件和口令文件。

RMAN启动数据库上的Oracle服务器进程来进行备份或还原。备份、还原、恢复是由这些进程驱动的。

RMAN可以由OEM的BackupManagerGUI来控制,但在本文章里不作重点讨论。

2.Terminology专业词汇解释

2.1.Backupsets备份集合

备份集合有下面的特性:

包括一个或多个数据文件或归档日志

以oracle专有的格式保存

有一个完全的所有的备份片集合构成

构成一个完全备份或增量备份

2.2.Backuppieces备份片

一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大小是有限制的;如果没有大小的限制,备份集就只由一个备份片构成。备份片的大小不能大于使用的文件系统所支持的文件长度的最大值。

2.3.Imagecopies镜像备份

镜像备份是独立文件(数据文件、归档日志、控制文件)的备份。它很类似操作系统级的文件备份。它不是备份集或备份片,也没有被压缩。

2.4.Fullbackupsets全备份集合

全备份是一个或多个数据文件中使用过的数据块的的备份。没有使用过的数据块是不被备份的,也就是说,oracle进行备份集合的压缩。

2.5.Incrementalbackupsets增量备份集合

增量备份是指备份一个或多个数据文件的自从上一次同一级别的或更低级别的备份以来被修改过的数据块。与完全备份相同,增量备份也进行压缩。

2.6.Filemultiplexing

不同的多个数据文件的数据块可以混合备份在一个备份集中。

2.7.Recoverycatalogresyncing恢复目录同步

使用恢复管理器执行backup、copy、restore或者switch命令时,恢复目录自动进行更新,但是有关日志与归档日志信息没有自动记入恢复目录。需要进行目录同步。使用resynccatalog命令进行同步。

RMAN>resynccatalog;
RMAN-03022:正在编译命令:resync
RMAN-03023:正在执行命令:resync
RMAN-08002:正在启动全部恢复目录的resync
RMAN-08004:完成全部resync

[NextPage]

3.恢复目录

3.1.恢复目录的概念

恢复目录是由RMAN使用、维护的用来放置备份信息的仓库。RMAN利用恢复目录记载的信息去判断如何执行需要的备份恢复操作。

恢复目录可以存在于ORACLE数据库的计划中。

虽然恢复目录可以用来备份多个数据库,建议为恢复目录数据库创建一个单独的数据库。

恢复目录数据库不能使用恢复目录备份自身。

3.2.建立恢复目录

第一步,在目录数据库中创建恢复目录所用表空间:

SQL>createtablespacerman_tsdatafile'd:oracleoradatarmanrman_ts.dbf'size20M;

表空间已创建。

第二步,在目录数据库中创建RMAN用户并授权:

SQL>createuserrmanidentifiedbyrmandefaulttablespacerman_tstemporarytablespacetempquotaunlimitedonrman_ts;

用户已创建。

SQL>grantrecovery_catalog_ownertorman;

授权成功。
SQL>grantconnect,resourcetorman;

授权成功。

第三步,在目录数据库中创建恢复目录

C:>rmancatalogrman/rman

恢复管理器:版本8.1.6.0.0-Production

RMAN-06008:连接到恢复目录数据库
RMAN-06428:未安装恢复目录
RMAN>createcatalogtablespacerman_ts;
RMAN-06431:恢复目录已创建

注意:虽然使用RMAN不一定必需恢复目录,但是推荐使用。因为恢复目录记载的信息大部分可以通过控制文件来记载,RMAN在恢复数据库时使用这些信息。不使用恢复目录将会对备份恢复操作有限制。

3.3.使用恢复目录的优势

可以存储脚本;

记载较长时间的备份恢复操作;

4.启动RMAN

RMAN为交互式命令行处理界面,也可以从企业管理器中运行。

为了使用下面的实例,先检查环境符合:

thetargetdatabaseiscalled"his"andhasthesameTNSalias

userrmanhasbeengranted"recovery_catalog_owner"privileges

目标数据库的连接用户为internal帐号,或者以其他SYSDBA类型帐号连接

therecoverycatalogdatabaseiscalled"rman"andhasthesameTNSalias

theschemacontainingtherecoverycatalogis"rman"(samepassword)

在使用RMAN前,设置NLS_DATE_FORMAT和NLS_LANG环境变量,很多RMANLIST命令的输出结果是与日期时间相关的,这点在用户希望执行以时间为基准的恢复工作也很重要。

[1][2][3][4][5][6]下一页

正在看的ORACLE教程是:Oracle RMAN快速入门指南。下例是环境变量的示范:

NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK
NLS_DATE_FORMAT=DD-MON-YYYYHH24:MI:SS

为了保证RMAN使用时能连接恢复目录,恢复目录数据库必须打开,目标数据库至少要STARTED(unmount),否则RMAN会返回一个错误,目标数据库必须置于归档模式下。

4.1.使用不带恢复目录的RMAN

设置目标数据库的ORACLE_SID,执行:

%rmannocatalog
RMAN>connecttarget
RMAN>connecttargetinternal/@his

4.2.使用带恢复目录的RMAN

%rmanrman_tsrman/rman@rman
RMAN>connecttarget
%rmanrman_tsrman/rman@rmantargetinternal/@his

4.3.使用RMAN

一旦连接到目标数据库,可以通过交互界面或者事先存储的脚本执行指定RMAN命令,下面是一个使用RMAN交互界面的实例:

RMAN>resynccatalog;
RMAN-03022:正在编译命令:resync
RMAN-03023:正在执行命令:resync
RMAN-08002:正在启动全部恢复目录的resync
RMAN-08004:完成全部resync

使用脚本的实例:

RMAN>executescriptalloc_1_disk;

创建或者替代存储的脚本:

RMAN>replacescriptalloc_1_disk{
2>allocatechanneld1typedisk;
3>}

5.注册或者注销目标数据库

5.1.注册目标数据库

数据库状态:

恢复目录状态:打开

目标数据库:加载或者打开

目标数据库在第一次使用RMAN之前必须在恢复目录中注册:

第一步,启动恢复管理器,并且连接目标数据库:

C:>rmantargetinternal/oracle@hiscatalogrman/rman@rman

恢复管理器:版本8.1.6.0.0-Production

RMAN-06005:连接到目标数据库:HIS(DBID=3021445076)
RMAN-06008:连接到恢复目录数据库

第二步,注册数据库:

RMAN>registerdatabase;
RMAN-03022:正在编译命令:register
RMAN-03023:正在执行命令:register
RMAN-08006:注册在恢复目录中的数据库
RMAN-03023:正在执行命令:fullresync
RMAN-08002:正在启动全部恢复目录的resync
RMAN-08004:完成全部resync

5.2.注销目标数据库

RMAN提供了一个注销工具,叫DBMS_RCVCAT工具包,请注意一旦注销了该目标数据库,就不可以使用恢复目录中含有的备份集来恢复数据库了。

为了能注销数据库,需要获得数据库的标识码(DB_ID)和数据库键值(DB_KEY)。其中连接目标数据库时将会获得DB_ID。

C:>rmantargetinternal/oracle@hiscatalogrman/rman@rman

恢复管理器:版本8.1.6.0.0-Production

RMAN-06005:连接到目标数据库:HIS(DBID=3021445076)
RMAN-06008:连接到恢复目录数据库

其中DBID=3021445076,利用DBID=3021445076查询数据库键值码:

连接到目标数据库,查询db表:

SQL>select*fromdb;

DB_KEYDB_IDCURR_DBINC_KEY
----------------------------------
130214450762

获得DB_KEY=1,这样,该目标数据库DB_KEY=1,DBID=3021445076,利用两个值使用DBMS_RCVCAT工具包就可以注销数据库:

SQL>executedbms_rcvcat.unregisterdatabase(1,3021445076);
PL/SQL过程已成功完成。

至此,注销数据库操作完成。

[NextPage]

6.操作已有的备份

6.1.加入目录数据库

数据库状态:

恢复目录:打开

目标数据库:加载或者打开

如果存在8.x版本以前创建的备份数据想注册到目标数据库,可以采用如下手工方式加入到恢复目录中,
RMAN>catalogdatafilecopy'/oracle/..../system01.dbf';

使用如下命令显示恢复目录中包含的文件

RMAN>listcopyofdatabase;

6.2.从目录数据库中删除

第一步:查看备份信息:

RMAN>listbackup;

RMAN-03022:正在编译命令:list

备份集列表

关键字Recid标记LV集合标记集合计数完成时间
-----------------------------------------------------------------------
110425013644550501364446206-8月-03

备份段列表

关键字Pc#Cp#状态完成时间段名
----------------------------------------------------------------------
110611AVAILABLE06-8月-03D:ORACLEORA81DATABASE
02EU4DMU_1_1

数据文件包括列表

文件名称LV类型检查点SCN检查点时间
---------------------------------------------------------&

上一页[1][2][3][4][5][6]下一页

正在看的ORACLE教程是:Oracle RMAN快速入门指南。nbsp;-------------
3D:ORACLEORADATAHISUSERS01.DBF0Full16005206-8月-03

备份集的关键字为1104。

第二步:定义delete通道:

RMAN>allocatechannelfordeletetypedisk;

RMAN-03022:正在编译命令:allocate
RMAN-03023:正在执行命令:allocate
RMAN-08030:分配的通道:delete
RMAN-08500:通道delete:sid=19devtype=DISK

第三步:删除backupset备份集

RMAN>changebackupset1104delete;

RMAN-03022:正在编译命令:change
RMAN-08073:已删除备份段
RMAN-08517:备份段handle=D:ORACLEORA81DATABASE2EU4DMU_1_1recid=2stamp=50
1364447
RMAN-03023:正在执行命令:partialresync
RMAN-08003:启动部分恢复目录的resync
RMAN-08005:完成部分resync

注意:部分执行删除备份集、备份片或者维护恢复目录的命令,需要先指定通道,如:

RMAN>allocatechannelfordeletetypedisk;
或者RMAN>allocatechannelformaintenancetypedisk;

7.在非归档模式下备份

数据库状态:

恢复目录:打开

目标数据库:例程启动或者数据库加载

恢复目录数据库需要打开,目标数据库必须启动(或者加载)。因为目标数据库不在归档模式下,所以当进行备份恢复操作的时候数据库无法打开。不可以将表空间置于热备份模式上进行等同于文件系统级的拷贝,如果在非归档模式,数据库打开的状态下不能进行数据文件的备份。

7.1.数据库完全备份

RMAN>run{
2>#backupthecompletedatabasetodisk
3>allocatechanneldev1typedisk;
4>backup
5>full
6>tagfull_db_backup
7>format'/oracle/backups/db_t%t_s%s_p%p'
8>(database);
9>releasechanneldev1;
10>}
行#

2:表明该行为注释行(#是注释符)

3&9:Seesection15-Channels通道定义
5:Fullbackup(defaultiffullorincrementalnotspecified)完全备份模式(缺省模式)
6:Meaningfulstring(<=30chars)(备份集标识,<=30个字符)
7:Filenametouseforbackuppieces,includingsubstitutionvariables.备份片使用的文件名,可以包含代替变量。
8:Indicatesallfilesincludingcontrolfilesaretobebackedup表明备份所有数据文件包括控制文件

通过下面的命令显示恢复目录中记载的备份集信息:

RMAN>listbackupsetofdatabase;

7.2.备份表空间

RMAN>run{
2>allocatechanneldev1typedisk;
3>backup
4>tagtbs_users_read_only
5>format'/oracle/backups/tbs_users_t%t_s%s'
6>(tablespaceusers)
7>}

使用下列命令来显示恢复目录中该表的备份信息:

RMAN>listbackupsetoftablespaceusers;

假设USERS表空间在备份后被置为READONLY表空间,以后的全库备份就可以不用备份该表空间,为了达到这个目的,可以在以后的备份中指定'skipreadonly'。

注意,目标数据库不需要一定打开,只要加载就可以,因为表空间的信息存储在控制文件中。

7.3.备份单独数据文件

RMAN>run{
2>allocatechanneldev1type'SBT_TAPE';
3>backup
4>format'%d_%u'
5>(datafile'/oracle/dbs/sysbigdb.dbf');
6>releasechanneldev1;
7>}
行#

2:使用MML(mediamanagerlayer)分配磁带驱动器,必须指定类型为SBT_TAPE;

注意因为没有指定标识,所以标识为空;

使用下面的命令显示恢复目录中备份的表空间:

RMAN>listbackupsetofdatafile1;

7.4.备份数据文件

RMAN>run{
2>allocatechanneldev1type'SBT_TAPE';
3>copydatafile'/oracle/dbs/temp.dbf'to'/oracle/backups/temp.dbf';
4>releasechanneldev1;
5>}

使用下面的命令显示恢复目录中的文件拷贝:

RMAN>listcopyofdatafile'/oracle/dbs/temp.dbf';

拷贝数据文件和备份数据文件是不一样的,数据文件拷贝是一个该文件的镜像。文件的备份产生一个备份集。

7.5.备份控制文件

RMAN>run{
2>

上一页[1][2][3][4][5][6]下一页

正在看的ORACLE教程是:Oracle RMAN快速入门指南。allocatechanneldev1type'SBT_TAPE';
3>backup
4>format'cf_t%t_s%s_p%p'
5>tagcf_monday_night
6>(currentcontrolfile);
7>releasechanneldev1;
8>}

注意:数据库完全备份将自动备份控制文件。

[NextPage]

8.归档模式下的备份

数据库状态:

恢复目录:打开

目标数据库:例程启动,数据库加载或者打开

备份操作使用的命令与非归档模式下基本一样。

8.1.Backinguparchivedlogs备份归档日志

下面的脚本备份归档日志:

RMAN>run{
2>allocatechanneldev1typedisk;
3>backup
4>format'/oracle/backups/log_t%t_s%s_p%p'
5>(archivelogall);
6>releasechanneldev1;
7>}

下面的脚本归档日志从#90to100:

RMAN>run{
2>allocatechanneldev1typedisk;
3>backup
4>format'/oracle/backups/log_t%t_s%s_p%p'
5>(archivelogfromlogseq=90untillogseq=100thread1);
6>releasechanneldev1;
7>}

下面的脚本备份在24小时内产生的归档日志,在备份完成后会自动删除归档日志。如果备份失败,归档日志不会被删除。

RMAN>run{
2>allocatechanneldev1typedisk;
3>backup
4>format'/oracle/backups/log_t%t_s%s_p%p'
5>(archivelogfromtime'sysdate-1'alldeleteinput);
6>releasechanneldev1;
7>}

使用下面的命令显示恢复目录中的归档日志:

RMAN>listbackupsetofarchivelogall;

注意:RMAN找到归档日志后会备份指定日志,如果无法找到日志,它也不会返回错误信息。

8.2.Backinguptheonlinelogs备份联机日志

联机日志不能用RMAN来备份,必须先将其归档。

为了实现这点,必须在RMAN中执行如下SQL语句:

RMAN>run{
2>allocatechanneldev1typedisk;
3>sql"altersystemarchivelogcurrent";
4>backup
5>format'/oracle/backups/log_t%t_s%s_p%p'
6>(archivelogfromtime'sysdate-1'alldeleteinput);
7>releasechanneldev1;
8>}

上面的脚本可以在执行完一个完整的联机数据库备份后执行,确保所有的重做日志可以将数据库恢复到一个一致性的状态。

注意:不可以标识归档日志备份集。

9.增量备份

N级别增量备份备份从最近的N级别或者更小级别以来的所有更改过的数据块内容。增量备份分为两种,一种是累积增量备份,一种是非累积增量备份。

累积增量备份包括自最后一次在更低级别进行备份以来所有改动过的数据块。

非累积增量备份包括自前一次在同级或者更低级别进行备份以来改动过的数据块。

9.1.Level0--增量备份策略的基础

Level0是增量备份策略的基础--thebasisoftheincrementalbackupstrategy
RMAN>run{
2>allocatechanneldev1typedisk;
3>backup
4>incrementallevel0
5>filesperset4
6>format'/oracle/backups/sunday_level0_%t'
7>(database);
8>releasechanneldev1;
9>}
Line#
4:0级备份
5:定义每个backupset的最大文件数

使用LIST语句查看,数据库备份集的列表显示中,'type'将显示'Incremental','LV'列将显示'0'。

9.2.使用增量备份的案例

一个典型的增量备份案例如下:

星期天晚上-level0backupperformed

星期一晚上-level2backupperformed

星期二晚上-level2backupperformed

星期三晚上-level1backupperformed

星期四晚上-level2backupperformed

星期五晚上-level2backupperformed

星期六晚上-level2backupperformed

星期天晚上-l

上一页[1][2][3][4][5][6]下一页

正在看的ORACLE教程是:Oracle RMAN快速入门指南。evel0backupperformed

10.恢复

恢复案例如下:

10.1.Databaseopen,datafiledeleted数据库打开时,文件被删除

数据文件在数据库打开时被删除。有两种方法可以对打开的数据库进行恢复:还原数据文件或者表空间。下面两个实例显示了该方法:

(a)Datafilerecovery数据文件恢复

RMAN>run{
2>allocatechanneldev1typedisk;
3>sql"altertablespaceusersofflineimmediate";
4>restoredatafile4;
5>recoverdatafile4;
6>sql"altertablespaceusersonline";
7>releasechanneldev1;
8>}

(b)Tablespacerecovery表空间恢复

RMAN>run{
2>allocatechanneldev1typedisk;
3>sql"altertablespaceusersofflineimmediate";
4>restoretablespaceusers;
5>recovertablespaceusers;
6>sql"altertablespaceusersonline";
7>releasechanneldev1;
8>}

注意:如果还原系统表空间文件,数据库必须关闭,因为系统表空间不可以脱机。

10.2.Completerestore(lostonlineredo)androllforward-databaseclosed完全还原(丢失联机日志)并且前滚-数据库关闭

RMAN>run{
2>allocatechanneldev1typedisk;
3>setuntillogseq=105thread=1;
4>restorecontrolfileto'/oracle/dbs/ctrltargdb.ctl';
5>replicatecontrolfilefrom'/oracle/dbs/ctrltargdb.ctl';
6>restoredatabase;
7>sql"alterdatabasemount";
8>recoverdatabase;
9>sql"alterdatabaseopenresetlogs";
10>releasechanneldev1;
11>}

Notes:

'setuntil'命令指明恢复到指定的日志文件。这一点在数据文件恢复时很重要,否则RMAN将试图恢复最近的数据文件,该数据文件可能在指定的日志以前。

'replicatecontrolfile'复制还原的控制文件到INIT.ORA指定的控制文件。

如果数据库使用WITHRESETLOGS打开,则需要使用RESETDATABASE命令注册改变后的数据库。在使用RESETLOGS命令打开数据库后强烈建议做一个完全的数据库备份。

10.3.还原数据文件的子集,完全恢复

RMAN>run{
2>allocatechanneldev1typedisk;
3>sql"alterdatabasemount";
4>restoredatafile2;
5>restoredatafile3;
6>restorearchivelogall;
7>recoverdatabase;
8>sql"alterdatabaseopen";
9>releasechanneldev1;
10>}

5

[NextPage]

11.脚本

创建或者取代脚本:

RMAN>createscriptalloc_disk{
2>#Allocatesonedisk
3>allocatechanneldev1typedisk;
4>setlimitchanneldev1kbytes2097150maxopenfiles32readrate200;
5>}

RMAN>replacescriptrel_disk{
2>#releasesdisk
3>releasechanneldev1;
5>}

RMAN>replacescriptbackup_db_full{
2>#Performsacompletebackup
3>executescriptalloc_disk;
4>backup
5>.....
6>executescriptrel_disk;
7>}

前两个脚本分别用来分配和回收通道。

alloc_disk脚本还额外指定了备份片的最大兆字节数,备份时可以同时打开的输入文件的最大数目,以及每秒钟读每个输入文件的数据缓冲区的最大数目。

第三个脚本调用先前存储的两个脚本进行数据库备份。

运行存储脚本的示范:

RMAN>run{
2>executescri

上一页[1][2][3][4][5][6]下一页

正在看的ORACLE教程是:Oracle RMAN快速入门指南。ptbackup_db_full;
3>}

注意:存储的脚本必须在{....execute