说明:本文为Oracle RAC集群转单实例/RMAN异机恢复/RMAN迁移/RMAN备份恢复操作概要方便用户查阅
温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化
步骤
--全库备份(最好停止业务,备份后从ASM中复制出来redo当前组,并记录好DBID)
--转储参数文件和控制文件
--关闭集群
--重新编译Oracle软件去除集群依赖
--创建单实例目录
--修改参数文件为单实例版
--调用rman rename功能修改集群数据文件为文件系统路径,然后执行恢复
--修改并重建控制文件(redo位置等)
--起库(resetlogs)
--测试
--完成
★ 实验环境
/////////////////////////////////////////////////////////////////////
Oracle:11.2.0.3 RAC
系统:Red Hat 6.3
★ 环境准备
/////////////////////////////////////////////////////////////////////
※ 停止业务
※ 创建一个测试表,用来恢复后验证数据是否丢失
sqlplus / as sysdba
SQL> create table sys.zzt(id number);
SQL> insert into sys.zzt values(123);
SQL> commit;
★ 全库备份
/////////////////////////////////////////////////////////////////////
su - oracle
mkdir -p /home/oracle/zzt_backup/
rman target /
--0级全备
--RUN块
run{
allocate channel zzt_disk01 device type disk;
allocate channel zzt_disk02 device type disk;
allocate channel zzt_disk03 device type disk;
crosscheck backup;
delete noprompt expired backup;
#数据文件
backup incremental level 0 as compressed backupset database tag zzt_level_0_data
format '/home/oracle/zzt_backup/zzt_level_0_data_%s_%p_%t.dbf' ;
#归档文件
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
crosscheck archivelog all;
delete noprompt expired archivelog all;
backup as compressed backupset archivelog all delete all input tag zzt_level_0_arch
format '/home/oracle/zzt_backup/zzt_level_0_arch_%s_%p_%t.arc' ;
#控制文件
backup current controlfile tag zzt_level_0_cont
format '/home/oracle/zzt_backup/zzt_level_0_cont_%s_%p_%t.ctl' ;
#参数文件
backup spfile tag zzt_level_0_spfi
format '/home/oracle/zzt_backup/zzt_level_0_spfi_%s_%p_%t.spf' ;
release channel zzt_disk01;
release channel zzt_disk02;
release channel zzt_disk03;
}
★ 转储控制文件和参数文件
/////////////////////////////////////////////////////////////////////
sqlplus / as sysdba
SQL> alter database backup controlfile to trace as '/home/oracle/zzt_backup/ctl.txt';
SQL> create pfile from spfile;
★ 停止集群并禁止开机自启
/////////////////////////////////////////////////////////////////////
su - root
cd $GRID_HOME/bin/
./crsctl stop cluster -all
./crsctl stop crs
./crsctl disable crs
★ 重新编译Oracle软件去除集群依赖(CGS)
/////////////////////////////////////////////////////////////////////
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ops_off
make -f ins_rdbms.mk install
温馨提示:如果想再转回集群,可以反向执行
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ops_on
make -f ins_rdbms.mk install
★ 创建单实例目录
/////////////////////////////////////////////////////////////////////
※ 修改参数文件转为单实例,并创建修改目录
su - oracle
vi initracdb1.ora
*.audit_file_dest='/u01/app/oracle/admin/racdb/adump'
*.audit_trail='db'
#*.cluster_database=true
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/racdb/controlfileA.ctl','/u01/app/oracle/fast_recovery_area/racdb/controlfileB.ctl'
*.db_block_size=8192
*.db_create_file_dest='/u01/app/oracle/oradata/racdb'
*.db_domain=''
*.db_name='racdb'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area/'
*.db_recovery_file_dest_size=4558159872
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=racdbXDB)'
#racdb1.instance_number=1
#racdb2.instance_number=2
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=195035136
*.processes=150
#*.remote_listener='racscan:1521'
*.remote_login_passwordfile='exclusive'
*.sga_target=587202560
*.undo_tablespace='UNDOTBS1'
#racdb2.thread=2
#racdb1.thread=1
#racdb1.undo_tablespace='UNDOTBS1'
#racdb2.undo_tablespace='UNDOTBS2'
su - oracle
mkdir -p $ORACLE_BASE/oradata/$DB_NAME/
mkdir -p $ORACLE_BASE/fast_recovery_area/$DB_NAME/ARCHIVELOG/
mkdir -p $ORACLE_BASE/fast_recovery_area/$DB_NAME/ONLINELOG/
★ 启动监听
/////////////////////////////////////////////////////////////////////
su - oracle
lsnrctl start
★ 调用rman rename功能修改集群数据文件为文件系统路径,然后执行恢复
/////////////////////////////////////////////////////////////////////
查看并修改转储的控制文件中修改路径
vi /home/oracle/zzt_backup/ctl.txt
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "RACDB" NORESETLOGS ARCHIVELOG
MAXLOGFILES 192
MAXLOGMEMBERS 3
MAXDATAFILES 1024
MAXINSTANCES 32
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ('/u01/app/oracle/oradata/racdb/REDO01.LOG') SIZE 50M BLOCKSIZE 512,
GROUP 2 ('/u01/app/oracle/oradata/racdb/REDO02.LOG') SIZE 50M BLOCKSIZE 512,
GROUP 3 ('/u01/app/oracle/oradata/racdb/REDO03.LOG') SIZE 50M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/racdb/system.dbf',
'/u01/app/oracle/oradata/racdb/sysaux.dbf',
'/u01/app/oracle/oradata/racdb/undotbs1.dbf',
'/u01/app/oracle/oradata/racdb/users.dbf',
'/u01/app/oracle/oradata/racdb/example.dbf',
'/u01/app/oracle/oradata/racdb/undotbs2.dbf'
CHARACTER SET AL32UTF8
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/racdb/temp.dbf' SIZE 32505856 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
su - oracle
rman target /
RMAN> restore controlfile from '/home/oracle/zzt_backup/zzt_level_0_cont_11_1_1036318481.ctl';
RMAN> alter database mount;
RMAN>
run{
set newname for datafile "+DATA/racdb/datafile/system.256.952947643" to "/u01/app/oracle/oradata/racdb/system.dbf";
set newname for datafile "+DATA/racdb/datafile/sysaux.257.952947643" to "/u01/app/oracle/oradata/racdb/sysaux.dbf";
set newname for datafile "+DATA/racdb/datafile/undotbs1.258.952947643" to "/u01/app/oracle/oradata/racdb/undotbs1.dbf";
set newname for datafile "+DATA/racdb/datafile/users.259.952947643" to "/u01/app/oracle/oradata/racdb/users.dbf";
set newname for datafile "+DATA/racdb/datafile/example.264.952947763" to "/u01/app/oracle/oradata/racdb/example.dbf";
set newname for datafile "+DATA/racdb/datafile/undotbs2.265.952947977" to "/u01/app/oracle/oradata/racdb/undotbs2.dbf";
restore database;
switch datafile all;
}
RMAN> recover database;
SQL> select * from v$log;
SQL> recover database using backup controlfile until cancel;
温馨提示:
方法1:在恢复时可能报错“RMAN-06054”提示没有redo当前组,但是咱们redo的当前组已经备份,并根据v$log视图获知哪些sequence的redo已归档和恢复完成,所以不用管这个,直接执行不完全恢复即可(其实不丢数据)
输入“auto”然后再一次输入“cancel”
重建控制文件(主要是修改redo为单实例模式,也可以不修改Oracle会自动根据参数文件路径进行设置)
SQL> alter database open resetlogs;
方法2:当然,你想让恢复看上去像完全恢复,也可以用咱们前面提到的备份的redo当前组来进行最后的恢复
输入备份的redo当前组
重建控制文件(主要是修改redo为单实例模式,也可以不修改Oracle会自动根据参数文件路径进行设置)
SQL> alter database open;
★ 测试(结束)
/////////////////////////////////////////////////////////////////////
※ 查看备份之前创建的测试表数据验证数据是否丢失
select * from sys.zzt;
★ 如果想回到集群状态,可以按如下方式进行
/////////////////////////////////////////////////////////////////////
※ 重新编译Oracle软件加上集群依赖(CGS)
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ops_on
make -f ins_rdbms.mk install
※ 清理单实例的参数文件
su - oracle
SQL> shut immediate
rm $ORACLE_HOME/dbs/initracdb1.ora
rm $ORACLE_HOME/dbs/spfileracdb1.ora
※ 恢复集群的参数文件
vi $ORACLE_HOME/dbs/initracdb1.ora
spfile='+data/RACDB/spfileracdb.ora'
※ 启动CRS(所有节点都执行)
su - root
cd $GRID_HOME/bin/
./crsctl enable crs
./crsctl start crs
※ 启动后恢复到原来的状态
★ 后记(这里记录了一些实验中的一些不重要的信息)
/////////////////////////////////////////////////////////////////////
※ 没有手动重建控制文件后Oracle自动resetlogs生成的redo信息
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- -------------------------------------------------------------------------------- ---------------------
2 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_2_h805g2gl_.log NO
2 ONLINE /u01/app/oracle/fast_recovery_area/RACDB/onlinelog/o1_mf_2_h805g2jh_.log YES
1 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_1_h805g0wl_.log NO
1 ONLINE /u01/app/oracle/fast_recovery_area/RACDB/onlinelog/o1_mf_1_h805g0yb_.log YES
3 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_3_h805g3h6_.log NO
3 ONLINE /u01/app/oracle/fast_recovery_area/RACDB/onlinelog/o1_mf_3_h805g3k0_.log YES
4 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_4_h805g4p2_.log NO
4 ONLINE /u01/app/oracle/fast_recovery_area/RACDB/onlinelog/o1_mf_4_h805g4qy_.log YES
※ RMAN恢复数据库时提示没有当前redo组
RMAN> recover database;
Starting recover at 29-MAR-20
using channel ORA_DISK_1
starting media recovery
channel ORA_DISK_1: starting archived log restore to default destination
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=19
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=20
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=21
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=22
channel ORA_DISK_1: reading from backup piece /home/oracle/zzt_backup/zzt_level_0_arch_10_1_1036318479.arc
channel ORA_DISK_1: piece handle=/home/oracle/zzt_backup/zzt_level_0_arch_10_1_1036318479.arc tag=ZZT_LEVEL_0_ARCH
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_19_h804mj1s_.arc thread=1 sequence=19
channel default: deleting archived log(s)
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_19_h804mj1s_.arc RECID=34 STAMP=1036322032
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_20_h804mj3s_.arc thread=1 sequence=20
channel default: deleting archived log(s)
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_20_h804mj3s_.arc RECID=31 STAMP=1036322032
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_21_h804mj44_.arc thread=1 sequence=21
channel default: deleting archived log(s)
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_21_h804mj44_.arc RECID=32 STAMP=1036322032
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_22_h804mj4g_.arc thread=1 sequence=22
channel default: deleting archived log(s)
archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/2020_03_29/o1_mf_1_22_h804mj4g_.arc RECID=33 STAMP=1036322032
unable to find archived log
archived log thread=1 sequence=23
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 03/29/2020 11:13:53
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 23 and starting SCN of 1350636
※ 监听信息
[oracle@rac1 zzt_backup]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 29-MAR-2020 11:45:42
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 29-MAR-2020 11:45:27
Uptime 0 days 0 hr. 0 min. 15 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/diag/tnslsnr/rac1/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=1521)))
Services Summary...
Service "racdb" has 1 instance(s).
Instance "racdb1", status READY, has 1 handler(s) for this service...
Service "racdbXDB" has 1 instance(s).
Instance "racdb1", status READY, has 1 handler(s) for this service...
The command completed successfully
over