使用 OGG 21c 遇到的几个问题

2022-12-07 14:10:58 浏览数 (1)

作者 | JiekeXu

来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)

如需转载请联系授权

大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看使用 OGG 21c 遇到的几个问题

从去年开始便一直使用的是 ogg 19c,但今年年中时候发现官方居然将 Linux x64 位的 ogg 下载链接下架了,不知为何无法下载到这个版本了(PS:有需要的前去我的墨天轮地址下载:https://www.modb.pro/download/761440),微服务版本也没有了,现在只能从官网看到 21c 的安装包。

代码语言:javascript复制
http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html

取而代之的是如下 21.3 的安装包。

查看 OGG 19c 版本的生命周期呢也和数据库是一样的长期支持版本,怎么突然就下载不到了呢,郁闷……

所以呢,也紧跟官方步伐,试试 OGG 21c,安装方法无差别,据说可以远程复制,不用和数据库绑定到同一主机了,可以使用中间机单独部署,然后捕获源端日志变更,应用到远程目标端,比较方便,也有很多新特性,具体看下方官方给出的片子。

OGG 21c 新特性

OGG 21c 中的主要新功能

  • 多个数据库版本的简化安装 单个独立部署,捆绑数据库客户端并支持从 11.2 到 21c 的所有数据库版本。
  • 自治数据库 ATP/ADW 捕获(仅限共享数据库)
  • 更安全:Kerberos Authentication

不过下面遇到的问题均是和数据库同主机同用户部署的,让我们来一起看看都有哪些吧:

1)dblogin 无法登录到 OGG,ORA-12154 TNS 错误

不管我在11g 中,还是在新的 19c 中都会出现这个问题,最初是在八月初的时候打算使用 ogg 21c 来捕获11g 的数据,但安装完后就报了登录错误的问题,总感觉是环境变量的问题,反复查找了半天,终究没有找到问题所在,由于时间紧,故当时采取的措施就是先卸载了 21c 用 ogg 19c 保证没有问题。

代码语言:javascript复制
GGSCI (oracle19c) 18> dblogin userid ogg@TEST,password ogg

2022-10-14 17:07:23  INFO    OGG-03542  Failed to connect to the database. Verify that the connection string and following environment variables are correct: 
LD_LIBRARY_PATH = /u01/app/oracle/product/19.0.0/dbhome_1/lib:/lib:/usr/lib.
Error: OCI Error ORA (status = 12154-ORA-12154: TNS:could not resolve the connect identifier specified
)

GGSCI (oracle19c) 19> dblogin userid ogg,password ogg

2022-10-14 17:07:47  INFO    OGG-03542  Failed to connect to the database. Verify that the connection string and following environment variables are correct: 
LD_LIBRARY_PATH = /u01/app/oracle/product/19.0.0/dbhome_1/lib:/lib:/usr/lib.
Error: OCI Error ORA (status = 12545-ORA-12545: Connect failed because target host or object does not exist
)

查看认证列表,OGG21c 对 11.2.0.4 版本的数据库也是支持的。

出现问题的原因:

OGG 21c 集成了轻量级客户端工具 instantclient,所以才可以独立部署,远程捕获。不然需要借助客户端 TNS_ADMIN 配置的连接串远程登录。

代码语言:javascript复制
$ tree instantclient
instantclient
 -- libclntshcore.so.21.1
 -- libclntsh.so.21.1
 -- libnnz21.so
 -- libocci.so.21.1
 -- libociei.so
 -- libocijdbc21.so
 -- liboramysql.so
 -- libsqlplusic.so
 -- libsqlplus.so
 -- sqlplus
解决办法:

修改环境变量

修改 .bash_profile 环境变量,指定 TNS_ADMIN 的具体路径,然后在此路径下配置 tns 远程连接地址即可使用 dblogin userid user@tns passwd 登录到数据库。

export TNS_ADMIN=$ORACLE_HOME/network/admin

Goldengate DBLOGIN Issue OCI Error ORA (status = 12545-ORA-12545 (Doc ID 2847434.1) 对于 GoldenGate 21c,该软件包含数据库客户端库。优点是您只有一个 GoldenGate 软件可以连接到 11gR2、12c、18c、19c 和 21g 数据库版本。 在早期版本(19c 及更低版本)中,每个数据库版本都有一个特定的 GoldenGate 构建。此外,如果您在中间层(HUB 模型)中运行 GoldenGate,则不必安装 数据库客户端软件。因此,您必须使用 TNS 连接限定符(别名)来连接到任何数据库。这意味着 TNS 别名的相应信息是 tnsnames.ora 的一部分。通常,您的地址条目包含主机名、端口、协议和服务名称等信息。 GGSCI 1> dblogin userid user@ABCD 密码

当然如果 ogg 21c 独立于数据库单独部署时,又因为集成了客户端,所以也不需要单独安装 客户端,配置免密登录即可。在 ogg 12c 及以上的版本中, 增强了数据的安全性, 提供了密码登录功能,具体可以这样:

代码语言:javascript复制
---创建身份证明
ggsci
add credentialstore
alter credentialstore add user ogg@192.168.76.15:11521/test,password ogg alias source_11g
alter credentialstore add user ogg@192.168.221.75:11521/test4db,password ogg alias target_19c
INFO CREDENTIALSTORE

--登录数据库
dblogin useridalias source_11g

2) ogg 19c 启动捕获进程运行一段时间后报错 OGG-00663 OCI Error ORA-03113

