ORACLE-ADG方式迁移数据库-NBU中恢复数据文件
ORACLE ADG方式迁移数据库 NBU中恢复数据文件 点击上方“IT那活儿 ”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!! ORACLE有DATA GUARD(ADG)、EXPDP/IMPDP、RMAN、存储这四种迁移方式。 因为原数据库有28TB数据量,业务不接受停机时间过长,无法使用EXPDP/
来源: https://www.ucloud.cn/yun/129385.html 作者: IT那活儿 发布日期: 发布于2023-01-11 13:19
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
确认主库是否开启归档模式
SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination +ARCHOldest online log sequence 207743Next log sequence to archive 207746Current log sequence 207746
主库已经启归档模式,如果未启用需要先启用归档模式。
确认主库是否开启强制日志
SQL> select force_logging from v$database;FORCE_LOGGING---------------------------------------YES
主库已开启强制日志,如果没有启用则需要开启,开启后需要做一次数据库全备,在用NBU恢复时也需要用最新的全备进行恢复。
修改主库参数
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
查询主库日志组大小:
SQL> select THREAD#,BYTES/1024/1024 from v$log;THREAD# BYTES/1024/1024---------- ---------------1 10241 10242 10242 1024
查询日志组数量和路径:
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 02 ONLINE +DATA/ORCL/ONLINELOG/group_2.259.1061077801 NO 03 ONLINE +DATA/ORCL/ONLINELOG/group_3.270.1061083275 NO 04 ONLINE +DATA/ORCL/ONLINELOG/group_4.271.1061083275 NO 0
主库添加standby日志组(比原有日志组多一组,路径和大小跟原有日志组一致):
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并复制到备库:
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文件:
*.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(避免出现只能识别一个节点的密码文件的问题):
cd /oracle/app/oracle/product/19.0.0/dbhome_1/dbsscp orapworcl1 备库IP:/oracle/app/oracle/product/19.0.0/db/dbs/orapworclscp orapworcl1 节点2IP:/oracle/app/oracle/product/19.0.0/db/dbs/orapworcl2
Rman备份主库控制文件到备库恢复(将恢复出的控制文件绝对路径添加到pfile文件):
SQL> alter database create standby controlfile as /tmp/standby.ctl;scp /tmp/standby.ctl 备库IP:/tmp/standby.ctl;
备库恢复controlfile:
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;
备库创建相关目录:
mkdir -p /oracle/app/oracle/admin/orcl/adump
主库配置监听。
需要修改主库两节点的TNS文件:
ORCLDG =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 备库IP)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl)))
备库配置TNS:
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)))
开启备库监听:
lsnrctl start
主备库添加白名后reload监听:
reload
Tnsping测试:
tnsping ORCLtnsping ORCLDG
使用NBU方式恢复数据文件,将恢复语句添加到脚本放到后台执行(因为28T数据恢复需要1天以上,用闪存的话也要12个小时左右才能恢复完成,所以放到后台执行最为保险)。
vi nbu_rman.sh#!/bin/bashsource /home/oracle/.bash_profilerman 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参数:
SQL> alter system set log_archive_dest_state_2=enable scope=both;
备库开启MRP应用进程(等待与主库归档追平):
alter database recover managed standby database using current logfile disconnect from session;
在应用日志过程中会有部分日志没有在备份集中,日志会如下报错:
PR00 (PID:112926): FAL: Failed to request gap sequencePR00 (PID:112926): GAP - thread 1 sequence 211212-211250PR00 (PID:112926): DBID 1915883988 branch 1085828161PR00 (PID:112926): FAL: All defined FAL servers have been attemptedPR00 (PID:112926): -------------------------------------------------------------------------PR00 (PID:112926): Check that the CONTROL_FILE_RECORD_KEEP_TIME initializationPR00 (PID:112926): parameter is defined to a value thats sufficiently largePR00 (PID:112926): enough to maintain adequate log switch information to resolvePR00 (PID:112926): archived redo log gaps.PR00 (PID:112926): -------------------------------------------------------------------------
如果存现主库和NBU缺失部分归档文件无法完成在备库应用,可以选择主库最新的全备文件重新进行恢复。
需要在RMAN中catalog备份集:
RMAN> configure CHANNEL device type SBT_TAPE PARMS ENV=(NB_ORA_SERV=NBUmaster,NB_ORA_CLIENT=xxxx,NB_ORA_DISK_MEDIA_SERVER=xxxx);
在主库找到备库没有的备份集并注册到备库:
RMAN> list backup of archivelog all;
备库catalog备份集:
RMAN> catalog device type SBT_TAPE backuppiece arch_xxxx1;RMAN> catalog device type SBT_TAPE backuppiece arch_xxxx2;
catalog后恢复CHANNEL设置:
RMAN> CONFIGURE CHANNEL DEVICE TYPE SBT_TAPE CLEAR;
将缺的日志文件从NBU中恢复到备库:
- 恢复节点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的归档文件:
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应用进程:
alter database recover managed standby database cancel;alter database open;alter database recover managed standby database using current logfile disconnect from session;
查看数据库状态:
SQL> select OPEN_MODE from v$database;OPEN_MODE--------------------READ ONLY WITH APPLY
以上状态说明ORACLE ADG搭建成功。
将备库切换为读写模式完成迁移
等到割接时间先停业务,确认归档已追平后操作(停主库监听)。
备库操作:
alter database recover managed standby database cancel;shutdown immediate;startup mount;alter database flashback on;alter database open;
禁止传输日志:
alter system set log_archive_dest_state_2=defer;
确认当前状态:
select open_mode from v$database;OPEN_MODE--------------------READ ONLY
激活备库:
alter database activate standby database;
启业务并验证业务。

本文作者:张红久(上海新炬王翦团队)
本文来源:“IT那活儿”公众号
