ORA-12505

 在Fedora下安装Oracle 10gR2,安装完成之后,使用netca创建了监听,创建的时候没有使用默认的LISTENER和1521端口,而是使用了LISTENER_DELL和1522端口,终端下显示完成,然后在$ORACLE_HOME/network/admin/tnsnames.ora下增加一个tns别名。

DELL =
  (DESCRIPTION =
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1522))
    )
    (CONNECT_DATA = 
      (SERVER = DEDICATED)
      (SID = dell)
    )
  )
加好之后,如下登录
sqlplus /nolog
connect scott/tiger@dell
登录之后就报错了,ORA-12505,按说监听方面的错误还是很好解决的,结果检查了监听也是正常启动的,但就是无法按照@DELL来登录,将tnsnames.ora里面SID = dell 改成 SERVER_NAME = dell  还是一直报错 ORA-12505, TNS:listener does not currently know of SID given in connect descriptor。 
      然后发现$ORACLE_HOME/network/admin/目录下没有sqlnet.ora文件,运行netca,设置命名方法,运行之后sqlnet.ora文件有了,内容如下: 
more sqlnet.oraNAMES.DIRECTORY_PATH= (TNSNAMES)
再次尝试登录,发现还是同样的错误。于是突然想到Oracle肯定一直是以LISTENER这个并未启动的监听来来Oracle提供监听信息,而我并没有使用默认监听名称所以造成这个错误,于是给监听文件listener.ora添加SID信息。
LISTENER_DELL =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = avon)(PORT = 1522))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

SID_LIST_LISTENER_DELL =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )
添加SID信息 (见蓝色加粗字体)
  SID_LIST_LISTENER_DELL =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = dell)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (SID_NAME = dell)
    )
  )

加好之后保存退出 :wq
进行测试,还是报错,发现tnsnames.ora 里面我设置的是SERVER_NAME,于是给改成SID = dell 再次测试
sqlplus /nolog
SQL> conn scott/tiger@dell
Connected.
OK,一切正常。
 
后记:在 windows下也进行了同样的尝试,发现如果不使用LISTENER作为默认监听名称 端口不为1521的话,也会导致这个错误,而解决方法和上面一致。 不过并没有尝试名称为LISTENER但是端口不为1521的情况。


C:/Windows/system32>lsnrctl
LSNRCTL for 32-bit Windows: Version 10.2.0.3.0 - Production on 13-9月 -2010 23:2
6:34
Copyright (c) 1991, 2006, Oracle.  All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL> status
正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
TNS-12541: TNS: 无监听程序
 TNS-12560: TNS: 协议适配器错误
  TNS-00511: 无监听程序
   32-bit Windows Error: 61: Unknown error
LSNRCTL> set current_listener LISTENER_DEMO
目前的监听程序为 LISTENER_DEMO
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=scott-PC)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER_DEMO
版本                      TNSLSNR for 32-bit Windows: Version 10.2.0.3.0 - Produ
ction
启动日期                  13-9月 -2010 23:17:13
正常运行时间              0 天 0 小时 9 分 41 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件          D:/oracle/product/10.2.0/db_1/network/log/listener_dem
o.log
监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scott-PC)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=//./pipe/EXTPROC0ipc)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
以上为出现ORA-12505错误时,监听的状态,
以下为修改正常,监听重启后的状态
LSNRCTL> set current_listener LISTENER_DEMO
目前的监听程序为 LISTENER_DEMO
LSNRCTL> stop
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=scott-PC)(PORT=1522)))
命令执行成功
LSNRCTL> start
启动tnslsnr: 请稍候...
TNSLSNR for 32-bit Windows: Version 10.2.0.3.0 - Production
系统参数文件为D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
写入D:/oracle/product/10.2.0/db_1/network/log/listener_demo.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scott-PC)(PORT=1522)))
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=//./pipe/EXTPROC0ipc)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=scott-PC)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER_DEMO
版本                      TNSLSNR for 32-bit Windows: Version 10.2.0.3.0 - Produ
ction
启动日期                  13-9月 -2010 23:35:14
正常运行时间              0 天 0 小时 0 分 6 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件          D:/oracle/product/10.2.0/db_1/network/log/listener_dem
o.log
监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scott-PC)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=//./pipe/EXTPROC0ipc)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "demo" 包含 1 个例程。
  例程 "demo", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
