Python用oracledb连接Oracle 19c遇监听拒绝等错误求助
解决oracledb Thin模式连接Oracle 19c的DPY系列错误
针对DPY-6000(Listener拒绝连接)的排查方案
- 核对服务名准确性:Oracle 19c默认使用**服务名(Service Name)**而非SID,DBA提供的
dsnname可能是SID而非服务名。可让DBA执行以下SQL确认:
将正确的服务名替换到DSN的-- 查数据库名 SELECT name FROM v$database; -- 查当前有效服务名 SELECT service_name FROM v$session WHERE sid=(SELECT sid FROM v$mystat WHERE rownum=1);/后方,保持host:port/service_name格式。 - 验证网络连通性:在本地执行
telnet xx.xx.xxx.xxx portnumber,若无法连接,说明防火墙拦截了目标端口,需联系运维开放;若能连通,再排查监听配置。 - 处理加密/校验配置冲突:DPY-6000对应ORA-12660,通常与加密、校验规则不匹配有关。尝试在连接时显式指定加密参数:
若数据库端配置了特定加密算法,可补充设置connection = oracledb.connect( user='myusername', password='mypassword', dsn='xx.xx.xxx.xxx:portnumber/dsnname', encrypt='REQUIRED', ssl_server_dn_match=False )crypto_checksum_types等参数。同时确认数据库监听已开启动态注册(默认开启),或静态注册了目标服务名。
针对DPY-4027(找不到tnsnames.ora)的说明
host:port:sid这种冒号分隔的格式,在oracledb Thin模式下会被识别为TNS别名,而非直接连接字符串,因此会尝试查找tnsnames.ora文件。若需通过SID连接,应使用完整TNS格式的DSN:
connection = oracledb.connect( user='myusername', password='mypassword', dsn='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.xxx.xxx)(PORT=portnumber))(CONNECT_DATA=(SID=dsnname)))' )
该格式无需依赖tnsnames.ora,直接在DSN中定义连接参数。
额外排查点
- 确认oracledb版本兼容性:使用支持Oracle 19c的最新稳定版oracledb。
- 检查账号密码特殊字符:若密码包含@、$等特殊字符,尝试用引号包裹或进行URL编码。
内容的提问来源于stack exchange,提问作者Gojoe
相关产品推荐
相关产品推荐

