将生产rac集群数据恢复到单机节点
主要环境说明
RAC:两个节点+ASM
RAC1-------->ORACLE_SID=webwkdb1
RAC2-------->ORACLE_SID=webwkdb2
参数文件中db_name='webwkdb'
集群RMAN的备份目录为/u02/oracle/backup/backdata/
单节点:安装了数据库软件和创建了实例
ORACLE_SID=orcl
准备工作
- 恢复的中心思想:通过RAC库的pfile文件传到单节点------>修改传来的pfile文件重构适合单节点的spfile文件------>启动库到nomount状态----->还原控制文件然后启动库到mount状态------>还原数库------>恢复数据库------>打开数据库------>关闭多余的redo日志组及删除相应文件------>恢复后的数据检查
- 准备步骤:
- 在RAC端找到pfile文件传到单节点端(若以前没有可通过下面命令创建)
SQL>create pfile=”/home/oracle/pfile.ora” from spfile
使用前请了解是否对生产有影响
- 在RAC端找到密码文件和tnsnames.ora文件传到单节点
密码文件一般在$ORACLE_HOME/dbs/下,文件名称为orapw+sid或orapw+db_name
tnsnames.ora一般在$ORACLE_HOME/network/admin/下
- 传送RMAN备份集到单节点端
注意:单节点端RMAN备份文集的存放路径要和RAC端的一致,也就是说要传送前要在单节点端创建相同目录,传到单节点属组属主也要为oracle的
su - oracle
mkdir -p /u02/oracle/backp/backdata/
传好后执行下面命令,确保备份集的属主属组为oralce的
chown -R oracle.oinstall /u02/oracle/backp/backdata/
- 单节点端操作步骤
- 修改pfile文件(下面为修改后参考配置)
主要删除关于集群的一些参数,留下*.开头的,红色为添加的,如下为完整修改后参考文件
*.audit_file_dest='/u01/app/oracle/admin/webwkdb/adump' *.audit_trail='NONE' *.cluster_database=false *.compatible='11.2.0.4.0' *.control_files='/u01/app/oracle/oradata/webwkdb/control01.ctl','/u01/app/oracle/oradata/webwkdb/control02.ctl'#Restore Controlfile *.db_block_size=8192 *.db_create_file_dest='/u01/app/oracle/oradata' *.db_domain='' *.db_file_name_convert='+DATA/webwkdb/','/u01/app/oracle/oradata/webwkdb/' *.db_name='webwkdb' *.db_recovery_file_dest='/u01/app/oracle/oradata/db_recovery' *.db_recovery_file_dest_size=4385144832 *.deferred_segment_creation=FALSE *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=WEBWKDBXDB)' *.log_archive_dest_1='location=/u01/app/oracle/oradata/arch' *.log_file_name_convert='+DATA/webwkdb/','/u01/app/oracle/oradata/webwkdb/' *.open_cursors=1200 *.optimizer_index_caching=90 *.optimizer_index_cost_adj=25 *.pga_aggregate_target=28285337600 *.processes=5000 *.remote_login_passwordfile='exclusive' *.sec_case_sensitive_logon=FALSE *.session_cached_cursors=300 *.sessions=2755 *.sga_target=68719476736 *.undo_retention=3600 *.undo_tablespace='UNDOTBS1' |
- 创建参数文件内使用的目录
su - oracle
mkdir -p /u01/app/oracle/oradata
mkdir -p /u01/app/oracle/oradata/arch
mkdir -p /u01/app/oracle/oradata/webwkdb
mkdir -p /u01/app/oracle/oradata/db_recovery
mkdir -p /u01/app/oracle/admin/webwkdb/adump
创建好后注意目录的属主和属组
- 将pfile文件,密码文件,tnsnames.ora文件cp到相应目录下
我这里上传时这三个文件传到oracle的家目录下
cp前检查文件的属主属组,并将相关目录下原实例的相关文件改为*.bak备份
chown oralce.oinstall /home/oracle/pfile.ora
chown oralce.oinstall /home/oracle/orapwwebwkdb1
chown oralce.oinstall /home/oracle/tnsnames.ora
su - oracle
cp /home/oracle/pfile.ora $ORACLE_HOME/dbs/initwebwkdb.ora
cp/home/oracle/stage/orapwwebwkdb1 $ORACLE_HOME/dbs/orapwwebwkdb
cp /home/oracle/tnsnames.ora $ORACLE_HOME/network/admin
- 修改单机节点oracle环境变量
ORACLE_SID=webwkdb 这个一定要和参数文件里的db_name一致
ORACLE_UNQNAME=webwkdb
- 恢复控制文件
通过传送来的控制文件备份集来恢复控制文件,并启动数据库到mount状态
sqlplus / as sysdba
create spfile from pfile; #根据修改后的pfile生成spfile
startup nomount;
rman>
restore controlfile from '/u02/oracle/backup/backdata/备份的控制文件名';
sql>
alter database mount;
- 还原恢复数据库
rman target / #进入rman,执行下面的run语句块
run {
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
set newname for database to '/u01/app/oracle/oradata/webwkdb/%b';
restore database;
switch datafile all;
switch tempfile all;
recover database;
}
执行后出现如下结果:
......................
output file name=/u01/app/oracle/oradata/orcl/undotbs05.dbf RECID=362 STAMP=1067364775
Finished restore at 16-MAR-21 #还原结束
.................................
starting media recovery #开始恢复
....................................
archived log file name=/u01/app/oracle/oradata/arch/1_31928_990632548.dbf thread=1 sequence=31928
archived log file name=/u01/app/oracle/oradata/arch/2_14571_990632548.dbf thread=2 sequence=14571
unable to find archived log
archived log thread=2 sequence=14572
RMAN-00571: =========================================================
RMAN-00569: ============= ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: =========================================================
RMAN-03002: failure of recover command at 03/16/2021 18:13:10
RMAN-06054: media recovery requesting unknown archived log for thread 2 with sequence 14572 and starting SCN of 672434025664
中间没其他报错,只有这个说明已经恢复到最新归档日志处。
- 打开数据库
执行打开数据库之前可先执行两个查询来查询出来的redo日志路径和状态,
路径问题可参考问题1的解决方式解决,状态问题可参考问题2
sqlplus / as sysdba
select member from v$logfile;
select thread#,group#,status,archived from v$log;
alter database open resetlogs;
执行这个能成功打开数据库说明恢复成功,
本人在本地做时能顺利打开,但在测试环境出现如下错误
问题1(ORA-00349):
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-00349: failure obtaining block size for '+DATA/webwkdb/redo01.lo
问题1解决方式:
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
+DATA/webwkdb/redo01.log
+DATA/webwkdb/redo02.log
+DATA/webwkdb/redo03.log
+DATA/webwkdb/redo04.log
+DATA/webwkdb/redo05.log
+DATA/webwkdb/redo06.log
SQL> alter database rename file '+DATA/webwkdb/redo01.log' to '/u01/app/oracle/oradata/webwkdb/redo01.log';
Database altered.
按照上面方式依次将查到的redo日志文件路径修改到本地路径
问题2(ORA-00392,ORA-00312):
SQL> alter database open resetlogs;
alter database open resetlogs
ERROR at line 1:
ORA-00392: log 3 of thread 2 is being cleared, operation not allowed
ORA-00312: online log 3 thread 2: '/u01/app/oracle/oradata/webwkdb/redo04.log'
问题2解决方式:
SQL> select thread#,group#,status from v$log;
THREAD# GROUP# STATUS
---------- ---------- ----------------
1 5 CLEARING_CURRENT
1 2 CLEARING
1 1 CLEARING
2 6 CLEARING
2 3 CLEARING_CURRENT
这里可以看到redo日志有两个日志组,且状态为CLEARING(正在被清空,需要手动执行清空命令),CLEARING_CURRENT(正在被清空出错)
SQL> alter database clear unarchived logfile group 3;
Database altered.
SQL> alter database clear unarchived logfile group 2;
Database altered.
SQL> alter database clear unarchived logfile group 5;
Database altered.
SQL> alter database clear unarchived logfile group 6;
Database altered.
SQL> select thread#,group#,status,archived from v$log;
THREAD# GROUP# STATUS ARC
---------- ---------- ---------------- ---
1 5 CURRENT NO
1 2 UNUSED YES
1 1 UNUSED YES
2 6 UNUSED YES
2 3 CURRENT NO
到这里可以看到redo日志组状态正常,可开启数据库
SQL> alter database open;
alter database open
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
Database altered.
到这数据库开启成功。
- 删除多余redo日志组和undo日志空间
查询正在使用的undo
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 3600
undo_tablespace string UNDOTBS1
查询创建过的undo表空间
SQL> select tablespace_name from dba_tablespaces where contents='UNDO';
TABLESPACE_NAME
------------------------------
UNDOTBS1
UNDOTBS3
删除不用的undo表空间
SQL> drop tablespace UNDOTBS3 including contents and datafiles;
Tablespace dropped.
------------------------------undo日志空间清理清理完毕---------------------------------
查询redo日志组集组内成员
SQL> select thread#,group#,status,archived from v$log;
THREAD# GROUP# STATUS ARC
---------- ---------- ---------------- ---
1 1 CURRENT NO
1 2 INACTIVE YES
2 3 INACTIVE YES
1 5 INACTIVE YES
2 6 UNUSED YES
关闭第二个日组的使用(要先关闭使用再删除)
SQL> alter database disable thread 2;
Database altered.
删除第二个日志组内成员
SQL> alter database drop logfile group 3;
Database altered.
SQL> alter database drop logfile group 6;
Database altered.
------------------------------------------redo日志组清理成功----------------------------
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/webwkdb/redo01.log
/u01/app/oracle/oradata/webwkdb/redo02.log
/u01/app/oracle/oradata/webwkdb/redo03.log
SQL> select thread#,group#,status,archived from v$log;
THREAD# GROUP# STATUS ARC
---------- ---------- ---------------- ---
1 1 INACTIVE YES
1 2 CURRENT NO
1 5 INACTIVE YES
SQL> select tablespace_name from dba_tablespaces where contents='UNDO';
TABLESPACE_NAME
------------------------------
UNDOTBS1
- 总结
注意点1:
个人在本地做好相同的环境准备,采用的是如下恢复命令
run {
restore controlfile from '/home/oracle/stage/orclcontrol.ctl';
alter database mount;
restore database;
recover database;
}
这里是通过参数pfile文件里的*.log_file_name_convert和*.db_file_name_convert参数目录映射而改变文件恢复的路径。但测试环境这两个参数不生效,供应商也没查到原因,故测试采用
set newname for database to '/u01/app/oracle/oradata/webwkdb/%b';来重设文件恢复路径
注意点二2:
run {
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
set newname for database to '/u01/app/oracle/oradata/webwkdb/%b';
restore database;
switch datafile all;
switch tempfile all;
recover database;
}
里面的switch语句要和restore语句在一个run语句块里面才能执行。