<think>好的,我现在需要解决用户提出的ORA-12505错误的问题。首先,我得回忆一下这个错误的常见原因。ORA-12505通常与TNS监听器无法识别连接请求中指定的SID有关。可能的原因包括SID配置错误、监听器未正确注册、服务名与SID不一致等。 接下来,我应该参考用户提供的引用内容,虽然这些引用主要涉及其他错误如TNS-12547、ORA-12537等,但其中有些可能相关的解决方法,比如权限问题或监听器配置。例如,引用[2]提到权限问题导致TNS-12547,这可能提示我需要检查Oracle相关目录的权限。引用[5]提到动态注册改为静态注册,这可能适用于ORA-12505,如果动态注册失败的话。 然后,我需要整理常见的解决方案步骤。首先检查连接字符串中的SID是否正确,确认是否使用了服务名而非SID,或者反过来。接着查看监听器状态,确认实例是否已注册。可能需要检查listener.ora和tnsnames.ora的配置,确保SID_NAME或SERVICE_NAME正确。此外,检查Oracle实例是否运行,PMON进程是否正常注册服务到监听器。 另外,动态注册的问题可能需要手动静态注册,在listener.ora中添加SID描述。权限问题也可能导致监听器无法访问某些文件,需要检查目录权限是否符合要求,比如Oracle安装目录、监听器日志等。防火墙或端口冲突也可能导致监听器无法通信,需要检查1521端口是否开放,是否有其他程序占用。 还需要考虑Oracle服务是否启动,比如使用lsnrctl status查看监听器状态,检查实例是否处于OPEN状态。如果问题依然存在,可能需要查看监听器日志文件,寻找更详细的错误信息。 最后,确保所有配置修改后重启监听器服务,以使更改生效。可能需要综合多个步骤,逐步排查,从配置检查到服务状态,再到网络和权限问题,逐一排除可能的原因。</think>关于ORA-12505 TNS监听程序错误,以下是结构化解决方案: ### ORA-12505错误原因及解决方案 #### 1. **核心错误定义** ORA-12505表示监听程序无法识别客户端连接请求中指定的SID(系统标识符)。常见于以下场景: - 数据库实例未注册到监听程序 - SID配置与请求参数不匹配 - 动态服务注册失败[^2][^5] #### 2. **关键排查步骤** **(1) 检查连接字符串有效性** ```sql -- 示例tnsnames.ora配置验证 ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) -- 或(SID = ORCL) ) ) ``` 需确认使用`SERVICE_NAME`还是`SID`,Oracle 11g+默认推荐服务名[^5] **(2) 监听程序状态验证** ```bash lsnrctl status ``` 检查输出是否包含类似以下条目: ``` Service "ORCL" has 1 instance(s) Instance "ORCL", status READY, has 1 handler(s) ``` **(3) 强制静态注册(动态注册失败时)** 修改`listener.ora`添加显式SID定义: ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1) (SID_NAME = ORCL) ) ) ``` #### 3. **高级排查方案** **(1) 权限问题修复** 检查关键目录权限(需oracle用户可读写): ```bash chown -R oracle:oinstall /u01/app/oracle chmod -R 755 $ORACLE_HOME/network/admin ``` **(2) 注册延迟处理** 若使用动态注册,PMON进程可能需要最多60秒完成注册。可手动唤醒: ```sql ALTER SYSTEM REGISTER; ``` **(3) 日志分析定位** 检查监听日志获取精确错误上下文: ```bash tail -100f $ORACLE_HOME/network/log/listener.log ``` #### 4. **预防措施** - 确保`ORACLE_SID`环境变量与实例名一致 - 定期验证监听配置:`lsnrctl services` - 生产环境建议使用静态+动态混合注册方式[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值