WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2009-12-25 16:00:05
今天第一次体会到了CATALOG的好处,不过这种用法肯定是文档所不推荐的。
碰到了一个难以解决的问题,是在进行DUPLICATE命令的时候碰到的。
源数据库RAC环境采用裸设备方式,将备份集放到一个节点的本地磁盘上,但是目标数据库使用了ASM,且本地磁盘没有足够的空间,因此将远端的备份级拷贝到了ASM磁盘组中,但是目前的问题是,DUPLICATE命令会根据源数据库备份集的位置读取本地的备份级。
在本地服务器上通过ln的方式对ASM磁盘组中的文件是无效的,Oracle尝试读取时仍然会报错。
而通过在源数据库上CATALOG备份集的新位置也是不可行的,因为源数据库上面没有启动ASM实例,而且也没有空间来新配置一个ASM实例,并将备份集拷贝进去。
最后尝试了一下能否通过修改CATALOG记录的方式,可以骗过Oracle的RMAN,使得RMAN可以在辅助实例上根据ASM上面的路径读取备份集。
于是本地尝试一下这种方式是否可行:
E:>rman target / catalog cata_log/cata_log
恢复管理器: Release 10.2.0.1.0 - Production on 星期一 9月 8 17:22:17 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: YTK102 (DBID=3695768905)连接到恢复目录数据库
RMAN> backup tablespace users;
启动 backup 于 08-9月 -08正在启动全部恢复目录的 resync完成全部 resync分配的通道: ORA_DISK_1通道 ORA_DISK_1: sid=132 devtype=DISK通道 ORA_DISK_1: 启动全部数据文件备份集通道 ORA_DISK_1: 正在指定备份集中的数据文件输入数据文件 fno=00004 name=E:ORACLEORADATAYTK102USERS01.DBF通道 ORA_DISK_1: 正在启动段 1 于 08-9月 -08通道 ORA_DISK_1: 已完成段 1 于 08-9月 -08段句柄=E:ORACLEBACKUPYTK102DJQ3EN2_1_1 标记=TAG20080908T172241 注释=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01完成 backup 于 08-9月 -08
利用一个现有的CATALOG进行尝试,首先备份USERS表空间,下面将备份级的位置进行转移:
RMAN> HOST;
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
E:>MOVE E:ORACLEBACKUPYTK102DJQ3EN2_1_1 E:ORACLEBACKUPDJQ3EN2_1_1
E:>EXIT主机命令完成
RMAN>
下面登陆到CATALOG用户下,修改刚才这个备份的HANDLE:
SQL> conn cata_log/cata_log已连接。
SQL> COL HANDLE FORMAT A50
SQL> SELECT BP_KEY, HANDLE FROM RC_BACKUP_PIECE;
BP_KEY HANDLE
---------- ----------------------------------------------
587 E:ORACLEBACKUPBJMSAHJ_1_1
588 E:ORACLEBACKUPYTK102CJMSB39_1_1
608 E:ORACLEBACKUPYTK102DJQ3EN2_1_1
下面修改刚刚备份的这个文件的HANDLE,指向新的文件位置:
SQL> UPDATE RC_BACKUP_PIECE SET HANDLE='E:ORACLEBACKUPDJQ3EN2_1_1' WHERE BP_KEY = 608;
已更新 1 行。
SQL> COMMIT;
提交完成。
下面将表空间置为OFFLINE,并删除需要恢复数据文件:
SQL> CONN YANGTK/YANGTK已连接。
SQL> ALTER TABLESPACE USERS OFFLINE;
表空间已更改。
SQL> HOST DEL E:ORACLEORADATAYTK102USERS01.DBF
然后尝试恢复:
RMAN> RESTORE TABLESPACE USERS;
启动 restore 于 08-9月 -08使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在开始恢复数据文件备份集通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件正将数据文件00004恢复到E:ORACLEORADATAYTK102USERS01.DBF通道 ORA_DISK_1: 正在读取备份段 E:ORACLEBACKUPDJQ3EN2_1_1通道 ORA_DISK_1: 已恢复备份段 1段句柄 = E:ORACLEBACKUPDJQ3EN2_1_1 标记 = TAG20080908T172241通道 ORA_DISK_1: 恢复完成, 用时: 00:00:02完成 restore 于 08-9月 -08
可以看到,备份已经从指定的位置进行了恢复。所以这种方式来解决前面提到的问题是可行的,利用这种方式,CATALOG方式的备份和恢复将变得更加灵活。
不过需要注意一点,目前修改的只是CATALOG数据库中的记录,而控制文件中备份的位置并没有发生变化。
SQL> SELECT HANDLE FROM V$BACKUP_PIECE
2 WHERE START_TIME > SYSDATE - 1/24;
HANDLE
--------------------------------------------
E:ORACLEBACKUPYTK102DJQ3EN2_1_1
建议利用这种方法之后,应该尽快进行恢复,比如将备份级放回原始位置,并修改RC_BACKPU_PIECE,或者删除修改的备份集,避免不一致给系统带来损害。