导言:平常我们使用RMAN恢复数据库,都是单节点对单节点。由于项目需求,现需要从RAC的备份中恢复一个单节点用于开发的测试。
一.系统环境:
源端服务器

系统环境

2 目标端服务器

二.目标端数据的安装
分两种情况:
目标端纯净系统,前期没有安装过数据,则需要根据源端环境,创建同版本的oracle数据库软件。(注意版本必须相同或者高于源端版本,否则RMAN无法从高版本恢复到低版本)
目标端有单机oracle产品,且版本一致,则只需删除数据即可
dbca -silent -deletedatabase -sourcedb sid(如果目标端的数据库与源端版本不一致,建立完全删除重新创建,不建议升级,升级太慢)
三.目标端的恢复
参数文件的恢复
再次提供两种方式恢复
1> 利用源端备份集中参数文件恢复。
RMAN> restore spfile to pfile '/u01/app/oracle/product/11.2.0/dbs/initopen.ora'from '/backup/c-473387766-20110613-03';
恢复spfile后创建出pfile
create pfile='dir' from spfile;根据要求,将RAC的pfile中的内容更改成单机的内容,以下为示例
源端RAC的参数文件open1.__db_cache_size=285212672
open2.__db_cache_size=268435456
open1.__java_pool_size=16777216
open2.__java_pool_size=16777216
open1.__large_pool_size=16777216
open2.__large_pool_size=16777216
open1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from nvironment
open2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
open1.__pga_aggregate_target=553648128
open2.__pga_aggregate_target=536870912
open1.__sga_target=805306368
open2.__sga_target=822083584
open1.__shared_io_pool_size=0
open2.__shared_io_pool_size=0
open1.__shared_pool_size=469762048
open2.__shared_pool_size=469762048
open1.__streams_pool_size=0
open2.__streams_pool_size=33554432
*.audit_file_dest='/u01/app/oracle/admin/open/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='11.2.0.0.0'
*.control_files='+ORADATA/open/control01.ctl','+ORADATA/open/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='open'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=openXDB)'
open1.instance_number=1
open2.instance_number=2
*.log_archive_dest_1='LOCATION=+ORAFLASH/arch'
open1.log_archive_dest_1='LOCATION=+ORAFLASH/arch'
open2.log_archive_dest_1='LOCATION=+ORAFLASH/arch'
open1.log_archive_dest_2=''
open2.log_archive_dest_2=''
*.memory_target=1358954496
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.processes=1500
*.remote_listener='rac-cluster-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sessions=1655
open2.thread=2
open1.thread=1
open2.undo_tablespace='UNDOTBS2'
open1.undo_tablespace='UNDOTBS1'
根据源端的参数文件更改目标端的pfile
*.db_cache_size=285212672
*.java_pool_size=16777216
*.large_pool_size=16777216
*.pga_aggregate_target=553648128 pga和sga的大小根据单实例节点的实际大小设置,因为RAC的大小比单实例大
*.sga_target=805306368
*.shared_pool_size=469762048 同理根据单实例实际大小设置
*.streams_pool_size=16777216 streams必须有值,因为数据泵导入导出需要
*.audit_file_dest='/u01/app/oracle/admin/open/adump' 提前要创建好{a,b,c,u)dump文件
*.audit_trail='db'
*.compatible='11.2.0.0.0' 版本必须对应
*.control_files='/oradata/open/control01.ctl','/oradata/open/control02.ctl' 导入的控制文件的目录要提前创建
*.db_block_size=8192
*.db_domain=''
*.db_name='open' 实例名是与RAC节点相同
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=openXDB)'
*.log_archive_dest_1='location=/arch' 归档日志存放的路径要提前创建好
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.processes=1500
*.remote_login_passwordfile='exclusive'
*.sessions=1655
*.undo_tablespace='UNDOTBS1'
使用更改好的pfile进行数据库的重新启动到nomount状态,根据新的pfile创建新的spfile,然后将数据库再次重启利用spfile进行加载到nomount状态。2> 也可以从正式库中创建一个pfile,再导入
startup pfile='pfile路径' nomount
create spfile from pfile='pfile路径';
shutdown immediate
startup nomount
恢复控制文件
在目标端进入RMAN命令行
RMAN> restore controlfile from '/backup/c-473387766-20110613-03';
恢复控制文件后就可以mount了
RMAN> alter database mount;
注册主库备份后生成的归档文件和备份集: 即把原来的备份路径指定为新拷贝的目标端备份路径。
此例中我们将备份文件全部放到了/backup目录中
如果备份文件和归档文件太多可以注册整个目录:catalog start with '/backup';
由于之前在RMAN中配置了默认通道,这里也要将这些配置清除,操作如下:
RMAN> configure channel 1 device type disk clear;
RMAN> configure channel 2 device type disk clear;
RMAN> configure device type disk clear;
查看元数据库的数据文件、temp文件、redo文件路径
SQL> select file#,name from v$datafile;
SQL> select file#,name from v$tempfile;
SQL> select member from v$logfile;
RMAN 中的SET命令可以用来为数据文件和临时文件重命名;使用set命令对数据文件和临时文件的路径进行重定义,然后再执行恢复操作,如下:
RMAN> RUN {
SET NEWNAME FOR DATAFILE 1 to '/oradata/open/system01.dbf';
SET NEWNAME FOR DATAFILE 2 to '/oradata/open/sysaux01.dbf';
SET NEWNAME FOR DATAFILE 3 to '/oradata/open/undob01.dbf';
SET NEWNAME FOR DATAFILE 4 to '/oradata/open/users01.dbf';
SET NEWNAME FOR DATAFILE 5 to '/oradata/open/undob02.dbf';
SET NEWNAME FOR TEMPFILE 1 to '/oradata/open/temp01.dbf';
RESTORE DATABASE;
SWITCH DATAFILE ALL;
SWITCH TEMPFILE ALL;
}
对数据库执行recover,从备份中读取归档日志
RMAN> recover database;
重建控制文件,主要是更改redo log的目录
sql > alter database backup controlfile to trace; 创建跟踪文件
cd u01/app/oracle/diag/rdbms/open/trace
more open_ora_9131.trc 查看最近时间的跟踪文件,注意跟踪文件中有线程2的日志组
获取控制文件创建脚本之后,稍加修改(主要是改redolog的路径),然后在sqlplus命令行环境下执行:
SQL> startup nomount
SQL> CREATE CONTROLFILE REUSE DATABASE "OPEN" RESETLOGS ARCHIVELOG
MAXLOGFILES 192
MAXLOGMEMBERS 3
MAXDATAFILES 1024
MAXINSTANCES 32
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oradata/open/redo01.log' SIZE 200M BLOCKSIZE 512, 创建时不包括线程2的日志组,删除掉standby logfile的日志组
GROUP 2 '/oradata/open/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 5 '/oradata/open/redo05.log' SIZE 200M BLOCKSIZE 512,
GROUP 6 '/oradata/open/redo06.log' SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oradata/open/system01.dbf',
'/oradata/open/sysaux01.dbf',
'/oradata/open/undob01.dbf',
'/oradata/open/users01.dbf',
'/oradata/open/undob02.dbf'
CHARACTER SET ZHS16GBK
;
根据跟踪文件中控制文件内容手动添加线程2的日志组
以resetlogs 打开数据库
ALTER DATABASE ADD LOGFILE THREAD 2
GROUP 3 '/oradata/open/redo03.log' size 200m,
GROUP 4 '/oradata/open/redo04.log' size 200m;
SQL> alter database open resetlogs;
重建临时表空间的数据文件:
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/open/temp01.dbf' size 200m;
清除未使用线程的redo日志组,操作如下:
SQL> select thread#,status,enabled from v$thread;
THREAD# STATUS ENABLED
---------- ------ --------
1 OPEN PUBLIC
2 CLOSED PUBLIC
SQL> select group#,thread#,archived,status from v$log;
GROUP# THREAD# ARC STATUS
---------- ---------- --- ----------------
1 1 NO CURRENT
2 1 YES UNUSED
3 2 YES ACTIVE
4 2 YES UNUSED
5 1 YES UNUSED
6 1 YES UNUSED
SQL> alter database disable thread 2;
SQL> alter database drop logfile group 3; (如果状态是inactive的,直接删除日志组就行)
SQL> alter database clear unarchived logfile group 4; (如果状态是unused的,先设置日志组不能归档,再删除)
SQL> alter database drop logfile group 4;
14. 清除多余的undo文件。
SQL> select name from v$tablespace where name like 'UNDO%';
NAME
------------------------------
UNDOTBS1
UNDOTBS2
SQL> show parameter undo_tablespace;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL> Drop tablespace undotbs2 including contents and datafiles;
15. 最后将RAC节点的密码文件导入到单节点的目录下,赋用户,用户组,改成相应的名字即可
cd $ORACLE_HOME/dbs
设置rman的备份路径,进行全备
configure channel device type disk format '/home/oracle/rman_bak/%d_%I_%s_%p_%T.bkp';
至此 RAC 的备份集恢复到单实例数据库完成!
其实作为一个DBA只要细心,用心,信心,就会做到成功!




