项目场景:
搭建oarcle 18c多租户的OGG下游挖掘:
18c downstream 集成抽取注册不成功
问题描述
REGISTER EXTRACT extkafka DATABASE container (ORCLPDB) :
ERROR OGG-08221 Oracle GoldenGate Command Interpreter for Oracle: Cannot register or unregister EXTRACT EXTKAFKA because of the following SQL error: OCI Error ORA (status = 1722-ORA-01722: invalid number
start extkafka:
2022-03-29T10:03:51.088+0800 ERROR OGG-02032 Oracle GoldenGate Capture for Oracle, ext1.prm: Failed to set TRANLOGOPTIONS INTEGRATEDPARAMS (DOWNSTREAM_REAL_TIME_MINE, y).
2022-03-29T10:03:51.088+0800 ERROR OGG-02042 Oracle GoldenGate Capture for Oracle, ext1.prm: OCI Error 26,764.
2022-03-29T10:03:51.088+0800 ERROR OGG-01668 Oracle GoldenGate Capture for Oracle, ext1.prm: PROCESS ABENDING.
stats extkafka:
2022-04-01T10:36:30.683+0800 ERROR OGG-15149 Oracle GoldenGate Command Interpreter for Oracle: EXTRACT EXTKAFKA is initializing, please try the command later.
原因分析:
pdb未启用或者未开启补充日志,但其实深层原因是global_name、db_names混淆导致ogg无法判断要找哪个库,具体见下文
1、修改global_name
通常 Oracle Streams 使用 GLOBAL_NAME 而不是 DB_NAME 或 INSTANCE_NAME 或 SERVICE_NAME。
GLOBAL_NAME 是用于在分布式数据库环境中标识数据库的名称。这与 db_name 或 instance_name 甚至 service_name 不同。分布式数据库环境中的每个数据库都应该有一个唯一的全局名称。这些可能是 db_name、instance_name 或 service_name 相同,但 global_name 应该不同。创建的任何数据库链接都应与它所连接的数据库(远程数据库)的 GLOBAL_NAME 同名。
GLOBAL_NAME 不应与 init.ora 参数 GLOBAL_NAMES 混淆。如果此参数设置为 TRUE,则它会强制您使用与远程数据库的 GLOBAL_NAME 相同的 dblink 名称。
这就是在 TRY 1 中出现 ORA-02085 错误的原因。如果 GLOBAL_NAMES 设置为 FALSE,那么您可以根据需要使用 dblink 名称。但对于任何分布式环境(如 Streams),GLOBAL_NAMES 应始终设置为 TRUE。
您可以使用以下查询找到 global_name:
connect / as sysdba
select * from global_name;
--enforce global_names 参数
alter system set global_names=TRUE scope=both;
--change the global_name
update global_name set global_name='ORCL_S1';
--验证是否改变了
select * from global_name;
2、检查db_unique_name
各个参数的作用:https://www.cnblogs.com/yclizq/p/14701556.html
alter system set db_unique_name='ds' scope=spfile;
shutdown immediate;
startup
如果改完后,ogg无法建立连接,修改tns
因为service_name 随着db_unique_name 改变了
常用的一些视图和sql:
select dest_name,status,error from v$archive_dest
select * from V$GOLDENGATE_CAPTURE;
select * from v$goldengate_transaction
select * from v$archived_log;
select * from v$goldengate_message_tracking;
select * from DBA_CAPTURE;
select capture_name,STATUS,ERROR_MESSAGE from dba_capture;
select SERVER_NAME,CREATE_DATE,USER_COMMENT from SYS.XSTREAM$_SERVER;
select SERVER_NAME,STATUS,USER_COMMENT,START_SCN from DBA_XSTREAM_OUTBOUND;
select id,name from dba_logmnr_session;
select * from V$LOG_HISTORY
SELECT PID, TYPE, STATUS, HIGH_SCN from V$LOGSTDBY
select * from dba_registered_archived_log
select * from v$archive_dest_status
select
NAME,SEQUENCE#,STATUS,FIRST_TIME
from v$archived_log where FIRST_TIME > trunc(sysdate);
select * from dba_capture_parameters ;
select * from V$LOGSTDBY_STATE ;
select member from v$logfile;
查看是否有方法失效:
SELECT OWNER,OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE STATUS='INVALID';
--修复(不推荐,不要再生产库运行)
select 'alter '||object_type|| ' '||object_name||' compile;' from dba_objects where status = 'INVALID';
select 'alter '||object_type|| ' '||owner||'.'||object_name||' compile;' from dba_objects where status = 'INVALID';