关于rman中set newname的探讨

来源:互联网 发布:网络信号大师破解版 编辑:程序博客网 时间:2024/04/28 16:24

关于rman中set newname的探讨

在做rman恢复测试时,将备份的数据恢复到本地,使用了setnewname命令,由于当时做试验的时候,没有深入研究此命令,只是在restore之后,能够在测试库中将restore出来的数据open就可以了。但如果只是到此为止的话,还是不够的,需要做一些后续的清理工作,才能算做一个完整的本地恢复测试。
   在做本地恢复测试时,有一步(略去了其它步骤)是将数据恢复到一个新的路径下:
利用rman更改数据文件存放路径并restore到新的路径 
run {
set newname for datafile 1 to '/test_ora/new/system01.dbf';
set newname for datafile 2 to '/test_ora/new/rbs01.dbf';
set newname for datafile 3 to '/test_ora/new/users01.dbf';
set newname for datafile 4 to '/test_ora/new/test01.dbf';
set newname for datafile 5 to '/test_ora/new/test201.dbf';
restore database;
}
   做这一步的目的是更改一下数据文件路径,并将数据restore到新路径下。问题就在于做了这一步之后,rman并不认为是将数据restore到新路径下,而是认为将数据文件备份到新路径下(相当于uman备份)。这在oracle的官方文档中可以查到(红色字体):
Sets the default name for all subsequent RESTORE or SWITCH commands that affect the specified datafile. Ifyou do not issue this command before the datafile restoreoperation, then RMAN restores the file to its defaultlocation
After you restore a datafile to a newlocation, then you can run SWITCH to rename the file in the control file to theNEWNAMEIf you do not runSWITCH, then the restored file functions as a datafilecopy and is recorded as such in the repository.
  下面的试验可以证明:
