You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python用oracledb连接Oracle 19c遇监听拒绝等错误求助

解决oracledb Thin模式连接Oracle 19c的DPY系列错误

针对DPY-6000(Listener拒绝连接)的排查方案

  • 核对服务名准确性:Oracle 19c默认使用**服务名(Service Name)**而非SID,DBA提供的dsnname可能是SID而非服务名。可让DBA执行以下SQL确认:
    -- 查数据库名
    SELECT name FROM v$database;
    -- 查当前有效服务名
    SELECT service_name FROM v$session WHERE sid=(SELECT sid FROM v$mystat WHERE rownum=1);
    
    将正确的服务名替换到DSN的/后方,保持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:35:25