说明:本文为Oracle RAC集群转单实例/RMAN异机恢复/RMAN迁移/RMAN备份恢复操作概要方便用户查阅
温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化
说明:本文为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_dataformat '/home/oracle/zzt_backup/zzt_level_0_data_%s_%p_%t.dbf' ; #归档文件(为了恢复需要,只需要备份最近1天的即可)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 from time 'sysdate-1' delete input tag zzt_level_0_archformat '/home/oracle/zzt_backup/zzt_level_0_arch_%s_%p_%t.arc' ;#控制文件(建议备份完数据文件再备控制文件,这样控制文件中会有备份记录)backup current controlfile tag zzt_level_0_contformat '/home/oracle/zzt_backup/zzt_level_0_cont_%s_%p_%t.ctl' ;#参数文件backup spfile tag zzt_level_0_spfiformat '/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='/home/oracle/zzt_backup/pfile.txt' from spfile;
SQL> create pfile from spfile;
★ 停止集群并禁止开机自启(所有节点都执行)
/
su - root
cd $GRID_HOME/bin/
./crsctl stop cluster -al
./crsctl stop crs
./crsctl disable crs
★ 重新编译Oracle软件去除集群依赖(CGS)(ORA-29702)
/
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
cd $ORACLE_HOME/dbs/
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/
★ 启动监听(转为单实例后,监听归Oracle管理)
/
su - oracle
lsnrctl start
★ 调用rman rename功能修改集群数据文件为文件系统路径,然后执行恢复
/
查看并修改转储的控制文件中修改路径
vi /home/oracle/zzt_backup/ctl.txt
STARTUP NOMOUNTCREATE CONTROLFILE REUSE DATABASE "RACDB" NORESETLOGS ARCHIVELOGMAXLOGFILES 192MAXLOGMEMBERS 3MAXDATAFILES 1024MAXINSTANCES 32MAXLOGHISTORY 292LOGFILEGROUP 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 512DATAFILE'/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 DATABASEALTER SYSTEM ARCHIVE LOG ALL;ALTER DATABASE OPEN;ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/racdb/temp.dbf' SIZE 10M AUTOEXTEND ON;
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;
★ 测试(结束)
/
※ 查看备份之前创建的测试表数据验证数据是否丢失,该例结果为“123”
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# TYPE MEMBER IS_RECOVERY_DEST_FILE------ ------- -------------------------------------------------------------------------------- ---------------------2 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_2_h805g2gl_.log NO2 ONLINE /u01/app/oracle/fast_recovery_area/RACDB/onlinelog/o1_mf_2_h805g2jh_.log YES1 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_1_h805g0wl_.log NO1 ONLINE /u01/app/oracle/fast_recovery_area/RACDB/onlinelog/o1_mf_1_h805g0yb_.log YES3 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_3_h805g3h6_.log NO3 ONLINE /u01/app/oracle/fast_recovery_area/RACDB/onlinelog/o1_mf_3_h805g3k0_.log YES4 ONLINE /u01/app/oracle/oradata/racdb/RACDB/onlinelog/o1_mf_4_h805g4p2_.log NO4 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-20using channel ORA_DISK_1starting media recoverychannel ORA_DISK_1: starting archived log restore to default destinationchannel ORA_DISK_1: restoring archived logarchived log thread=1 sequence=19channel ORA_DISK_1: restoring archived logarchived log thread=1 sequence=20channel ORA_DISK_1: restoring archived logarchived log thread=1 sequence=21channel ORA_DISK_1: restoring archived logarchived log thread=1 sequence=22channel ORA_DISK_1: reading from backup piece /home/oracle/zzt_backup/zzt_level_0_arch_10_1_1036318479.arcchannel ORA_DISK_1: piece handle=/home/oracle/zzt_backup/zzt_level_0_arch_10_1_1036318479.arc tag=ZZT_LEVEL_0_ARCHchannel ORA_DISK_1: restored backup piece 1channel ORA_DISK_1: restore complete, elapsed time: 00:00:01archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_19_h804mj1s_.arc thread=1 sequence=19channel default: deleting archived log(s)archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_19_h804mj1s_.arc RECID=34 STAMP=1036322032archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_20_h804mj3s_.arc thread=1 sequence=20channel default: deleting archived log(s)archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_20_h804mj3s_.arc RECID=31 STAMP=1036322032archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_21_h804mj44_.arc thread=1 sequence=21channel default: deleting archived log(s)archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_21_h804mj44_.arc RECID=32 STAMP=1036322032archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_22_h804mj4g_.arc thread=1 sequence=22channel default: deleting archived log(s)archived log file name=/u01/app/oracle/fast_recovery_area/RACDB/archivelog/_03_29/o1_mf_1_22_h804mj4g_.arc RECID=33 STAMP=1036322032unable to find archived logarchived log thread=1 sequence=23RMAN-00571: ===========================================================RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============RMAN-00571: ===========================================================RMAN-03002: failure of recover command at 03/29/ 11:13:53RMAN-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- 11:45:42Copyright (c) 1991, , Oracle. All rights reserved.Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))STATUS of the LISTENER------------------------Alias LISTENERVersion TNSLSNR for Linux: Version 11.2.0.3.0 - ProductionStart Date 29-MAR- 11:45:27Uptime 0 days 0 hr. 0 min. 15 secTrace Level offSecurity ON: Local OS AuthenticationSNMP OFFListener Log File /u01/app/oracle/diag/tnslsnr/rac1/listener/alert/log.xmlListening 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