暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

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

IT那活儿 2022-11-08
908

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

故障背景

最近在客户现场打一个CDB环境的oracle PSU补丁时,到了最后一步要执行datapatch -verbose时,遇到了如下报错:
Error reading descriptor from registry: Couldn't open encmap gbk.enc:
No such file or directory
at 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 a20
column comp_name format a30
column version format a20
column status format a15
set pagesize 500
set linesize 150
SELECT COMP_ID,SUBSTR(comp_name, 1, 30) comp_name, SUBSTR(version, 1, 20) version, status
 FROM dba_registry
ORDER BY comp_name;

set linesize 170
set pagesize 5000
col con_id for 99
col con_name for a10
col comp_id for a15
col comp_name for a40
col status for a10
col 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 b
WHERE 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: Couldn't open encmap gbk.enc:
No such file or directory
at /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 200
col action_time for a40
col status for a20
col description for a100
select patch_id,patch_type,action,status,action_time,description from dba_registry_sqlpatch;

4. oracle软件版本是否一致

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

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

源、目标CDB:
set line 300
set pagesize 100
COL PLATFORM_NAME FOR a40
COL ENDIAN_FORMAT for a14
SELECT 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 Big
10 Linux IA (32-bit) Little
11 Linux IA (64-bit) Little
12 Microsoft Windows x86 64-bit Little
13 Linux x86 64-bit Little
15 HP Open VMS Little
16 Apple Mac OS Big
17 Solaris Operating System (x86) Little
18 IBM Power Based Linux Big
19 HP IA Open VMS Little
20 Solaris Operating System (x86-64) Little
21 Apple Mac OS (x86-64) Little
22 Linux OS (S64) Big

21 rows selected.

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

特别要注意NLS_NCHAR_CHARACTERSETNLS_CHARACTERSET这两个参数。

  • NLS_CHARACTERSET这个参数,目标CDB的值应该与源CDB一致,或是源CDB的超集。
  • NLS_NCHAR_CHARACTERSET这个参数,目标CDB的值应该与源CDB保持一致。
set linesize 300 pagesize 100
col parameter for a40
col value for a50
select * 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_TARGET
CPU_COUNT
PGA_AGGREGATE_TARGET
PGA_AGGREGATE_LIMIT
SESSIONS
JOB_QUEUE_PROCESSES

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


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

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

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论