资讯专栏INFORMATION COLUMN

ORACLE-ADG方式迁移数据库-NBU中恢复数据文件

IT那活儿 / 1000人阅读
ORACLE-ADG方式迁移数据库-NBU中恢复数据文件
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

  

ORACLE有DATA GUARD(ADG)、EXPDP/IMPDP、RMAN、存储这四种迁移方式。

因为原数据库有28TB数据量,业务不接受停机时间过长,无法使用EXPDP/IMPDP、RMAN、存储方式完成数据库迁移,所以本次迁移使用ADG方式迁移数据库

数据库做了NBU备份,搭建ADG时使用NBU方式恢复数据文件,这样可以更好的减少原数据库网络带宽的占用。搭建好ADG后只需要将备库切换为主库,业务连接新库就完成迁移,停机时间较短。



 迁移过程


备库已安装Oracle、grid软件并将补丁升级到与主库一致,创建好DATA和ARCH磁盘组,用于恢复数据文件的NBU已配置完成。
  • 主库环境

    操作系统:Red Hat 7.8

    Oracle和grid版本 :19.11.0.0.210420

    数据库架构:RAC

    存储:ASM

    备份:NBU
  • 备库环境

    操作系统:Red Hat 7.9

    Oracle和grid版本:19.11.0.0.210420

    数据库架构:单机

    存储:ASM

确认主库是否开启归档模式

</>复制代码

  1. SQL> archive log list;

    Database log mode Archive Mode
    Automatic archival Enabled
    Archive destination +ARCH
    Oldest online log sequence 207743
    Next log sequence to archive 207746
    Current log sequence 207746

主库已经启归档模式,如果未启用需要先启用归档模式。

确认主库是否开启强制日志

</>复制代码

  1. SQL> select force_logging from v$database;

    FORCE_LOGGING
    ---------------------------------------
    YES

主库已开启强制日志,如果没有启用则需要开启,开启后需要做一次数据库全备,在用NBU恢复时也需要用最新的全备进行恢复。

修改主库参数

</>复制代码

  1. alter system set log_archive_config=DG_CONFIG=(orcl,orcladg) scope=both;
    alter system set log_archive_dest_1=LOCATION=+ARCH valid_for=(all_logfiles,all_roles) db_unique_name=orcl scope=both;
    alter system set log_archive_dest_2=SERVICE=orcladg lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcladg scope=both;
    alter system set log_archive_dest_state_2=defer scope=both;
    alter system set fal_client=orcl scope=both;
    alter system set fal_server=orcladg scope=both;
    alter system set standby_file_management=auto scope=both;

主库添加standby logfile

查询主库日志组大小:

</>复制代码

  1. SQL> select THREAD#,BYTES/1024/1024 from v$log;
    THREAD# BYTES/1024/1024
    ---------- ---------------
    1 1024
    1 1024
    2 1024
    2 1024

查询日志组数量和路径:

</>复制代码

  1. col MEMBER for a80;
    col TYPE for a10;
    set lin240 pages999;
    select * from v$logfile;
    GROUP# STATUS TYPE MEMBER IS_ CON_ID
    ------ ------ ------ ----------------------------------------- --- -------
    1        ONLINE +DATA/ORCL/ONLINELOG/group_1.258.1061077801  NO   0
    2        ONLINE +DATA/ORCL/ONLINELOG/group_2.259.1061077801  NO   0
    3        ONLINE +DATA/ORCL/ONLINELOG/group_3.270.1061083275  NO   0
    4        ONLINE +DATA/ORCL/ONLINELOG/group_4.271.1061083275  NO   0
主库添加standby日志组(比原有日志组多一组,路径和大小跟原有日志组一致):

</>复制代码

  1. alter database add standby logfile thread 1 group 5 +DATA size 1024m;
    alter database add standby logfile thread 1 group 6 +DATA size 1024m;
    alter database add standby logfile thread 1 group 7 +DATA size 1024m;
    alter database add standby logfile thread 2 group 8 +DATA size 1024m;
    alter database add standby logfile thread 2 group 9 +DATA size 1024m;
    alter database add standby logfile thread 2 group 10 +DATA size 1024m;
主库创建pfile并复制到备库:

</>复制代码

  1. create pfile=/tmp/init.ora from spfile;
    scp /tmp/init.ora 备库IP:/oracle/app/oracle/product/19.0.0/db/dbs/initorcl.ora
备库修改initorcl.ora文件:

