前言:
这篇文章主要介绍RMAN的常用方法,其中包含了作者一些自己的经验,里面的实验也基本全在WIN 2K和ORACLE 8.1.6环境下测试成功(因为这个环境比较容易实现)。
本文借鉴了网上一些高手的相关文章,希望大侠们不要见怪,此处一并谢过。
这篇文章主要是在北京出差期间写的,回到家后整理修改了一下,时间比较仓促,同时因为篇幅有限,一些技术细节不能一一覆盖了,只希望能够帮助新手入门的作用,想真正熟练掌握RMAN,必须经过较长时间的实践磨练才可以,尤其需要在工程中获得宝贵的故障解决经验。
1.什么是RMAN?
RMAN可以用来备份和还原数据库文件、归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。
注意:RMAN不能用于备份初始化参数文件和口令文件。
RMAN启动数据库上的Oracle服务器进程来进行备份或还原。备份、还原、恢复是由这些进程驱动的。
RMAN可以由OEM的Backup Manager GUI来控制,但在本文章里不作重点讨论。
2. Terminology 专业词汇解释
2.1. Backup sets 备份集合
备份集合有下面的特性:
包括一个或多个数据文件或归档日志
以oracle专有的格式保存
有一个完全的所有的备份片集合构成
构成一个完全备份或增量备份
2.2. Backup pieces 备份片
一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大小是有限制的;如果没有大小的限制, 备份集就只由一个备份片构成。备份片的大小不能大于使用的文件系统所支持的文件长度的最大值。
2.3. Image copies 镜像备份
镜像备份是独立文件(数据文件、归档日志、控制文件)的备份。它很类似操作系统级的文件备份。它不是备份集或 备份片,也没有被压缩。
2.4. Full backup sets 全备份集合
全备份是一个或多个数据文件中使用过的数据块的的备份。没有使用过的数据块是不被备份的,也就是说,oracle 进行备份集合的压缩。
2.5. Incremental backup sets 增量备份集合
增量备份是指备份一个或多个数据文件的自从上一次同一级别的或更低级别的备份以来被修改过的数据块。 与完全备份相同,增量备份也进行压缩。
2.6. File multiplexing
不同的多个数据文件的数据块可以混合备份在一个备份集中。
2.7. Recovery catalog resyncing 恢复目录同步
使用恢复管理器执行backup、copy、restore或者switch命令时,恢复目录自动进行更新,但是有关日志与归档日志信息没有自动记入恢复目录。需要进行目录同步。使用resync catalog命令进行同步。
RMAN>resync catalog;
RMAN-03022:正在编译命令:resync
RMAN-03023:正在执行命令:resync
RMAN-08002:正在启动全部恢复目录的 resync
RMAN-08004:完成全部 resync
3. 恢复目录
3.1.恢复目录的概念
恢复目录是由RMAN使用、维护的用来放置备份信息的仓库。RMAN利用恢复目录记载的信息去判断如何执行需要的备份恢复操作。
恢复目录可以存在于ORACLE数据库的计划中。
虽然恢复目录可以用来备份多个数据库,建议为恢复目录数据库创建一个单独的数据库。
恢复目录数据库不能使用恢复目录备份自身。
3.2.建立恢复目录
第一步,在目录数据库中创建恢复目录所用表空间:
SQL> create tablespace rman_ts datafile 'd:\oracle\oradata\rman\rman_ts.dbf' size 20M;
表空间已创建。
第二步,在目录数据库中创建RMAN 用户并授权:
SQL> create user rman identified by rman default tablespace rman_ts temporary tablespace temp quota unlimited on rman_ts;
用户已创建。
SQL> grant recovery_catalog_owner to rman ;
授权成功。
SQL> grant connect, resource to rman ;
授权成功。
第三步,在目录数据库中创建恢复目录
C:>rman catalog rman/rman
恢复管理器:版本8.1.6.0.0 - Production
RMAN-06008:连接到恢复目录数据库
RMAN-06428:未安装恢复目录
RMAN>create catalog tablespace rman_ts;
RMAN-06431:恢复目录已创建
注意:虽然使用RMAN不一定必需恢复目录,但是推荐使用。因为恢复目录记载的信息大部分可以通过控制文件来记载,RMAN在恢复数据库时使用这些信息。不使用恢复目录将会对备份恢复操作有限制。
3.3.使用恢复目录的优势
可以存储脚本;
记载较长时间的备份恢复操作;
4. 启动RMAN
RMAN为交互式命令行处理界面,也可以从企业管理器中运行。
为了使用下面的实例,先检查环境符合:
the target database is called "his" and has the same TNS alias
user rman has been granted "recovery_catalog_owner "privileges
目标数据库的连接用户为internal帐号,或者以其他SYSDBA类型帐号连接
the recovery catalog database is called "rman" and has the same TNS alias
the schema containing the recovery catalog is "rman" (same password)
在使用RMAN前,设置NLS_DATE_FORMAT 和NLS_LANG环境变量,很多RMAN LIST命令的输出结果是与日期时间相关的,这点在用户希望执行以时间为基准的恢复工作也很重要。
下例是环境变量的示范:
NLS_LANG= SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS
为了保证RMAN使用时能连接恢复目录,恢复目录数据库必须打开,目标数据库至少要STARTED(unmount),否则RMAN会返回一个错误,目标数据库必须置于归档模式下。
4.1.使用不带恢复目录的RMAN
设置目标数据库的 ORACLE_SID ,执行:
% rman nocatalog
RMAN> connect target
RMAN> connect target internal/
1<password>@his
2
34.2.使用带恢复目录的RMAN
4
5% rman rman_ts rman/rman@rman
6RMAN> connect target
7% rman rman_ts rman/rman@rman target internal/<password>@his
8
94.3.使用RMAN
10
11一旦连接到目标数据库,可以通过交互界面或者事先存储的脚本执行指定RMAN命令, 下面是一个使用RMAN交互界面的实例:
12
13RMAN> resync catalog;
14RMAN-03022:正在编译命令:resync
15RMAN-03023:正在执行命令:resync
16RMAN-08002:正在启动全部恢复目录的 resync
17RMAN-08004:完成全部 resync
18
19使用脚本的实例:
20
21RMAN> execute script alloc_1_disk;
22
23创建或者替代存储的脚本:
24
25RMAN> replace script alloc_1_disk {
262> allocate channel d1 type disk;
273> }
28
29**5.注册或者注销目标数据库**
30
315.1.注册目标数据库
32
33数据库状态:
34
35恢复目录状态:打开
36
37目标数据库:加载或者打开
38
39目标数据库在第一次使用RMAN之前必须在恢复目录中注册:
40
41第一步,启动恢复管理器,并且连接目标数据库:
42
43C:\>rman target internal/oracle@his catalog rman/rman@rman
44
45恢复管理器:版本8.1.6.0.0 - Production
46
47RMAN-06005:连接到目标数据库:HIS (DBID=3021445076)
48RMAN-06008:连接到恢复目录数据库
49
50第二步,注册数据库:
51
52RMAN> register database;
53RMAN-03022:正在编译命令:register
54RMAN-03023:正在执行命令:register
55RMAN-08006:注册在恢复目录中的数据库
56RMAN-03023:正在执行命令:full resync
57RMAN-08002:正在启动全部恢复目录的resync
58RMAN-08004:完成全部resync
59
605.2.注销目标数据库
61
62RMAN提供了一个注销工具,叫DBMS_RCVCAT工具包,请注意一旦注销了该目标数据库,就不可以使用恢复目录中含有的备份集来恢复数据库了。
63
64为了能注销数据库,需要获得数据库的标识码(DB_ID)和数据库键值(DB_KEY)。其中连接目标数据库时将会获得DB_ID。
65
66C:\>rman target internal/oracle@his catalog rman/rman@rman
67
68恢复管理器:版本8.1.6.0.0 - Production
69
70RMAN-06005:连接到目标数据库:HIS (DBID=3021445076)
71RMAN-06008:连接到恢复目录数据库
72
73其中DBID=3021445076,利用DBID=3021445076查询数据库键值码:
74
75连接到目标数据库,查询db表:
76
77SQL> select * from db;
78
79DB_KEY DB_ID CURR_DBINC_KEY
80\---------- ---------- --------------
811 3021445076 2
82
83获得DB_KEY=1,这样,该目标数据库DB_KEY=1,DBID=3021445076,利用两个值使用DBMS_RCVCAT工具包就可以注销数据库:
84
85SQL> execute dbms_rcvcat.unregisterdatabase(1,3021445076);
86PL/SQL 过程已成功完成。
87
88至此,注销数据库操作完成。
89
90**6.操作已有的备份**
91
926.1.加入目录数据库
93
94数据库状态:
95
96恢复目录:打开
97
98目标数据库:加载或者打开
99
100如果存在8.x版本以前创建的备份数据想注册到目标数据库,可以采用如下手工方式加入到恢复目录中,
101RMAN> catalog datafilecopy '/oracle/ .... /system01.dbf';
102
103使用如下命令显示恢复目录中包含的文件
104
105RMAN> list copy of database;
106
1076.2.从目录数据库中删除
108
109第一步:查看备份信息:
110
111RMAN>list backup;
112
113RMAN-03022:正在编译命令:list
114
115备份集列表
116
117关键字 Recid 标记 LV 集合标记 集合计数 完成时间
118\------- ---------- ---------- -- ---------- ---------- ----------------------
1191104 2 501364455 0 501364446 2 06-8月 -03
120
121备份段列表
122
123关键字 Pc# Cp# 状态 完成时间 段名
124\------- --- --- ----------- ---------------------- ------------------------
1251106 1 1 AVAILABLE 06-8月 -03 D:\ORACLE\ORA81\DATABASE\
12602EU4DMU_1_1
127
128数据文件包括列表
129
130文件 名称 LV 类型 检查点SCN 检查点时间
131\---- ------------------------------------- -- ---- ---------- -------------
1323 D:\ORACLE\ORADATA\HIS\USERS01.DBF 0 Full 160052 06-8月 -03
133
134备份集的关键字为1104。
135
136第二步:定义delete通道:
137
138RMAN>allocate channel for delete type disk;
139
140RMAN-03022:正在编译命令:allocate
141RMAN-03023:正在执行命令:allocate
142RMAN-08030:分配的通道:delete
143RMAN-08500:通道 delete:sid=19 devtype=DISK
144
145第三步:删除backupset备份集
146
147RMAN>change backupset 1104 delete;
148
149RMAN-03022:正在编译命令:change
150RMAN-08073:已删除备份段
151RMAN-08517:备份段 handle=D:\ORACLE\ORA81\DATABASEEU4DMU_1_1 recid=2 stamp=50
1521364447
153RMAN-03023:正在执行命令:partial resync
154RMAN-08003:启动部分恢复目录的 resync
155RMAN-08005:完成部分 resync
156
157注意:部分执行删除备份集、备份片或者维护恢复目录的命令,需要先指定通道,如:
158
159RMAN>allocate channel for delete type disk;
160或者RMAN>allocate channel for maintenance type disk;
161
162**7.在非归档模式下备份**
163
164数据库状态:
165
166恢复目录: 打开
167
168目标数据库:例程启动或者数据库加载
169
170恢复目录数据库需要打开,目标数据库必须启动(或者加载)。因为目标数据库不在归档模式下,所以当进行备份恢复操作的时候数据库无法打开。不可以将表空间置于热备份模式上进行等同于文件系统级的拷贝,如果在非归档模式,数据库打开的状态下不能进行数据文件的备份。
171
1727.1.数据库完全备份
173
174RMAN> run {
1752> # backup the complete database to disk
1763> allocate channel dev1 type disk;
1774> backup
1785> full
1796> tag full_db_backup
1807> format '/oracle/backups/db_t%t_s%s_p%p'
1818> (database);
1829> release channel dev1;
18310> }
184行#
185
1862: 表明该行为注释行(#是注释符)
187
1883&9: See section 15 - Channels通道定义
1895: Full backup (default if full or incremental not specified)完全备份模式(缺省模式)
1906: Meaningful string (<=30 chars)(备份集标识,<=30个字符)
1917: Filename to use for backup pieces, including substitution variables. 备份片使用的文件名,可以包含代替变量。
1928: Indicates all files including controlfiles are to be backed up表明备份所有数据文件包括控制文件
193
194通过下面的命令显示恢复目录中记载的备份集信息:
195
196RMAN> list backupset of database;
197
1987.2.备份表空间
199
200RMAN> run {
2012> allocate channel dev1 type disk;
2023> backup
2034> tag tbs_users_read_only
2045> format '/oracle/backups/tbs_users_t%t_s%s'
2056> (tablespace users)
2067> }
207
208使用下列命令来显示恢复目录中该表的备份信息:
209
210RMAN> list backupset of tablespace users;
211
212假设USERS表空间在备份后被置为READ ONLY表空间,以后的全库备份就可以不用备份该表空间,为了达到这个目的,可以在以后的备份中指定'skip readonly'。
213
214注意,目标数据库不需要一定打开,只要加载就可以,因为表空间的信息存储在控制文件中。
215
2167.3.备份单独数据文件
217
218RMAN> run {
2192> allocate channel dev1 type 'SBT_TAPE';
2203> backup
2214> format '%d_%u'
2225> (datafile '/oracle/dbs/sysbigdb.dbf');
2236> release channel dev1;
2247> }
225行#
226
2272: 使用MML(media manager layer)分配磁带驱动器,必须指定类型为SBT_TAPE;
228
229注意因为没有指定标识,所以标识为空;
230
231使用下面的命令显示恢复目录中备份的表空间:
232
233RMAN> list backupset of datafile 1;
234
2357.4.备份数据文件
236
237RMAN> run {
2382> allocate channel dev1 type 'SBT_TAPE';
2393> copy datafile '/oracle/dbs/temp.dbf' to '/oracle/backups/temp.dbf';
2404> release channel dev1;
2415> }
242
243使用下面的命令显示恢复目录中的文件拷贝:
244
245RMAN> list copy of datafile '/oracle/dbs/temp.dbf';
246
247拷贝数据文件和备份数据文件是不一样的,数据文件拷贝是一个该文件的镜像。文件的备份产生一个备份集。
248
2497.5.备份控制文件
250
251RMAN> run {
2522> allocate channel dev1 type 'SBT_TAPE';
2533> backup
2544> format 'cf_t%t_s%s_p%p'
2555> tag cf_monday_night
2566> (current controlfile);
2577> release channel dev1;
2588> }
259
260注意:数据库完全备份将自动备份控制文件。
261
262**8.归档模式下的备份**
263
264数据库状态:
265
266恢复目录:打开
267
268目标数据库:例程启动,数据库加载或者打开
269
270备份操作使用的命令与非归档模式下基本一样。
271
2728.1. Backing up archived logs 备份归档日志
273
274下面的脚本备份归档日志:
275
276RMAN> run {
2772> allocate channel dev1 type disk;
2783> backup
2794> format '/oracle/backups/log_t%t_s%s_p%p'
2805> (archivelog all);
2816> release channel dev1;
2827> }
283
284下面的脚本归档日志从# 90 to 100:
285
286RMAN> run {
2872> allocate channel dev1 type disk;
2883> backup
2894> format '/oracle/backups/log_t%t_s%s_p%p'
2905> (archivelog from logseq=90 until logseq=100 thread 1);
2916> release channel dev1;
2927> }
293
294下面的脚本备份在24小时内产生的归档日志,在备份完成后会自动删除归档日志。如果备份失败,归档日志不会被删除。
295
296RMAN> run {
2972> allocate channel dev1 type disk;
2983> backup
2994> format '/oracle/backups/log_t%t_s%s_p%p'
3005> (archivelog from time 'sysdate-1' all delete input);
3016> release channel dev1;
3027> }
303
304使用下面的命令显示恢复目录中的归档日志:
305
306RMAN> list backupset of archivelog all;
307
308注意:RMAN找到归档日志后会备份指定日志,如果无法找到日志,它也不会返回错误信息。
309
3108.2. Backing up the online logs 备份联机日志
311
312联机日志不能用RMAN来备份,必须先将其归档。
313
314为了实现这点,必须在RMAN中执行如下SQL语句:
315
316RMAN> run {
3172> allocate channel dev1 type disk;
3183> sql "alter system archive log current";
3194> backup
3205> format '/oracle/backups/log_t%t_s%s_p%p'
3216> (archivelog from time 'sysdate-1' all delete input);
3227> release channel dev1;
3238> }
324
325上面的脚本可以在执行完一个完整的联机数据库备份后执行,确保所有的重做日志可以将数据库恢复到一个一致性的状态。
326
327注意:不可以标识归档日志备份集。
328
329**9\. 增量备份**
330
331N级别增量备份备份从最近的N级别或者更小级别以来的所有更改过的数据块内容。增量备份分为两种,一种是累积增量备份,一种是非累积增量备份。
332
333累积增量备份包括自最后一次在更低级别进行备份以来所有改动过的数据块。
334
335非累积增量备份包括自前一次在同级或者更低级别进行备份以来改动过的数据块。
336
3379.1. Level 0--增量备份策略的基础
338
339Level 0 是增量备份策略的基础--the basis of the incremental backup strategy
340RMAN> run {
3412> allocate channel dev1 type disk;
3423> backup
3434> incremental level 0
3445> filesperset 4
3456> format '/oracle/backups/sunday_level0_%t'
3467> (database);
3478> release channel dev1;
3489> }
349Line#
3504: 0级备份
3515: 定义每个backupset 的最大文件数
352
353使用LIST语句查看,数据库备份集的列表显示中, 'type' 将显示 'Incremental','LV'列将显示'0' 。
354
3559.2. 使用增量备份的案例
356
357一个典型的增量备份案例如下:
358
359星期天晚上 - level 0 backup performed
360
361星期一晚上 - level 2 backup performed
362
363星期二晚上 - level 2 backup performed
364
365星期三晚上 - level 1 backup performed
366
367星期四晚上 - level 2 backup performed
368
369星期五晚上 - level 2 backup performed
370
371星期六晚上 - level 2 backup performed
372
373星期天晚上 - level 0 backup performed
374
375**10\. 恢复**
376
377恢复案例如下:
378
37910.1. Database open,datafile deleted 数据库打开时,文件被删除
380
381数据文件在数据库打开时被删除。有两种方法可以对打开的数据库进行恢复:还原数据文件或者表空间。下面两个实例显示了该方法:
382
383(a) Datafile recovery 数据文件恢复
384
385RMAN> run {
3862> allocate channel dev1 type disk;
3873> sql "alter tablespace users offline immediate";
3884> restore datafile 4;
3895> recover datafile 4;
3906> sql "alter tablespace users online";
3917> release channel dev1;
3928> }
393
394(b) Tablespace recovery 表空间恢复
395
396RMAN> run {
3972> allocate channel dev1 type disk;
3983> sql "alter tablespace users offline immediate";
3994> restore tablespace users;
4005> recover tablespace users;
4016> sql "alter tablespace users online";
4027> release channel dev1;
4038> }
404
405注意:如果还原系统表空间文件,数据库必须关闭,因为系统表空间不可以脱机。
406
40710.2. Complete restore (lost online redo) and rollforward - database closed 完全还原(丢失联机日志)并且前滚 - 数据库关闭
408
409RMAN> run {
4102> allocate channel dev1 type disk;
4113> set until logseq=105 thread=1;
4124> restore controlfile to '/oracle/dbs/ctrltargdb.ctl';
4135> replicate controlfile from '/oracle/dbs/ctrltargdb.ctl';
4146> restore database;
4157> sql "alter database mount";
4168> recover database;
4179> sql "alter database open resetlogs";
41810> release channel dev1;
41911> }
420
421Notes:
422
423'set until' 命令指明恢复到指定的日志文件。这一点在数据文件恢复时很重要,否则RMAN将试图恢复最近的数据文件,该数据文件可能在指定的日志以前。
424
425'replicate controlfile' 复制还原的控制文件到INIT.ORA指定的控制文件。
426
427如果数据库使用WITH RESETLOGS打开,则需要使用RESET DATABASE命令注册改变后的数据库。在使用RESETLOGS命令打开数据库后强烈建议做一个完全的数据库备份。
428
42910.3. 还原数据文件的子集,完全恢复
430
431RMAN> run {
4322> allocate channel dev1 type disk;
4333> sql "alter database mount";
4344> restore datafile 2;
4355> restore datafile 3;
4366> restore archivelog all;
4377> recover database;
4388> sql "alter database open";
4399> release channel dev1;
44010> }
441
442**11\. 脚本**
443
444创建或者取代脚本:
445
446RMAN> create script alloc_disk {
4472> # Allocates one disk
4483> allocate channel dev1 type disk;
4494> setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200;
4505> }
451
452RMAN> replace script rel_disk {
4532> # releases disk
4543> release channel dev1;
4555> }
456
457RMAN> replace script backup_db_full {
4582> # Performs a complete backup
4593> execute script alloc_disk;
4604> backup
4615> .....<backup commands="" here="">
4626> execute script rel_disk;
4637> }
464
465前两个脚本分别用来分配和回收通道。
466
467alloc_disk 脚本还额外指定了备份片的最大兆字节数,备份时可以同时打开的输入文件的最大数目,以及每秒钟读每个输入文件的数据缓冲区的最大数目。
468
469第三个脚本调用先前存储的两个脚本进行数据库备份。
470
471运行存储脚本的示范:
472
473RMAN> run {
4742> execute script backup_db_full;
4753> }
476
477注意:存储的脚本必须在{ .... execute <script></script></backup></password></password>