1.将restore到新路径/test_ora/new/下的数据删除
[oracle@single rman_bk]$ rm/test_ora/new/*
2.此时,试图再用rman重新restore到/test_ora/new/下。

[oracle@single rman_bk]$ rmantarget /

Recovery Manager: Release9.2.0.4.0 - Production

Copyright (c) 1995, 2002,Oracle Corporation.  All rightsreserved.

connected to target database:TEST (DBID=1935070339)

RMAN> run {
2> set newname for datafile 1 to '/test_ora/new/system01.dbf';
3> set newname for datafile 2 to '/test_ora/new/rbs01.dbf';
4> set newname for datafile 3 to '/test_ora/new/users01.dbf';
5> set newname for datafile 4 to '/test_ora/new/test01.dbf';
6> set newname for datafile 5 to '/test_ora/new/test201.dbf';
7> restore database;
8> }

executing command: SETNEWNAME
using target database controlfile instead of recoverycatalog

executing command: SETNEWNAME

executing command: SETNEWNAME

executing command: SETNEWNAME

executing command: SETNEWNAME

Starting restore at27-OCT-07

allocated channel:ORA_DISK_1
channel ORA_DISK_1: sid=15 devtype=DISK
RMAN-00571:===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS===============
RMAN-00571:===========================================================
RMAN-03002: failure of restore command at 10/27/2007 19:06:57
ORA-19625: error identifying file /test_ora/new/system01.dbf
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3

 
从错误提示可以看出,rman试图寻找/test_ora/new下的数据文件,但没有找到,于是报错。
3. 为了进一步上述观点,将生产库的数据mv到别处:
[oracle@single rman_bk]$ mv/test_ora/*.dbf /test_ora/new/
此时,用rman恢复生产库数据:

Recovery Manager: Release 9.2.0.4.0 -Production

Copyright (c) 1995, 2002,Oracle Corporation.  All rightsreserved.

connected to target database:TEST (DBID=1935070339)

RMAN> restoredatabase;

Starting restore at27-OCT-07

using target databasecontrolfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=13 devtype=DISK
RMAN-00571:===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS===============
RMAN-00571:===========================================================
RMAN-03002: failure of restore command at 10/27/2007 19:15:26
ORA-19563: datafile copy header validationfailed for file /test_ora/new/system01.dbf

从红色字体部分可以看出,/test_ora/new/system01.dbf被视作一个datafilecopy,rman试图将该文件restore到生产库的数据存放路径下,但没有找到该文件,于是报错。

 

从上述分析可以得出:

   rman在setnewname之后的restore过程,是将现有的数据文件做一份副本,相当于做了一次uman的备份,而该副本的信息是保存在rman知识库中,当再一次进行restore时,rman试图寻找最新的备份(也就是数据文件副本),而该数据文件副本已经被删除,于是报错。

 

4.处理方法:

 将rman知识库中的关于数据文件副本信息删除:

(1)检查数据文件副本状态
RMAN> crosscheck copy;

allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=13 devtype=DISK
validation failed for datafile copy
datafile copy filename=/test_ora/new/system01.dbf recid=41stamp=637095874
validation failed for datafile copy
datafile copy filename=/test_ora/new/rbs01.dbf recid=38stamp=637095858
validation failed for datafile copy
datafile copy filename=/test_ora/new/users01.dbf recid=40stamp=637095868
validation failed for datafile copy
datafile copy filename=/test_ora/new/test01.dbf recid=39stamp=637095859
validation failed for datafile copy
datafile copy filename=/test_ora/new/test201.dbf recid=37stamp=637095855

(2)删除已经expired的数据文件副本信息

RMAN> delete nopromptexpired copy;

released channel:ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=13 devtype=DISK
specification does not match any archive log in the recoverycatalog

List of Datafile Copies
Key    File S Completion Time CkpSCN    CkpTime       Name
------- ---- - --------------- ---------- -------------------
41        X27-OCT-07      460930    27-OCT-07      /test_ora/new/system01.dbf
38        X27-OCT-07      460930    27-OCT-07      /test_ora/new/rbs01.dbf
40        X27-OCT-07      460930    27-OCT-07      /test_ora/new/users01.dbf
39        X27-OCT-07      460930    27-OCT-07      /test_ora/new/test01.dbf
37        X27-OCT-07      482616    27-OCT-07      /test_ora/new/test201.dbf
deleted datafile copy
datafile copy filename=/test_ora/new/system01.dbf recid=41stamp=637095874
deleted datafile copy
datafile copy filename=/test_ora/new/rbs01.dbf recid=38stamp=637095858
deleted datafile copy
datafile copy filename=/test_ora/new/users01.dbf recid=40stamp=637095868
deleted datafile copy
datafile copy filename=/test_ora/new/test01.dbf recid=39stamp=637095859
deleted datafile copy
datafile copy filename=/test_ora/new/test201.dbf recid=37stamp=637095855
Deleted 5 EXPIRED objects

(3).此时,再次进行set newname并restore。

RMAN> run {
2> set newname for datafile 1 to '/test_ora/new/system01.dbf';
3> set newname for datafile 2 to '/test_ora/new/rbs01.dbf';
4> set newname for datafile 3 to '/test_ora/new/users01.dbf';
5> set newname for datafile 4 to '/test_ora/new/test01.dbf';
6> set newname for datafile 5 to '/test_ora/new/test201.dbf';
7> restore database;
8> }

executing command: SETNEWNAME

executing command: SETNEWNAME

executing command: SETNEWNAME

executing command: SETNEWNAME

executing command: SETNEWNAME

Starting restore at27-OCT-07

using channel ORA_DISK_1
channel ORA_DISK_1: restoring datafile 00005
input datafilecopy recid=36 stamp=637095244filename=/oracle/rman_bk/df_5.dbf
destination for restore of datafile 00005:/test_ora/new/test201.dbf
channel ORA_DISK_1: copied datafilecopy of datafile 00005
output filename=/test_ora/new/test201.dbf recid=42stamp=637097488
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backupset
restoring datafile 00001 to /test_ora/new/system01.dbf
restoring datafile 00002 to /test_ora/new/rbs01.dbf
restoring datafile 00003 to /test_ora/new/users01.dbf
restoring datafile 00004 to /test_ora/new/test01.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/oracle/product/9.2.0.4/dbs/03ivie8c_1_1tag=TAG20071027T172739 params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 27-OCT-07

0 0