事件背景:做DB升级,DB上有数据复制。
最终升级的清单如下:
源环境(升级)--字符集gbk | 目标环境 |
db:11.2.0.3 升级至19.17 | 11.2.0.3 |
goldengate 12.1.2.0升级为19.1.0.4 | 12.1升级至12.3 |
升级挑战:升级到19.17版本之后,goldengate必须升级到19c版本才能支持19c数据库,但是goldengate19c中抽取进程trail文件格式最低版本为12.2,goldengate 19c支持的最低DB版本是11.2.0.4;而目标环境的DB是11.2.0.3,goldengate版本须为12.2及以上,12.3是最后一个支持11.2.0.3的版本。
分步走:1.升级目标的goldengate 2.升级源的DB [ADB+dbua] 3.升级源的goldengate。
注意:
同步的数据有clob字段存放xml文件(encoding=utf-16)
goldengate 12c 12.2 新特性(updated)
1. trail文件中含metadata信息
2.加强的数据测量和性能监控。
ogg 12.2可以通过RESTFUL web service,支持对抽取、传输和投递进程的实时度量。针对抽取和投递进程的实时数据库及队列统计,针对传输进程的队列和网络统计。访问方式如下:
http://<hostname>:<manager port>/groups
前提是需要在GLOBALS文件中添加ENABLEMONITORING参数。并在GGSCI中create datastore.
3. 默认9位数字的队列文件 (前面的版本默认6位,支持调整为9位)
升级顺利,到goldengate这个环节遇到了较多情况,在目标端的replicat进程遇到报错:
报错 | 说明 |
ERROR OGG-03533 Conversion from character set zhs16gbk of source column TABCONFIGXML to character set UTF-16BE of target column TABCONFIGXML failed because the source column contains a character 'f7' at offset 1,843 that is not available in the target character set. | TABCONFIGXML列是clob类型,存放xml文件,encoding=utf-16 【待验证】可考虑加参数:REPLACEBADCHAR ESCAPE 或 COLCHARSET(PASSTHRU, COLNAME) |
ERROR OGG-02092 Unexpected condition in indexOutOfRangeError at line 48. Index 1 out of range. Number of elements: 1. | 附加信息: 2023-10-07 08:40:20 INFO OGG-06505 MAP resolved (entry emp.TB_abc_store): MAP "EMP"."TB_ABC_STORE",TARGET stot.TB_ABC_STORE,KEYCOLS(PK) 没有启用并行,也没开DDL复制,怀疑是个bug,与Bug 33388473 还是有差异。 |
ERROR OGG-01163 Bad column length (17) specified for column LASTPURID in table EMP.TB_COM_RELATION, maximum allowable length is 14. | 此报错是列的长度不一致。 附加信息:LASTPURID varchar2(14),表上无lob字段,通过user_tab_cols字典发现源(19c的库)比表实际多了以SYS_NC00**$的列,通过data_default字段核实到复合索引中基于列做了函数处理。 查到信息Doc ID 2421888.1 : If you are on OGG v12.3, You might be hitting bug 27078084. Please check with support to get the patch fix If you are on v12.2, you might be hitting Bug 28208161.Please check with support to get the patch fix 大概产生的原因是12.2开始tail有metadata,invisible column导致(Doc ID 2235957.1) |
ERROR OGG-01161 Bad column index (34) specified for table EMP.TB_ERSUM, max columns = 34. | 附加信息:TB_ERSUM 总共34个列 ,表结构一致。 在排查的过程中发现19c的库 user_tab_cols 比user_tab_columns多一个列名为 SYS_NC00031$ ,column_id没有值,data_default字段显示的是to_date(cdate) ,cdate是tb_ersum表的列,发现表上有函数索引,索引定义为TO_DATE(cdate,'yyyy-mm-dd') 疑似 The definition file is generated with "noextattr" option which excludes the internal columns. ./defgen paramfile ./dirprm/xxx.prm noextattr Doc ID 2699006.1 |
OGG-01161、OGG-02092 | |
在逐个击破的期间发现: ogg-02092\ogg-03533 通过 sourcedefs ./dirdef/tabdef.p OVERRIDE 来解决;
其他的通过加参数ASSUMETARGETDEFS OVERRIDE 来解决【跟表结构相关的报错】。
以上报错不是一次性报出来,运行过程中陆续出现。
最终统一使用 sourcedefs ./dirdef/tabdef.p OVERRIDE 来解决。
经核实到的资料信息:
Oracle中的SYS_NC00$ SYS_C000$ SYS_STU SYS_STS 和虚拟字段
SYS_NC00是一种系统自动生成的辅助列,在Oracle 12c以后大量出现在用户表中,其主要伴随一下这些功能出现:
- row archival;
- create index t_i on t(upper(v)); 函数索引
- alter table xxx add (b integer default 1); default 值
11g SYS_C000$ 伴随以下功能出现 :各种未指定名字的约束。
留下悬疑:对于自动生成的列,尝试用invisible column来处理,处理过,由于环境较复杂,没有足够多的时间来验证,想要构建测试环境,需要投入的各种资源成本也较高,未进行深究。