迁移数据库时,什么才是真正的Oracle环境保持一致
迁移数据库时,什么才是真正的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那活儿”公众号
