暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

将生产rac集群数据恢复到单机节点

原创 yBmZlQzJ 2022-06-08
2067

将生产rac集群数据恢复到单机节点

主要环境说明

RAC:两个节点+ASM

RAC1-------->ORACLE_SID=webwkdb1

RAC2-------->ORACLE_SID=webwkdb2

参数文件中db_name='webwkdb'

集群RMAN的备份目录为/u02/oracle/backup/backdata/

单节点:安装了数据库软件和创建了实例

ORACLE_SID=orcl

准备工作

  1. 恢复的中心思想:通过RAC库的pfile文件传到单节点------>修改传来的pfile文件重构适合单节点的spfile文件------>启动库到nomount状态----->还原控制文件然后启动库到mount状态------>还原数库------>恢复数据库------>打开数据库------>关闭多余的redo日志组及删除相应文件------>恢复后的数据检查
  2. 准备步骤:
  • 在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/

  1. 单节点端操作步骤
  2. 修改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'

  1. 创建参数文件内使用的目录

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

创建好后注意目录的属主和属组

  1. 将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

  1. 修改单机节点oracle环境变量

ORACLE_SID=webwkdb 这个一定要和参数文件里的db_name一致

ORACLE_UNQNAME=webwkdb

  1. 恢复控制文件

通过传送来的控制文件备份集来恢复控制文件,并启动数据库到mount状态

sqlplus / as sysdba

create spfile from pfile; #根据修改后的pfile生成spfile

startup nomount;

rman>

restore controlfile from '/u02/oracle/backup/backdata/备份的控制文件名';

sql>

alter database mount;

  1. 还原恢复数据库

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

中间没其他报错,只有这个说明已经恢复到最新归档日志处。

  1. 打开数据库

执行打开数据库之前可先执行两个查询来查询出来的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.

到这数据库开启成功。

  1. 删除多余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. 总结

注意点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语句块里面才能执行。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论