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

AI 摘要 / TL;DR

迁移数据库时,什么才是真正的Oracle环境保持一致 点击上方“IT那活儿 ”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!! 故障背景 最近在客户现场打一个CDB环境的oracle PSU补丁时,到了最后一步要执行datapatch verbose时,遇到了如下报错: 最终排查出来的 原因是这个CDB库里

来源: 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

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

本文作者:聂文峰(上海新炬王翦团队)

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