由于前面使用了 ogg 19c,在正常捕获期间源端 ext1 有这个错误,OGG-00663 OCI Error ORA-03113: end-of-file on communication channel,可直接 start ext1 ,但半小时不到又报同样错。这里顺便说下这并不是 OGG 的问题,只是运行期间刚好出现,那就一起说说。

问题原因

感觉是数据库和客户端交互时直接中断了,类似于直接在数据库服务器上杀掉所有会话,这显然是不太可能的,即使是测试环境我们也没有人去这么做。网络方面也不会去动这块,再说了也是位于同一主机,那么问题可能还是出在配置上。

解决办法

先按照 MOS 的参考建议修改系统参数,原先这三个意味着 TCP 保持连接进程在发送第一个保持连接探测之前要为套接字活动等待两个小时(7200秒),然后每 75 秒重新发送一次。只要 TCP/IP 套接字通信在进行并处于活动状态,就不需要保持连接包。将以下三个参数间隔值调小一些:

vim /etc/sysctl.confnet.ipv4.tcp_keepalive_time = 60 ###1 分钟后开始发送 keepalive 空包net.ipv4.tcp_keepalive_intvl = 10 ###在第一次保持连接探测后每 10 秒重新发送一次net.ipv4.tcp_keepalive_probes = 6 ###在连接超时之前要发送的探测数量

sysctl -p 使其生效。

参考文档:Extract Executable Failed to Abend during a Network Outage (文档 ID 2699295.1)

后面大概又运行了半个小时多的样子,又中断了,报错还是一样,看来还是没有得到解决。继续排查中发现,在 sqlnet.ora 配置中有如下一些配置,最后两行参数不知道何时加的,谁加上去的,已经不得而知了。先注释掉 sqlnet.ora 这两参数后面问题就解决了,一直运行正常。

那么这两个参数是什么意思呢?官方文档上有个简单的解释。

关于 SQLNET.RECV_TIMEOUT 和 SQLNET.SEND_TIMEOUT ,我们可以在客户端和服务器端配置它们。 例如,如果我们在服务器端设置 SQLNET.RECV_TIMEOUT=120 ,这意味着如果数据库在 120 秒内没有收到来自客户端的请求包交换,则与该客户端的连接被终止,超时。如果 SQLNET.SEND_TIMEOUT=120 且数据库无法在 120 秒内完成向客户端的发送操作,则连接超时。例如,如果客户端异常关闭,数据库试图发送的信息在 120s 内没有收到响应,则操作超时。很大原因是有人之前设置过这两个参数又没有及时取消才导致了 OGG 在捕获一段时间后中断。

代码语言:javascript复制
--有关这些参数的更多信息,请参阅以下文档:
http://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm#CIHCCCHD
http://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm#NETRF182
http://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm#NETRF227

SQLNET.RECV_TIMEOUT:指定数据库服务器在建立连接后等待客户端数据的时间(以秒为单位)。客户端必须在时间间隔内发送一些数据。对于客户端偶尔或异常关闭的环境,建议设置该参数。如果客户端没有在指定的时间内发送任何数据,那么数据库服务器会记录 ORA-12535: TNS:operation timed out 和 ORA-12609: TNS: Receive timeout occurred 在 sqlnet.log 文件的消息。如果没有此参数,数据库服务器可能会继续等待来自可能已关闭或遇到困难的客户端的数据。

您也可以在客户端设置此参数,以指定客户端在连接建立后等待来自数据库服务器的响应数据的时间,以秒为单位。如果没有这个参数,客户端可能会等待很长一段时间来等待来自请求饱和的数据库服务器的响应。如果您选择设置该值,则将该值设置为初始低值并根据系统和网络容量进行调整。如有必要,将此参数与 SQLNET.SEND_TIMEOUT 参数一起使用。

SQLNET.SEND_TIMEOUT:指定数据库服务器在建立连接后完成向客户端发送操作的时间(以秒为单位)。对于客户端偶尔或异常关闭的环境,建议设置该参数。如果数据库服务器无法在指定的时间内完成发送操作,那么它会记录 ORA-12535: TNS:operation timed out 和ORA-12608: TNS: Send timeout occurred 消息到 sqlnet.log 文件。如果没有此参数,数据库服务器可能会继续向由于计算机停机或忙碌状态而无法接收数据的客户端发送响应。

