我正在尝试使用 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/