Pentaho数据集成/Kettle ETL中如何用多地址行TNS连接Oracle数据库

hs1ihplo  于 2022-12-29  发布在  Oracle
关注(0)|答案(1)|浏览(272)

我正在尝试使用PDI连接到Oracle数据库。我已经使用Oracle SQL Developer和sqlplus使用TNS成功连接到数据库。我在sqlplus中使用的连接字符串类似于username/password@tnsname。
我按照步骤here连接到PDI中的同一数据库,但收到错误“ORA-12504:TNS:未在CONNECT_DATA中为侦听器提供SERVICE_NAME”。
我的tnsnames.ora中的项看起来像这样:

sample_TNS.world=
(DESCRIPTION=
(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)(ADDRESS_LIST=(LOAD_BALANCE=off)(FAILOVER=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=host1.com)(PORT=38000))
(ADDRESS=(PROTOCOL=TCP)(HOST=host2.com)(PORT=38000))
(ADDRESS=(PROTOCOL=TCP)(HOST=host3.com)(PORT=38000)))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=TEST.COM)))

与大多数示例不同,它有多个地址,因此我只选择其中一个主机填入PDI中的“主机名”字段,然后将等号后面的所有内容复制到“数据库名”字段中。我还尝试不将所有地址(ADDRESS=xxx)都包含在“数据库名”字段中,而只将我在“主机名”字段中使用的地址包含在内(其他内容保持不变)。
我已经在谷歌上搜索了这个错误,some提示可能是(Description=xxxx)字符串格式不正确。但是,我已经多次检查粘贴是否正确,没有拼写和括号匹配(我能够与SQL developer和sqlplus建立连接,因此TNS字符串应该格式正确)。
我还在本地计算机上创建了一个简单的Oracle数据库,并使用PDI(当然不使用TNS名称)成功地连接到它,所以我不认为这是驱动程序的问题。
我尝试过的其他一些方法包括使用“Generic database”作为连接类型,而不是前面提到的here中的“Oracle(但是我没能理解shassan 2提到的第二种和第三种方法),以及将主机和端口留空,并使用here提到的服务描述填充DatabaseName。我试着调整这里和那里的东西,但只是不断得到各种各样的错误,包括相同的ORA-12504,TNS:侦听器当前不知道在连接描述符中请求的服务,没有找到合适的驱动程序,IO错误:网络适配器无法建立连接,等等(太多的错误,我已经失去了我的计数)。在那些“老”论坛帖子的链接都关闭了,所以这将是非常有帮助的,如果有人能告诉我正确的方法,使连接。我使用64位Windows,Pentaho社区版9.3.0.0-428

openjdk version "1.8.0_352"
OpenJDK Runtime Environment (build 1.8.0_352-b08)
OpenJDK 64-Bit Server VM (build 25.352-b08, mixed mode)

并将驱动程序ojdbc8.jar放在

data-integration/lib/

任何帮助都将不胜感激。谢谢!

afdcj2ne

afdcj2ne1#

通常,当您有一个RAC(真实的Application Cluster)Oracle数据库时,管理员应该已经设置了一个SCAN(I can 't find what is the letter soup to produce that name)来连接,而不需要指定所有主机,因此您可以在TNSNAMES.ORA中使用类似下面的内容来连接:

SCAN_TNS=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=SCAN_NAME)(PORT=port_for_scan))
(CONNECT_DATA=(SERVICE_NAME=SCAN_SERVICE_NAME)))

在PDI中,您可以使用JDBC连接类型,选择Oracle数据库类型,然后填写主机(SCAN_NAME)、端口(port_for_scan)和数据库名称(SCAN_SERVICE_NAME,有时根据配置方式,我需要使用/SCAN_SERVICE_NAME)。
但是,如果您没有SCAN信息或尚未设置SCAN信息,则可以将host和port留空,并将其放入Database Name字段中:

(DESCRIPTION=
(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)(ADDRESS_LIST=(LOAD_BALANCE=off)(FAILOVER=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=host1.com)(PORT=38000))
(ADDRESS=(PROTOCOL=TCP)(HOST=host2.com)(PORT=38000))
(ADDRESS=(PROTOCOL=TCP)(HOST=host3.com)(PORT=38000)))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=TEST.COM)))

相关问题