您也可以在客户端设置此参数,以指定客户端在连接建立后完成向数据库服务器发送操作的时间,以秒为单位。如果没有这个参数,客户端可能会继续向已经被请求饱和的数据库服务器发送请求。如果您选择设置该值,则将该值设置为初始低值并根据系统和网络容量进行调整。如有必要,将此参数与 SQLNET.RECV_TIMEOUT 参数一起使用。

3) ogg 21c EXTRACT 进程无法正常启动报错 OGG-02022

当在源端 11g 配置好 extract 进程后,无法启动,查看日志则报此错误“ERROROGG-02022 Logmining server does not exist on this Oracle database",在源库找不到日志挖掘服务。这个问题比较简单,是由于没有将 extract 注册到数据库。 使用如下命令注册。

代码语言:javascript复制
注意:先要登录到数据库。

GGSCI (oggtest) 4> add credentialstore

Credential store created.

GGSCI (oggtest) 5> alter credentialstore add user ogg@192.168.76.15:11770/jiekexu,password test alias source_11g

Credential store altered.

GGSCI (oggtest) 6> info credentialstore

Reading from credential store:

Default domain: OracleGoldenGate

  Alias: source_11g
  Userid: ogg@192.168.76.15:11770/jiekexu

GGSCI (oggtest) 7> dblogin useridalias source_11g
Successfully logged into database.


GGSCI (oggtest as ogg@jiekexu) 9> register extract ext1 database

2022-10-14 20:55:31  INFO    OGG-02003  Extract group EXT1 successfully registered with database at SCN 607680081.

--添加进程 EXTRACT 
ADD EXTRACT ext2  INTEGRATED TRANLOG,BEGIN NOW
add exttrail /ogg21c/dirdat/T4, extract ext2, megabytes 1024

--删除进程 EXTRACT 
UNREGISTER extract ext2 database
delete extract EXT2

4) ogg 21c EXTRACT 进程无法正常启动报错 OGG-02912

当在源端 11g 配置好 extract 进程后,无法启动查看日志则报此错误“ERROR OGG-02912 Patch 17030189 is required on your Oracle mining database for trail format RELEASE 12.2 or later”

在 MOS 中,文档 Doc ID 2304095.1 “ERROR OGG-02912 Patch 17030189 is required on your Oracle mining database for trail format RELEASE 12.2 or later” 的描述中. 在 OGG 家目录下存在 “prvtlmpg.plb” 脚本,可以在源库执行 @/ogg21c/prvtlmpg.plb 此问题也可以解决。版本 12.2 或更高版本的 挖掘数据库需要补丁 17030189。

当然按照提示找到 17030189 这个补丁,运用到数据库中也是可以解决这个问题的。下面就来说说这种小补丁的更新和回退方法。 到 MOS 上下载这个补丁上传到源端数据库服务器。

代码语言:javascript复制
$ unzip  p17030189_11204170418_Generic.zip -d <PATCH_TOP_DIR>
$ export PATH=.:$PATH:$HOME/.local/bin:$HOME/bin:$ORACLE_HOME/OPatch:$ORACLE_HOME/bin
$ opatch lsinventory
$ opatch version
$ cd <PATCH_TOP_DIR>/17030189 
$ opatch prereq CheckConflictAgainstOHWithDetail -ph ./    --该报告将指出与此补丁冲突的补丁,以及当前17030189为超集的补丁。

安装补丁

  1. 将当前目录设置为补丁所在的目录,然后输入以下命令运行OPatch实用程序:
代码语言:javascript复制
$ cd <PATCH_TOP_DIR>/17030189
$ opatch apply

2.运行命令验证补丁是否安装成功。

代码语言:javascript复制
$ opatch lsinventory

以下步骤将修改后的 SQL 文件加载到数据库中。对于 RAC 环境,只在一个节点上执行这些步骤。

  1. 对于在打了补丁的主服务器上运行的每个数据库实例,使用 SQL*Plus 连接到数据库。以 SYSDBA 身份连接并运行以下脚本,如下所示:
代码语言:javascript复制
$ sqlplus / nolog 
SQL > connect / as sysdba
SQL> @?/sqlpatch/17030189/postinstall.sql

2.检查输出是否有错误。

卸载补丁
  1. 执行如下命令卸载补丁。
代码语言:javascript复制
$ opatch rollback -id 17030189

2.确保您验证了 Inventory,并将输出与补丁安装之前运行的输出进行比较,并重新应用作为该补丁应用的一部分而回滚的任何补丁。验证库存,运行命令如下:

代码语言:javascript复制
$ opatch lsinventory
$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> @?/sqlpatch/17030189/postdeinstall.sql
SQL> select * from registry$history order by id;

0 人点赞