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

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:19:00.000Z
> 分类: 其他
> 标签: AI, 数据库, Java
> 原文链接: http://117.50.162.249:3000/yun/articles/1539

---

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

> 来源: https://www.ucloud.cn/yun/129385.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:19

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

**点击上方“IT那活儿****”公众号，关注后了解更多内容，不管IT什么活儿，干就完了！！！**

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_000.png)

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_001.png)

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

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

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

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_002.png)

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_003.png)

**迁移过程**

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_004.png)

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_005.png)

备库已安装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;
```

启业务并验证业务。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_006.png)

## 本文作者：张红久（上海新炬王翦团队）

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

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129385/images/129385_007.png)