---10g set dbid
源端环境介绍:
生产数据库是包含两个节点的Oracle 10g 10.2.0.3 RAC数据库:
ASM管理+裸设备
数据库名:racdb
第一节点的sid:racdb1
第一节点的sid:racdb2
异地单机数据库(恢复Server)介绍:
下面将详细记录整个从RAC到单机的详细恢复过程。
【实验BEGIN】
1.将源端的RMAN备份的所有文件拷贝到恢复Server上
脚本如下,注意这里使用了一个保证scp不会中断的小技巧(sleep)
racdb1@testdb183 /orabak$ cat scp.sh
nohup scp -r oracle@172.193.192.26:/orabak/* /orabak &
sleep 10
2.修改源端生成的pfile文件,去掉与RAC有关的内容。
将ASM格式的文件路径统统的修改成为文件系统路径的格式。
3.根据上面参数文件内容,在恢复Server上创建确实的目录
$ mkdir -p /oracle/app/oracle/admin/racdb/cdump
$ mkdir -p /oracle/app/oracle/admin/racdb/udump
$ mkdir -p /oracle/app/oracle/admin/racdb/adump
$ mkdir -p /oracle/app/oracle/admin/racdb/bdump
4.登陆恢复端Server的RMAN命令行,设置成设置成生产RAC第一节点的dbid(这个需要提前确认好)
racdb1@testdb183 /oracle$ rman target /
Recovery Manager: Release 10.2.0.3.0 - Production on Mon Aug 24 20:32:13 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database (not started)
RMAN> set dbid 3914926878
executing command: SET DBID
5.使用新pfile启动实例到nomount状态
RMAN> startup nomount pfile='/oracle/app/oracle/product/10.2.0/db_1/dbs/initracdb1.ora'
Oracle instance started
6.找到RMAN中控制文件的的备份,恢复控制文件
RMAN> restore controlfile from '/orabak/week1/Saturday/c-3914926878-20090822-00';
Starting restore at 2009-08-24 20:33:59
using channel ORA_DISK_1
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:02
output filename=/oracle/oradata/racdb/control01.ctl
Finished restore at 2009-08-24 20:34:01
7.恢复完控制文件之后,启动数据库到mount状态
RMAN> alter database mount;
database mounted
released channel: ORA_DISK_1
8.根据生产数据库对应的文件目录,将其修改到恢复Server的文件路径
需要到生产库确定各个数据文件的信息
executing command: SET NEWNAME
executing command: SET NEWNAME
RMAN>
9.sqlplus下,修改联机日志的路径和名称。目的是防止在open resetlogs时报错
racdb1@testdb183 /oracle$ sqlplus / as sysdba
SQL> alter database rename file '+ORADATA/racdb/onlinelog/group_1.257.668538023' to '/oracle/oradata/racdb/group_1.257.668538023';
10.回到RMAN命令行,进行recover数据库
racdb1@testdb183 /oracle$ rman target /
Recovery Manager: Release 10.2.0.3.0 - Production on Mon Aug 24 21:02:26 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: racdb (DBID=3914926878, not open)
RMAN>
RMAN> recover database;
Starting recover at 2009-08-24 21:02:58
using target database control file instead of recovery catalog
RMAN-06054: media recovery requesting unknown log: thread 2 seq 4106 lowscn 569488757
11.以open resetlogs的方式打开数据库,完成整个RMAN的恢复
RMAN> alter database open resetlogs;
database opened
RMAN>
12.验证
登陆数据库,检查版本信息。
sys@racdb> select * from v$version;
13.后续工作还有很多,如一些参数的调整,这里着重说明一下:需要全新的创建以下临时文件。更多信息请参考alert警告文件
通过RMAN恢复过来的临时文件是不可用的,需要处理一下。 create temporary tablespace temp1 tempfile '/oracle/oradata/racdb/temp01.dbf' size 512m reuse autoextend on next 1m maxsize unlimited;
Tablespace created.
将默认的临时表空间指定到这个新建的表空间上
sys@racdb> alter database default temporary tablespace temp1;
Database altered.
11g: 不需要设置dbid 是不是文章错了
set dbid是用来确定你要恢复的control file的
Oracle RAC异机恢复至单机
描述 主机名 实例名 版本 IP
源端 rac1 racdb1 RAC11204 192.168.100.155
源端 rac2 racdb2 RAC11204 192.168.100.156
目标端 server1 racdb 单机11204 192.168.100.101
准备RMAN全库备份脚本:
rman target / log=full_log << EOF
run
{undefined
allocate channel d1 device type disk;
allocate channel d2 device type disk;
allocate channel d3 device type disk;
backup as compressed backupset database format ‘/home/oracle/rman/datafile_%U’;
backup archivelog all format ‘/home/oracle/rman/arch_%U’;
backup current controlfile format ‘/home/oracle/rman/ctr_%U’;
release channel d1;
release channel d2;
release channel d3;
}
exit
EOF
创建本地静态参数文件:
SQL> create pfile=’/home/oracle/rman/pfile’ from spfile;
File created.
备份文件汇总如下:
[oracle@rac1 rman]$ ls
pfile
压缩备份文件,并将其传输至目标端
[oracle@rac1 ~]$ tar cvf rman.tar.gz rman/
[oracle@rac1 ~]$ scp rman.tar.gz 192.168.100.101:/home/oracle/
目标库解压:
[oracle@server1 ~]$ tar xf rman.tar.gz
在目标单机手动编写创建参数文件:
racdb.__db_cache_size=352321536
racdb.__java_pool_size=4194304
racdb.__large_pool_size=8388608
racdb.__oracle_base=’/oracle/app’
racdb.__pga_aggregate_target=335544320
racdb.__sga_target=503316480
racdb.__shared_io_pool_size=0
racdb.__shared_pool_size=125829120
racdb.__streams_pool_size=0
*.audit_file_dest=’/oracle/app/admin/racdb/adump’
*.audit_trail=‘db’
*.compatible=‘11.2.0.4.0’
*.control_files=’/oracle/app/oradata/racdb/control01.ctl’,’/oracle/app/oradata/racdb/control02.ctl’
*.db_block_size=8192
*.db_name=‘racdb’
*.diagnostic_dest=’/oracle/app’
*.memory_target=838860800
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile=‘EXCLUSIVE’
*.sessions=170
*.undo_tablespace=‘UNDOTBS1’
创建相应的目录:
[oracle@server1 dbs]$ mkdir /oracle/app/admin/racdb/adump -pv
[oracle@server1 dbs]$ mkdir /oracle/app/oradata/racdb -pv
启动目标库至nomount状态:
SQL>startup nomount
目标库连接RMAN恢复控制文件:
[oracle@server1]$rman target /
RMAN> restore controlfile from ‘/home/oracle/rman/ctr_0gv7hjpl_1_1’;
RMAN> alter database mount;
构建RMAN恢复脚本流程:
数据文件rename构建:
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
+DATA/racdb/system01.dbf
+DATA/racdb/sysaux01.dbf
+DATA/racdb/undotbs01.dbf
+DATA/racdb/users01.dbf
+DATA/racdb/example01.dbf
+DATA/racdb/undotbs02.dbf
拼接语句:
sqlplus:
SQL> set pages 0
SQL> set line 500
SQL>
select q’[alter database rename file ‘]’ || name || q’[’ to ]’ || q’[’/oracle/app/oradata/racdb/]’ || substr(name,instr(name,’/’,-1)+1) || q’[’;]’ from v$datafile;
----------------------------------------------------------------------------------------------------------------
alter database rename file ‘+DATA/racdb/system01.dbf’ to ‘/oracle/app/oradata/racdb/system01.dbf’;
alter database rename file ‘+DATA/racdb/sysaux01.dbf’ to ‘/oracle/app/oradata/racdb/sysaux01.dbf’;
alter database rename file ‘+DATA/racdb/undotbs01.dbf’ to ‘/oracle/app/oradata/racdb/undotbs01.dbf’;
alter database rename file ‘+DATA/racdb/users01.dbf’ to ‘/oracle/app/oradata/racdb/users01.dbf’;
alter database rename file ‘+DATA/racdb/example01.dbf’ to ‘/oracle/app/oradata/racdb/example01.dbf’;
alter database rename file ‘+DATA/racdb/undotbs02.dbf’ to ‘/oracle/app/oradata/racdb/undotbs02.dbf’;
RMAN:
select q’[set newname for datafile ‘]’ || name || q’[’ to ]’ || q’[’/oracle/app/oradata/racdb/]’ || substr(name,instr(name,’/’,-1)+1) || q’[’;]’ from v$datafile;
----------------------------------------------------------------------------------------------------------------
set newname for datafile ‘+DATA/racdb/system01.dbf’ to ‘/oracle/app/oradata/racdb/system01.dbf’;
set newname for datafile ‘+DATA/racdb/sysaux01.dbf’ to ‘/oracle/app/oradata/racdb/sysaux01.dbf’;
set newname for datafile ‘+DATA/racdb/undotbs01.dbf’ to ‘/oracle/app/oradata/racdb/undotbs01.dbf’;
set newname for datafile ‘+DATA/racdb/users01.dbf’ to ‘/oracle/app/oradata/racdb/users01.dbf’;
set newname for datafile ‘+DATA/racdb/example01.dbf’ to ‘/oracle/app/oradata/racdb/example01.dbf’;
set newname for datafile ‘+DATA/racdb/undotbs02.dbf’ to ‘/oracle/app/oradata/racdb/undotbs02.dbf’;
RMAN脚本如下:
recovery.sh:
rman target / log=recover_log << EOF
run
{undefined
allocate channel d1 device type disk;
allocate channel d2 device type disk;
allocate channel d3 device type disk;
crosscheck backup;
delete expired backup;
crosscheck archivelog all;
delete expired archivelog all;
catalog start with ‘/home/oracle/rman’;
set newname for datafile ‘+DATA/racdb/system01.dbf’ to ‘/oracle/app/oradata/racdb/system01.dbf’;
set newname for datafile ‘+DATA/racdb/sysaux01.dbf’ to ‘/oracle/app/oradata/racdb/sysaux01.dbf’;
set newname for datafile ‘+DATA/racdb/undotbs01.dbf’ to ‘/oracle/app/oradata/racdb/undotbs01.dbf’;
set newname for datafile ‘+DATA/racdb/users01.dbf’ to ‘/oracle/app/oradata/racdb/users01.dbf’;
set newname for datafile ‘+DATA/racdb/example01.dbf’ to ‘/oracle/app/oradata/racdb/example01.dbf’;
set newname for datafile ‘+DATA/racdb/undotbs02.dbf’ to ‘/oracle/app/oradata/racdb/undotbs02.dbf’;
release channel d1;
release channel d2;
release channel d3;
restore database;
switch datafile all;
}
exit
EOF
执行recover:
RMAN> recover database;
查看SCN信息:
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
1 2470036
6 rows selected.
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
1 2470036
数据文件头一致,尝试打开:
SQL> alter database open resetlogs;
alter database open resetlogs
ERROR at line 1:
ORA-00349: failure obtaining block size for ‘+DATA/racdb/redo01.log’
重建控制文件:
SQL> alter database backup controlfile to trace as ‘/home/oracle/ctl.txt’;
修改为如下:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE “RACDB” RESETLOGS ARCHIVELOG
MAXLOGFILES 192
MAXLOGMEMBERS 3
MAXDATAFILES 1024
MAXINSTANCES 32
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ‘/oracle/app/oradata/racdb/redo01.log’ SIZE 50M BLOCKSIZE 512,
GROUP 2 ‘/oracle/app/oradata/racdb/redo02.log’ SIZE 50M BLOCKSIZE 512
– STANDBY LOGFILE
DATAFILE
‘/oracle/app/oradata/racdb/system01.dbf’,
‘/oracle/app/oradata/racdb/sysaux01.dbf’,
‘/oracle/app/oradata/racdb/undotbs01.dbf’,
‘/oracle/app/oradata/racdb/users01.dbf’,
‘/oracle/app/oradata/racdb/example01.dbf’,
‘/oracle/app/oradata/racdb/undotbs02.dbf’
CHARACTER SET ZHS16GBK
;
一致性关库:
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
脚本创建控制文件:
SQL> @ctl.txt
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2257840 bytes
Variable Size 494931024 bytes
Database Buffers 331350016 bytes
Redo Buffers 6565888 bytes
Control file created.
SQL> alter database open resetlogs;
alter database open resetlogs
ERROR at line 1:
ORA-38856: cannot mark instance UNNAMED_INSTANCE_2 (redo thread 2) as enabled
解决办法:
SQL>alter database add logfile thread 2 group 3 ‘/oracle/app/oradata/racdb/redo03_2.log’ size 50M
SQL>alter database add logfile thread 2 group 4 ‘/oracle/app/oradata/racdb/redo04_2.log’ size 50M
SQL> alter database open resetlogs;
Database altered.
SQL>alter database drop logfile group 3;
SQL>alter database drop logfile group 4;
ORA-01623: