python - CX_ORACLE TNS :listener does not currently know of service requested in connect descriptor

标签 python database oracle cx-oracle

我正在尝试使用 cx_oracle 从 python 连接数据库服务器。我将连接字符串构造为

dbconfig['schema']+"/"+dbconfig['password']+"@"+dbconfig["ip"]+"/"+dbconfig['sid']

其中 dbconfig 是包含数据库连接所需凭据的字典

我能够使用 VPN 连接连接到其中一台服务器。但是,当我尝试连接到本地网络中的其中一台服务器时,它显示“TNS:监听器当前不知道连接描述符中请求的服务”错误。

我什至用适当的 sid 修改了 tnsnames.ora 文件,即使在其他情况下不需要它。之后,我就可以使用 sqlplus 登录了。但是没有运气使用 python 代码。

最佳答案

您正在使用 HOSTNAME 连接类型或所谓的“轻松连接”- EZCONNECT 连接到数据库

在您的场景中忘记 tnsnames.ora。进行 HOSTNAME 连接时未使用。

您需要正确设置 SERVICE_NAME。 SERVICE_NAME 与 SID 不同。

SID 是数据库节点上服务器端进程的名称。固定到 dbnode。

SERVICE_NAME 是一种抽象。假设我在两个数据库节点 (RAC)(共享存储)上运行一个数据库,集群将公开一项服务以便应用程序可以连接 - SERVICE_NAME。应用程序无需了解有关底层架构的任何信息。

connection by service_name: user/pass@hostname:port/SERVICE_NAME 
connection by sid user/pass@hostname:port:SID -- NOTE the colon!

如果您运行的是 Oracle Database 12c,则必须指定 SERVICE_NAME,而不是 SID。永远不要使用 SID!您的应用程序需要数据库服务!

SQL>-- identify the database services (you can have as many as you like)
SQL>-- finance,betting,app1,app2...appN,etc
SQL>-- YES you 'should' run ALL your applications in ONE database (schema separation or pluggable) 
SQL>show parameter service_names

REM try EZCONNECT through sqlplus
REM Note! Add ..(EZCONNECT,TNSNAMES).. to your sqlnet.ora file if not already in. 
C:\>sqlplus user/pass@hostname:PORT/SERVICE_NAME

关于python - CX_ORACLE TNS :listener does not currently know of service requested in connect descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565876/

相关文章:

python - 将数据类数组序列化为 JSON

mysql - 插入查询不适用于具有外键的行

database - 为什么从 Elasticsearch 检索数据比从 PostgreSQL 检索数据快得多?

java - PreparedStatement 的正确用法

sql - 创建触发器时出现 Oracle 错误

python - print_parts() 函数在编写程序中的工作原理 chapter2.3

python - 模块未找到错误 : No module named 'cv2'

python - 在 pandas 中用 NaN 替换空白值(空白)

oracle - 使用expdp备份数据库

oracle - Oracle SQL Developer中的旧SQL历史记录