分类: Oracle
2008-09-05 07:58:47
接下来,决定恢复到哪个对应物
比如,决定恢复到上面的 4437,
方法:在 NOMOUNT 状态下用下面的命令:
RMAN> reset database to incarnation 4437; 下面是具体的恢复步骤的一个演示(输出略去): RMAN> shutdown immediate;
RMAN> startup nomount;
RMAN> reset database to incarnation 4437; RMAN> restore controlfile;
RMAN> alter database mount;
RMAN> restore database until scn 3794934;
RMAN> recover database until scn 3794934;
RMAN> alter database open resetlogs;
上面的例子中,我们最大可恢复到的 SCN 就是 3794934,因为 4437 的下一个对
应物的重置 SCN 是 3794935。
(2) 不使用恢复目录的情况
不使用恢复目录的情况下,要恢复前一个对应物就必须要能恢复到前一对应物的控 制文件。不使用恢复目录,我们就无法使用 RESET DATABASE TO incarnation_num 命 令。
首先看看有哪些对应物:
RMAN> list incarnation;
数据库 Incarnations 列表
DB 关键字 Inc 关键字 DB 名 DB ID CUR 重置 SCN 重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 1 MING 2600315304 NO 3501920 20-8 月 -06
2 |
2 |
MING |
2600315304 |
NO |
3785052 |
29-8 月 |
-06 |
3 |
3 |
MING |
2600315304 |
NO |
3794049 |
29-8 月 |
-06 |
4 |
4 |
MING |
2600315304 |
NO |
3794728 |
29-8 月 |
-06 |
5 |
5 |
MING |
2600315304 |
NO |
3794935 |
29-8 月 |
-06 |
6 6 MING 2600315304 YES 3976301 03-9 月 -06
假设我们要恢复到 5,6之间,那么就要看看有没有控制文件的备份的 SCN 在 3794935
到 3976301。我们使用下面的命令:
RMAN> LIST BACKUP OF CONTROLFILE BY FILE;
控制文件备份列表
===========================
CF Ckp SCN Ckp 时间 BS Key S 段数 副本数 标记
---------- ---------- ------- - ------- ------- ---
3976095 |
03-9 月 |
-06 34 |
A 2 |
1 |
TAG20060903T170136 |
3959239 |
03-9 月 |
-06 30 |
A 1 |
1 |
|
3959170 |
03-9 月 |
-06 29 |
A 1 |
1 |
|
3958983 |
03-9 月 |
-06 28 |
A 1 |
1 |
|
3958937 |
03-9 月 |
-06 27 |
A 1 |
1 |
|
3816575 |
30-8 月 |
-06 11 |
A 2 |
1 |
TAG20060830T064447 |
可以看出,上面的列表中,控制文件都是可以用的。接下来找到一个具体的含有控制文
件的备份:
RMAN> LIST BACKUP OF CONTROLFILE;
备份集列表
===================
……
段名:E:\TEST\C-2600315304-20060830-07
控制文件包括: Ckp SCN: 3818213 Ckp 时间:30-8 月 -06
……
假 设 我 们 使 用 E:\TEST\C-2600315304-20060830-07 ,那 么 接 下 来 我 们 需 要 用
DBMS_BACKUP_RESTORE 包来从这个文件中恢复控制文件。(在 SQLPLUS 中运行)
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP NOMOUNT;
SQL>DECLARE
DEVTYPE VARCHAR2(256);
DONE BOOLEAN;
BEGIN
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL01.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D
ONE=>done);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL02.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D
ONE=>done);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL03.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D
ONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
/
SQL>ALTER DATABASE MOUNT;
重新联到 RMAN 后 再来运行一下 LIST INCARNATION;
$ RMAN TARGET /@MING NOCATALOG; RMAN> LIST INCARNATION;
数据库 Incarnations 列表
DB 关键字 Inc 关键字 DB 名 DB ID CUR 重置 SCN
重置时间
------- ------- -------- ---------------- --- ---------- ----------
1 |
1 |
MING |
2600315304 |
NO |
3501920 |
20-8 月 |
-06 |
2 |
2 |
MING |
2600315304 |
NO |
3785052 |
29-8 月 |
-06 |
3 |
3 |
MING |
2600315304 |
NO |
3794049 |
29-8 月 |
-06 |
4 |
4 |
MING |
2600315304 |
NO |
3794728 |
29-8 月 |
-06 |
5 |
5 |
MING |
2600315304 |
YES |
3794935 |
29-8 月 |
-06 |
可以看出来,我们已经恢复到想要的对应物上了。接下来:
RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;
通过增量备份,RMAN 允许用户只备份上次增量备份操作以来被修改过的数据块。
N 级别增量备份备份从最近的 N 级别或者更小级别以来的所有更改过的数据块内容。0 级备份与全备份的不同就是 0 级备份可以作为其它增量备份的基础备份而全备份是不可 以的。
增量备份的优点: 节约备份时间节省备份磁带或者磁盘空间 降低网络带宽要求
增量备份的缺点: 恢复时间可能要长。
增量备份分为两种,一种是累积增量备份,一种是非累积增量备份。
差异增量备份(Differential Incremental Backup)
差异备份是默认的增量备份类型,备份上一次在同级或者更低级别进行备份以来所
有有变化的数据块。
RMAN>backup incremental level n (incremental) database;
累积增量备份(Cumulative Incremental Backup)
包括上一次低级备份以来所有有变化的数据块。累计增量备份增加了备份的时间, 但是因为恢复的时候,需要从更少的备份集中恢复数据,所以,为了减少恢复的时候,累计增量备份将比差异增量备份更有效。
RMAN>backup incremental level n (cumulative) database;
9i : 不管怎么样增量备份,还是需要比较数据库中全部的数据块,这个过程其实是一个漫长的过程,而且由于增量备份形成多个不同的备份集,使得恢复变的更加不可靠而且速度慢, 所以增量备份在版本 9中仍然是鸡肋,除非是很大型的数据仓库系统,没有必要选择增量备份。
有的增量日志,使得 RMAN 没有必要去比较数据库的每一个数据块,当然,代价就是日志
的 IO与磁盘空间付出。另外,
而完全的减少了恢复时间。
1. 基本备份(0 级备份)
Level 0 是增量备份策略的基础(注意与 Full备份区别)。执行增量备份操作时,首先需要的是基本备份(incremental base backup),增量备份必须有一个基本备份。基本备份的增量 级别是 0,如果没有 0 级备份,那么其它级别的备份会自动转成基本备份。
0 级备份举例:
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> incremental level 0
5> filesperset 4 #定义每个 backupset 的最大文件数
6> format "/oracle/backups/sunday_level0_%t"
7> (database);
8> release channel dev1;
使用 LIST语句查看,数据库备份集的列表显示中, "type" 将显示 "Incremental","LV"
列将显示"0" 。
2. N 级备份
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> incremental level
5> filesperset 4 #定义每个 backupset 的最大文件数
6> format "/oracle/backups/sunday_level0_%t"
7> (database);
8> release channel dev1;
9> }
3. N 级备份的规划
根据业务需求、数据量、恢复所需要的时间等方面考虑,制定合理的备份计划。 例: 一个典型的增量备份案例如下:
星期天晚上 - level 0 backup performed 星期一晚上 - level 2 backup performed 星期二晚上 - level 2 backup performed 星期三晚上 - level 1 backup performed 星期四晚上 - level 2 backup performed 星期五晚上 - level 1 backup performed 星期六晚上 - level 2 backup performed 星期天晚上 - level 0 backup performed
4. 增量备份的恢复
同普通的完全恢复: restore recover
RMAN自动确定和使用需要的备份集。
可以在 RMAN配置中设置备份的优化,如
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
如果优化设置打开,将对备份的数据文件、归档日志或备份集运行一个优化算法。
RMAN备份操作主要是完成以下三个步骤
1、从磁盘上读取数据
2、在内存中处理数据块
3、写入数据到磁盘或磁带
以上的读写操作可以同步或异步的完成,在同步 I/O操作中,一个时间只允许有一个 IO 操作,但是在异步 I/O操作中,一个时间允许有多个 IO操作。因此,备份与恢复的调优主 要集中在以下几个方面:
1、 提高同步或异步 I/O操作能力
在 支 持 异 步 操 作 的 操 作 系 统 上 , 可 以 通 过 设 置 TAPE_AYSNCH_IO,DISK_ASYNCH_IO 和 BACKUP_TYPE_IO_SLAVES 来支持异步操 作,提高写的能力。
2、 提高磁盘读能力
可以在 backup命令后通过设置 DISKRATIO来保证从多个磁盘上读取数据,保证 连续的数据流。
3、 正确设置缓冲区与参数值
设置 LARGE_POOL_SIZE , 使 备 份 可 以 使 用 连 续 的缓冲 池 , 通 过 设 置
DB_FIL_DIRECT_IO_COUNT 可以提高缓冲区的利用。如果使用磁带备份,还可以设 置 BACKUP_TYPE_IO_SLAVES 来提高磁带的写能力。
4、 采用并行备份
开辟多个通道,可以实现并行备份与恢复
这个包是 RMAN 备份与恢复的核心,在调试模式下,RMAN 会输出它调用的每一条命 令:
C:\> rman debug target /@tlgaxz catalog rman/rman@reco trace=debug.
常用命令:
restoreSetDataFile 指示还原操作的开始(但是不会执行实际的还原操作) restoreSetDataFileTo 定义要还原的数据文件和该文件的还原位置 restoreControlFileTo 定义控制文件的还原位置
restoreSpfileTo 定义要还原的 spfile 的位置
restorebackuppiece 执行实际的还原操作,这个函数的一个参数是备份文件名
devicedeallocate 释放 deviceallocate 函数所分配的设备 deviceallocate 分配用于连续 I/O的设备 applySetDataFile 指示增量还原操作的开始 applyDataFileTo 定义数据文件的增量还原位置 appl
restoreArchivelog 定义要还原的归档的重做日志序列和线程
例:使用 dbms_backup_restore 包恢复服务器参数文件:
在一些不常见的情况下,我们可能需要直接使用 dbms_backup_restore 包来恢复 spfile。 当然这个包也可以用来恢复其它数据,是常规办法都没有用的时候的一个利器。这个包可以 在 数 据 库 NOMOUNT 状 态 下 使 用 。 假 设 我 们 有 一 个 自 动 备 份 文 件
C-2600315304-20060829-02,我们需要从这里恢复数据,那么可以通过执行下面的脚本来完
成:
SQL>DECLARE
DEVTYPE VARCHAR2(256);
DONE BOOLEAN;
BEGIN
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorespfileto('d:\spfile.ora');
DBMS_BACKUP_RESTORE.restorebackuppiece('d:\C-2600315304-20060829-00',
DONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
/
『完』