Flink CDC里背景ORACLE 19c com.ververica:flink-connector-oracle-cdc:2.4.0
CDB$ROOT 挂了两个PDB,一个TESTPDB,一个JRPDB,我只用TESTPDB中的数据,用不到JRPDB,所以JRPDB没有开启,那么会报如下错误,如何才能在JRPDB不开启的状态下让下面的指令又能成功呢?
Caused by: Error : 16331, Position : 0, Sql = BEGIN sys.dbms_logmnr.start_logmnr(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.NO_ROWID_IN_STMT);END;, OriginalSql = BEGIN sys.dbms_logmnr.start_logmnr(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.NO_ROWID_IN_STMT);END;, Error Msg = ORA-16331: container "JRPDB" is not open
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Flink CDC连接Oracle 19c数据库时,如果遇到ORA-16331: container "JRPDB" is not open
错误,说明当前的LogMiner操作尝试访问未开启的PDB(JRPDB)。这是因为LogMiner默认会尝试扫描所有容器(包括CDB$ROOT和所有挂载的PDB),而未开启的PDB会导致此错误。
要解决这个问题,可以通过以下方法确保LogMiner仅作用于您需要的PDB(TESTPDB),从而避免对未开启的PDB(JRPDB)进行操作:
在Oracle 19c中,可以通过设置DBMS_LOGMNR.CONTENTS_ONLY
选项,限制LogMiner仅扫描指定的PDB。具体步骤如下:
修改Flink CDC配置
在Flink CDC连接器的配置中,添加或调整以下参数以指定目标PDB(TESTPDB):
'debezium.database.pdb.name'='TESTPDB'
这个参数告诉Debezium(Flink CDC底层依赖的工具)仅从指定的PDB中读取数据,避免扫描其他未开启的PDB。
验证PDB状态
确保目标PDB(TESTPDB)处于OPEN
状态。可以通过以下SQL语句检查PDB的状态:
SELECT name, open_mode FROM v$pdbs;
如果TESTPDB未处于OPEN
状态,可以使用以下命令将其打开:
ALTER PLUGGABLE DATABASE TESTPDB OPEN;
调整LogMiner启动参数
在Oracle数据库中,确保LogMiner的启动参数中包含DBMS_LOGMNR.CONTENTS_ONLY
选项,以限制其仅扫描指定的PDB。例如:
BEGIN
sys.dbms_logmnr.start_logmnr(
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG +
DBMS_LOGMNR.NO_ROWID_IN_STMT +
DBMS_LOGMNR.CONTENTS_ONLY
);
END;
另一种方法是通过用户权限隔离,确保Flink CDC使用的Oracle用户仅能访问目标PDB(TESTPDB)。具体步骤如下:
创建专用用户并限制权限
在TESTPDB中创建一个专用用户,并授予其必要的权限。例如:
ALTER SESSION SET CONTAINER=TESTPDB;
CREATE USER flink_cdc_user IDENTIFIED BY your_password;
GRANT CONNECT, SELECT ANY TABLE, LOGMINER TO flink_cdc_user;
配置Flink CDC连接器
在Flink CDC连接器的配置中,使用上述专用用户的凭据连接到TESTPDB。例如:
'connector'='oracle-cdc',
'hostname'='your_oracle_host',
'port'='1521',
'username'='flink_cdc_user@TESTPDB',
'password'='your_password',
'database-name'='ORCLCDB',
'schema-name'='your_schema',
'table-name'='your_table'
如果无法修改Flink CDC的配置,也可以通过调整Oracle数据库的全局配置来避免扫描未开启的PDB。具体步骤如下:
禁用未使用的PDB
如果JRPDB确实不需要使用,可以将其从CDB中卸载,避免LogMiner尝试访问它。例如:
ALTER PLUGGABLE DATABASE JRPDB CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE JRPDB UNPLUG INTO '/path/to/jr pdb.xml';
DROP PLUGGABLE DATABASE JRPDB KEEP DATAFILES;
调整LogMiner的默认行为
在Oracle数据库的初始化参数中,设置LOGMINER_PDB_FILTER
以限制LogMiner仅扫描指定的PDB。例如:
ALTER SYSTEM SET LOGMINER_PDB_FILTER='TESTPDB' SCOPE=BOTH;
com.ververica:flink-connector-oracle-cdc:2.4.0
)与Oracle 19c兼容。如果版本不匹配,可能会导致其他问题。通过以上方法,您可以有效避免因未开启的PDB(JRPDB)导致的ORA-16331
错误,同时确保Flink CDC能够正常读取TESTPDB中的数据。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。