# 迁移数据库时，什么才是真正的Oracle环境保持一致

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

---

# 迁移数据库时，什么才是真正的Oracle环境保持一致

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

迁移数据库时，什么才是真正的Oracle环境保持一致

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

## **故障背景**

最近在客户现场打一个CDB环境的oracle PSU补丁时，到了最后一步要执行datapatch -verbose时,遇到了如下报错:

```
Error reading descriptor from registry: Couldnt open encmap gbk.enc:No such file or directoryat /u01/app/oracle/product/19.0.0/dbhome_1/perl/lib/site_perl/5.28.1/x86_64-linux-thread-multi/XML/Parser.pm line 187.XML::Simple called at /u01/app/oracle/product/19.0.0/dbhome_1/sqlpatch/sqlpatch.pm line 7780.
```

最终排查出来的**原因是这个CDB库里的一个pdb是从其它库克隆过来的**，虽然克隆前版本是一致的，但补丁升级路径不一致。导致在执行最后一步datapatch -verbose时执行SQL时找不到相关补丁。以前的11G版本的Oracle是没有这个问题的。解决方案也很简单，从源CDB的db ORACLE\_HOME/sqlpatch目录下拷贝一份与目标CDB不一样的补丁号文件夹至目标CDB的每个节点相同目录下。

**那我们今天就来探讨一下在做数据库迁移、搭建ADG时什么才是真正的Oracle源环境与目标环境保持一致。**

## **源环境与目标环境保持一致**

# **1. 检查是否都启用LOCAL UNDO**

查看数据库是否开启 local undo ,如果 PROPERTY\_VALUE 为 true 表示已经开启。只推荐源、目标库都使用LOCAL UNDO，在迁移PDB前都转换为LOCAL UNDO后再进行迁移。

```
alter session set container=PDB_NAME;col PROPERTY_NAME for a25;col PROPERTY_VALUE for a25;select PROPERTY_NAME,PROPERTY_VALUE from database_properties where property_name=LOCAL_UNDO_ENABLED;
```

# **2. 检查源、目标CDB的组件是否一致**

源CDB的组件数量与目标CDB的组件一致或少，**特别是要注意**OJVM组件与RAC组件。

OJVM组件需要源、目标CDB都安装或都不安装。

RAC组件由RAC迁移到单机时，在pdb执行如下命令关闭RAC组件。

```
exec dbms_registry.OPTION_OFF(RAC);column comp_id format a20column comp_name format a30column version format a20column status format a15set pagesize 500set linesize 150SELECT COMP_ID,SUBSTR(comp_name, 1, 30) comp_name, SUBSTR(version, 1, 20) version, status FROM dba_registryORDER BY comp_name;set linesize 170set pagesize 5000col con_id for 99col con_name for a10col comp_id for a15col comp_name for a40col status for a10col version for a15;SELECT a.con_id,      decode(a.con_id, 1, cdb$root, b.name) AS con_name,      comp_id,      comp_name,      status,      version FROM cdb_registry a, v$pdbs bWHERE a.con_id = b.con_id(+)ORDER BY 1, 3;
```

# **3. 补丁更新的当前版本与补丁更新路径是否一致**

**1）**请尽量保持PDB迁移的源、目标CDB的补丁版本一致。

**2）**如遇到补丁更新的当前版本一致，但补丁更新的路径不一致，比如：当前源、目标CDB的当前补丁版本均为19.10,但源CDB的补丁升级路径为19.3-->19.4-->19.10。而目标CDB的补丁升级路径为19.3-->19.10，此时源、目标CDB的补丁更新路径为不一致。

当然只是PDB迁移，此时补丁更新的路径不一致并不影响。补丁更新的路径不一致影响的是目标CDB再次进行补丁更新的datapatch -verbose。**此时会遇到如下报错：**

```
Error reading descriptor from registry: Couldnt open encmap gbk.enc:No such file or directoryat /u01/app/oracle/product/19.0.0/dbhome_1/perl/lib/site_perl/5.28.1/x86_64-linux-thread-multi/XML/Parser.pm line 187.XML::Simple called at /u01/app/oracle/product/19.0.0/dbhome_1/sqlpatch/sqlpatch.pm line 7780.
```

**解决方案**：从源CDB的db ORACLE\_HOME/sqlpatch目录下拷贝一份与目标CDB不一样的补丁号文件夹至目标CDB的每个节点相同目录下。

```
set line 200col action_time for a40col status for a20col description for a100select patch_id,patch_type,action,status,action_time,description from dba_registry_sqlpatch;
```

# **4. oracle软件版本是否一致**

目标CDB的软件版本要比源CDB的软件高或一致。

# **5. 源、目标CDB所在的操作系统endianness是否一致**

源、目标CDB：

```
set line 300set pagesize 100COL PLATFORM_NAME FOR a40COL ENDIAN_FORMAT for a14SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM 3    ORDER BY PLATFORM_ID;PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT----------- ---------------------------------------- -------------- 1 Solaris[tm] OE (32-bit) Big 2 Solaris[tm] OE (64-bit) Big 3 HP-UX (64-bit) Big 4 HP-UX IA (64-bit) Big 5 HP Tru64 UNIX Little 6 AIX-Based Systems (64-bit) Big 7 Microsoft Windows IA (32-bit) Little 8 Microsoft Windows IA (64-bit) Little 9 IBM zSeries Based Linux Big10 Linux IA (32-bit) Little11 Linux IA (64-bit) Little12 Microsoft Windows x86 64-bit Little13 Linux x86 64-bit Little15 HP Open VMS Little16 Apple Mac OS Big17 Solaris Operating System (x86) Little18 IBM Power Based Linux Big19 HP IA Open VMS Little20 Solaris Operating System (x86-64) Little21 Apple Mac OS (x86-64) Little22 Linux OS (S64) Big21 rows selected.
```

# **6. 源、目标CDB库的数据库字符集、国家字符集是否一致**

**特别要注意**NLS\_NCHAR\_CHARACTERSET和NLS\_CHARACTERSET这两个参数。

- NLS\_CHARACTERSET这个参数，目标CDB的值应该与源CDB一致，或是源CDB的超集。
- NLS\_NCHAR\_CHARACTERSET这个参数，目标CDB的值应该与源CDB保持一致。

```
set linesize 300 pagesize 100col parameter for a40col value for a50select * from nls_database_parameters;
```

# **7. 源、目标CDB的db\_block\_size 参数是否一致**

**1）**克隆PDB时，注意检查源、目标CDB库的db\_block\_size是否一致。

**2）**注意检查源PDB的表空间是否有与db\_block\_size不一致的情况。

**解决方案**：克隆时设置涉及block size相关的参数。比如：

```
alter system set DB_16k_CACHE_SIZE=100M scope=both;
```

# **8. 其它方面**

```
SGA_TARGETCPU_COUNTPGA_AGGREGATE_TARGETPGA_AGGREGATE_LIMITSESSIONSJOB_QUEUE_PROCESSES
```

还有操作系统的内核参数和资源限制等等也要保持一致。

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

## 本文作者：聂文峰(上海新炬王翦团队）

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

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