</>复制代码

  1. *.audit_file_dest=/oracle/app/oracle/admin/orcl/adump
    *.audit_trail=NONE
    *.cluster_database=FALSE
    *.compatible=19.0.0
    *.control_files=+data/ORCL/CONTROLFILE/xxxx
    *.db_block_size=8192
    *.db_cache_size=60129542144
    *.db_create_file_dest=+DATA
    *.db_domain=
    *.db_files=2000
    *.db_name=orcl
    *.db_unique_name=orcldg
    *.diagnostic_dest=/oracle/app/oracle
    *.dispatchers=(PROTOCOL=TCP) (SERVICE=orclXDB)
    *.event=28401 trace name context forever,level 1
    *.java_jit_enabled=TRUE
    *.fal_client=orcldg
    *.fal_server=orcl
    *.log_archive_config=DG_CONFIG=(orcldg,orcl)
    *.log_archive_dest_1=LOCATION=+arch
    *.log_archive_dest_3=SERVICE=orcl lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcl
    *.log_archive_dest_state_2=ENABLE
    *.open_cursors=1000
    *.parallel_max_servers=128
    *.parallel_min_servers=32
    *.parallel_servers_target=128
    *.pga_aggregate_target=27068989440
    *.processes=3000
    *.remote_login_passwordfile=exclusive
    *.service_names=orcl
    *.session_cached_cursors=200
    *.sessions=3305
    *.sga_target=100G
    *.standby_file_management=auto
    *.undo_retention=3600
    *.undo_tablespace=UNDOTBS1
将节点1复制主库密码文件到备和节点2(避免出现只能识别一个节点的密码文件的问题):

</>复制代码

  1. cd /oracle/app/oracle/product/19.0.0/dbhome_1/dbs

    scp orapworcl1 备库IP:/oracle/app/oracle/product/19.0.0/db/dbs/orapworcl
    scp orapworcl1 节点2IP:/oracle/app/oracle/product/19.0.0/db/dbs/orapworcl2
Rman备份主库控制文件到备库恢复(将恢复出的控制文件绝对路径添加到pfile文件):

</>复制代码

  1. SQL> alter database create standby controlfile as /tmp/standby.ctl;
    scp /tmp/standby.ctl 备库IP:/tmp/standby.ctl;
备库恢复controlfile:

</>复制代码

  1. rman target /
    startup pfile=/oracle/app/oracle/product/19.0.0/db/dbs/initorcl.ora nomount;
    RMAN> restore standby controlfile to +DATA FROM /tmp/standby.ctl;
备库创建相关目录:

</>复制代码

  1. mkdir -p /oracle/app/oracle/admin/orcl/adump
主库配置监听。
需要修改主库两节点的TNS文件:

</>复制代码

  1. ORCLDG =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 备库IP)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orcl)
    )
    )
备库配置TNS:

</>复制代码

  1. ORCL =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 节点1IP)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 节点2IP)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orcl)
    )
    )

    ORCLDG =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 备库IP)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orcl)
    )
    )
开启备库监听:

</>复制代码

  1. lsnrctl start

主备库添加白名后reload监听:

</>复制代码

  1. reload

Tnsping测试:

</>复制代码

  1. tnsping ORCL
    tnsping ORCLDG
使用NBU方式恢复数据文件,将恢复语句添加到脚本放到后台执行(因为28T数据恢复需要1天以上,用闪存的话也要12个小时左右才能恢复完成,所以放到后台执行最为保险)。

</>复制代码

  1. vi nbu_rman.sh

    #!/bin/bash
    source /home/oracle/.bash_profile

    rman target / <run{
    ALLOCATE CHANNEL c0 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    ALLOCATE CHANNEL c1 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    ALLOCATE CHANNEL c2 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    ALLOCATE CHANNEL c3 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    ALLOCATE CHANNEL c4 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    ALLOCATE CHANNEL c5 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    restore database;
    recover database;
    RELEASE CHANNEL c0;
    RELEASE CHANNEL c1;
    RELEASE CHANNEL c2;
    RELEASE CHANNEL c3;
    RELEASE CHANNEL c4;
    RELEASE CHANNEL c5;
    }
    EOF
数据文件恢复完成后需要将归档追平才能OPEN数据库
主库修改log_archive_dest_state_2参数:

</>复制代码

  1. SQL> alter system set log_archive_dest_state_2=enable scope=both;
备库开启MRP应用进程(等待与主库归档追平):

</>复制代码

  1. alter database recover managed standby database using current logfile disconnect from session;
在应用日志过程中会有部分日志没有在备份集中,日志会如下报错:

</>复制代码

  1. PR00 (PID:112926): FAL: Failed to request gap sequence
    PR00 (PID:112926): GAP - thread 1 sequence 211212-211250
    PR00 (PID:112926): DBID 1915883988 branch 1085828161
    PR00 (PID:112926): FAL: All defined FAL servers have been attempted
    PR00 (PID:112926): -------------------------------------------------------------------------
    PR00 (PID:112926): Check that the CONTROL_FILE_RECORD_KEEP_TIME initialization
    PR00 (PID:112926): parameter is defined to a value thats sufficiently large
    PR00 (PID:112926): enough to maintain adequate log switch information to resolve
    PR00 (PID:112926): archived redo log gaps.
    PR00 (PID:112926): -------------------------------------------------------------------------

