当前位置 博文首页 > 文章内容

    记录一次Oracle 11.2.0.4 RAC异地恢复到单实例 参考学习

    作者: 栏目:未分类 时间:2020-07-27 14:03:48

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    记录一次Oracle 11.2.0.4 RAC异地恢复到单实例

     

    --原文:http://blog.itpub.net/30484956/viewspace-2688280/

    此次记录一下Oracle RAC集群备份异地单实例恢复操作。主要记录关键操作,由于保密原因不粘贴详细操作流程。

    一、环境:

    原库:

    操作系统:Redhat 6.5 
    数据库:Oracle 11.2.0.4 RAC (双节点) 
    工具:rman 
    IP地址:192.168.10.10(节点1)

    异地恢复库:

    操作系统:Centos 6.5 
    数据库:Oracle 11.2.0.4 (单实例) 
    工具:rman 
    IP地址:192.168.10.123

    二、操作

    1.原库两个节点全部停止应用服务,停掉监听,防止再有连接进来进行操作。然后在一个节点(192.168.10.10)使用 rman工具进行整库备份,在执行备份前手动归档一次,主要备份数据库、归档文件、控制文件。至于spfile参数文件可以不用备份,因为RAC环境的参数文件到单实例上还是需要修改很多地方的,可以在原库使用命令 create pfile=’/home/oracle/orclint.ora’ from spfile 生成pfile文件。

    2.将备份后的数据库、归档、控制文件以及生成的pfile文件使用scp远程复制到192.168.10.123(异地库),放在了/data/rmanbackup目录下

    3.192.168.10.123(异地库)已经安装了Oracle 11.2.0.4软件,并未建库。设置环境变量,尤其是ORACLE_SID与192.168.10.10(原库)集群环境一致,便于恢复操作。

    4.根据传过来的pfile文件里的内容进行修改,我大致列一下修改后的参数文件:

    *.audit_file_dest='/u01/app/oracle/admin/hkrt/adump'
    *.audit_trail='db'
    *.compatible='11.2.0.4.0'
    *.control_files='/u01/app/oracle/oradata/hkrt/control01.dbf','/u01/app/oracle/oradata/hkrt/control02.dbf'
    *.db_block_size=8192
    *.db_domain=''
    *.db_name='ORCL'
    *.diagnostic_dest='/u01/app/oracle'
    *.dispatchers='(PROTOCOL=TCP) (SERVICE=hkrtXDB)'
    *.log_archive_dest_1='LOCATION=/u01/arch'
    *.log_archive_format='%t_%s_%r.dbf'
    *.memory_target=5034213376
    *.open_cursors=300
    *.processes=400

    5.参数文件修改完后剩下的操作基本都在异地库了,sqlplus进入空实例,然后根据修改后的pfile进行启动到nomount状态(注意:参数文件中的内存配置、进程数配置要符合异地库内存,不然内存溢出,启动失败)。

    参考命令: 
    startup nomount from pfile=’/data/rmanbackup/orclinit.ora’;

    (由于是测试,所有并没有备份密码文件,可以在数据库恢复后重置用户密码)

    6.讲数据库启动到nomount状态,登陆rman (rman target /),就可以看到数据库状态为nomount状态。然后进行控制文件的恢复,参考命令:

    restore controlfile from ‘/data/rmanbackup//ctl_ORCL_20150830_6552_1’;

    执行完控制文件还原操作后,控制文件会恢复到参数文件中指定的目录下

    7.控制文件恢复后就可以启动到mount状态了,

    RMAN> alter database mount;

    启动到mount状态先别着急恢复数据库,需要先将备份集注册到rman中

    RMAN> catalog start with ‘/data/rmanbackup’;

    (路径就是你存放所有备份的目录)

    注册完成后,先交叉校验备份集:

    RMAN> crosscheck backupset;

    删除过期的备份,因为你备份是异地备份,所以在RAC中记录的备份全部过期,进行清除

    RMAN> delete expired backup;

    8.现在开始恢复数据库文件,因为RAC数据库数据文件、日志文件等存储路径时在ASM磁盘中,路径基本是以 ‘+DATA’ 开头,在执行restore database 命令前需要进行文件路径转换。

    先在原库上生成关于数据文件路径转换的脚本,便于恢复操作,脚本如下(在原库查询得出脚本):

    select 'set newname for datafile ' || a.FILE# || ' to "' || a.NAME || '";' from v$datafile a
    union all
    select 'set newname for tempfile ' || a.FILE# || ' to "' || a.NAME || '";' from v$tempfile a;

    得到结果为:

    SETNEWNAMEFORDATAFILE'||A.FILE#||'TO"'||A.NAME||'";'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------set newname for datafile 1 to "+DATA/jmrac/datafile/system.268.877470209";set newname for datafile 2 to "+DATA/jmrac/datafile/sysaux.269.877470211";set newname for datafile 3 to "+DATA/jmrac/datafile/undotbs1.270.877470213";set newname for datafile 4 to "+DATA/jmrac/datafile/users.271.877470213";set newname for datafile 5 to "+DATA/jmrac/datafile/example.279.877470401";set newname for datafile 6 to "+DATA/jmrac/datafile/undotbs2.280.877470779";set newname for tempfile 1 to "+DATA/jmrac/tempfile/temp.278.877470381";。。。。。。。。

    会将所有涉及到的数据文件全部显示,我这里就简单写个大概,得到以上脚本后进行简单的编辑:

    run{allocate channel ch1 device type disk;set newname for datafile 1 to "+DATA/jmrac/datafile/system.268.877470209";set newname for datafile 2 to "+DATA/jmrac/datafile/sysaux.269.877470211";set newname for datafile 3 to "+DATA/jmrac/datafile/undotbs1.270.877470213";set newname for datafile 4 to "+DATA/jmrac/datafile/users.271.877470213";set newname for datafile 5 to "+DATA/jmrac/datafile/example.279.877470401";set newname for datafile 6 to "+DATA/jmrac/datafile/undotbs2.280.877470779";set newname for tempfile 1 to "+DATA/jmrac/tempfile/temp.278.877470381";。。。。。。。。
    restore database;switch datafile all;switch tempfile all;}

    然后就可以在rman中运行以上修改好的 run 块(脚本)进行数据库恢复。此处我并没有生成关于redo日志的转换语句,因为我在讲redo日志转换放到 run脚本块中执行总会提示 +DATA开头的路径不存在,所以就省略了redo,但是我发现数据库恢复并未受影响,而且在恢复后redo日志路径已经转换了。

    9.在执行以上 run 脚本命令后,会提示报错:

    RMAN-00571: ===========================================================RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============RMAN-00571: ===========================================================RMAN-03002: failure of restore command at 03/25/2015 09:56:55RMAN-06026: some targets not found - aborting restore
    RMAN-06023: no backup or copy of datafile 4 found to restore
    RMAN-06023: no backup or copy of datafile 3 found to restore
    RMAN-06023: no backup or copy of datafile 2 found to restore
    RMAN-06023: no backup or copy of datafile 1 found to restore

    其实所有的备份都在,就是报这个错,然后查看资料,需要进行一下操作:

    RMAN> list incarnation;

    List of Database Incarnations 
    DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time


    1 1 JBDB 1285701182 PARENT 1 15-AUG-09 
    2 2 JBDB 1285701182 PARENT 945184 12-JUL-13

    然后又在原库上做同样的查询:

    RMAN> list incarnation;

    List of Database Incarnations 
    DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time


    1 1 JBDB 1285701182 PARENT 1 15-AUG-09 
    2 2 JBDB 1285701182 PARENT 945184 12-JUL-13

    然后在异地库重置 incarnation 为2:

    RMAN> reset database to incarnation 2;

    执行后再次执行 run 脚本块:

    RMAN> run{
    allocate channel ch1 device type disk;
    set newname for datafile 1 to "+DATA/jmrac/datafile/system.268.877470209";
    set newname for datafile 2 to "+DATA/jmrac/datafile/sysaux.269.877470211";
    set newname for datafile 3 to "+DATA/jmrac/datafile/undotbs1.270.877470213";
    set newname for datafile 4 to "+DATA/jmrac/datafile/users.271.877470213";
    set newname for datafile 5 to "+DATA/jmrac/datafile/example.279.877470401";
    set newname for datafile 6 to "+DATA/jmrac/datafile/undotbs2.280.877470779";
    set newname for tempfile 1 to "+DATA/jmrac/tempfile/temp.278.877470381";
    。。。。。。。。
    restore database;switch datafile all;switch tempfile all;}

    执行正常进行,恢复没有出现问题。

    10.数据库文件恢复后,执行recover database会报错,提示缺少归档文件:

    RMAN> recover database; Starting recover at 
    using channel ORA_DISK_1
    starting media recovery
    RMAN-00571: ===========================================================RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============RMAN-00571: ===========================================================RMAN-03002: failure of recover command at 
    RMAN-06053: unable to perform media recovery because of missing log
    RMAN-06025: no backup of archived log for thread 1 with sequence 71125 and starting SCN of 16888076231found to restore

    两种方式: 
    一是在原库找到归档文件然后传到异地库服务器,注册归档信息,然后再次recover恢复数据库,前提是归档文件能找到。

    注册归档信息(归档文件为 arch_71125_xxxx):

    RMAN> catalog archivelog ‘/data/rmanbackup/arch_71125_xxxx’;

    RMAN> recover database;

    (恢复时提示找不到一个unknow的归档,不影响恢复)

    二是按照提示的scn进行不完全恢复: 
    RAMN> run{ 
    set until scn 16888076231; 
    recover database; 
    }

    因为我归档文件并未找到,所以是第二种方式。

    11.恢复完成后登陆数据库然后打开数据库(resetlogs方式):

    SQL> alter database open resetlogs;

    Database altered.

    至此恢复完成。生产环境在恢复成功后一定要重新进行备份。

    以上是大概的操作过程,仅供参考,在生产环境执行时一定要慎之又慎,做好数据备份,如果有不同情况,也欢迎评论交流,共同学习。