如果存现主库和NBU缺失部分归档文件无法完成在备库应用,可以选择主库最新的全备文件重新进行恢复。

需要在RMAN中catalog备份集:

</>复制代码

  1. RMAN> configure CHANNEL device type SBT_TAPE PARMS ENV=
    (NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx);
在主库找到备库没有的备份集并注册到备库:

</>复制代码

  1. RMAN> list backup of archivelog all;
备库catalog备份集:

</>复制代码

  1. RMAN> catalog device type SBT_TAPE backuppiece arch_xxxx1;
    RMAN> catalog device type SBT_TAPE backuppiece arch_xxxx2;
catalog后恢复CHANNEL设置:

</>复制代码

  1. RMAN> CONFIGURE CHANNEL DEVICE TYPE SBT_TAPE CLEAR;
将缺的日志文件从NBU中恢复到备库:
  • 恢复节点1的归档文件:

</>复制代码

  1. run {
    ALLOCATE CHANNEL c0 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    ALLOCATE CHANNEL c1 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    restore archivelog sequence between xxxx1 and xxxx8;
    RELEASE CHANNEL c0;
    RELEASE CHANNEL c1;
    }
  • 恢复节点2的归档文件:

</>复制代码

  1. run{
    ALLOCATE CHANNEL c1 TYPE SBT_TAPE SEND NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx;
    restore archivelog sequence between xxxx2 and xxxx6 thread 2;
    RELEASE CHANNEL c1;
    }
确认同步后,打开数据库并重新启动MRP应用进程:

</>复制代码

  1. alter database recover managed standby database cancel;
    alter database open;
    alter database recover managed standby database using current logfile disconnect from session;
查看数据库状态:

</>复制代码

  1. SQL> select OPEN_MODE from v$database;
    OPEN_MODE
    --------------------
    READ ONLY WITH APPLY

以上状态说明ORACLE ADG搭建成功。

将备库切换为读写模式完成迁移

等到割接时间先停业务,确认归档已追平后操作(停主库监听)。
备库操作:

</>复制代码

  1. alter database recover managed standby database cancel;
    shutdown immediate;
    startup mount;
    alter database flashback on;
    alter database open;
禁止传输日志:

</>复制代码

  1. alter system set log_archive_dest_state_2=defer;
确认当前状态:

</>复制代码

  1. select open_mode from v$database;
    OPEN_MODE
    --------------------
    READ ONLY
激活备库:

</>复制代码

  1. alter database activate standby database;
启业务并验证业务。

本文作者:张红久(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129385.html

相关文章

  • 利用Oracle ADG升级11.2.0.4到19.8案例分享

    利用Oracle ADG升级11.2.0.4到19.8案例分享 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75...

    IT那活儿 评论0 收藏1380
  • ElasticSearch索引跨集群迁移

    ElasticSearch索引跨集群迁移 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ...

    不知名网友 评论0 收藏1747
  • MySQL数据升级迁移填坑记

    MySQL数据库升级迁移填坑记 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; mar...

    IT那活儿 评论0 收藏1960
  • 孔明说天有不测风云,我说无灾备不上云

    摘要:题记三国时赤壁鏖战,孔明说,天有不测风云,欲破曹公,宜用火攻,万事俱备,只欠东风。现在公共云混战,我想说,无灾备不上云,保护数据,未雨绸缪,带了雨伞,还需雨衣。题记:三国时赤壁鏖战,孔明说,天有不测风云,欲破曹公,宜用火攻,万事俱备,只欠东风。现在公共云混战,我想说,无灾备不上云,保护数据,未雨绸缪,带了雨伞,还需雨衣。未雨绸缪,到底是带雨伞还是雨衣呢?时代在变,人的追求也在变。随着公共云对...

    stormgens 评论0 收藏0
  • ERP物理机迁移至阿里云实践

    摘要:经过与阿里云工程师的沟通决定使用阿里云的迁云工具来完成这次迁移。出现之后,打开阿里云控制台,你会发现多了三个快照和一个镜像然后用这个镜像直接购买实例就可以了。 摘要: ERP物理机迁移至阿里云实践 机房选型 随着公司的不断发展,业务量逐渐增大,对信息化的要求也越来越高,随之对信息部的要求也越来越多,为此公司决定对现有的信息系统进行升级改造. ERP物理机迁移至阿里云实践 一、机房选...

    songjz 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<