【问题标题】:Suddenly getting ORA-12514 error Oracle 11gr2突然得到 ORA-12514 错误 Oracle 11gr2
【发布时间】:2013-09-20 07:27:14
【问题描述】:

我很好地安装了 Oracle 11g r2,有 2 个数据库(se3 和 mydb,两者都有 db_domain .orcl,即 mydb.orcl 和 se3.orcl)在它上面运行良好,直到昨天。但突然我收到 ORA-12514 错误(TNS:监听器不知道连接描述符中请求的服务)..

我的 tnsnames.ora 文件:

# tnsnames.ora Network Configuration File: G:\oracledb\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_MYDB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))


ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

MYDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydb.orcl)
    )
  )

SE3 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = se3.orcl)
    )
  )

LISTENER_SE3 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

LISTENER.ORA FILE:
# listener.ora Network Configuration File: G:\oracledb\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = G:\oracledb\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:G:\oracledb\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = G:\oracledb

我能够很好地“tnsping mydb/se3”.. 也尝试更改 tnsnames.ora 和 listener.ora 文件(现已恢复)但无法通过 sqlplus 或 sqldeveloper/visual studio 连接到其中任何一个.. plz帮帮我..谢谢!

【问题讨论】:

  • 您的数据库启动了吗?您可以在本地连接(绕过侦听器)吗?有什么改变——机器重启、初始化参数设置...?
  • 感谢您的回复.. 是的,数据库已启动(侦听器正在运行).. 我的系统(本地主机)上有数据库,但没有任何改变.. 我真的不知道如何绕过监听器连接?
  • 监听器运行并不意味着数据库正在运行。 lstnrctl statuslsnrctl services 是否显示正在处理的任何内容?如果你有 SQL*Plus,你可以设置ORACLE_SID 并使用sqlplus user/password,即没有@mydb@se3
  • lsnrctl 服务输出只识别“CLREXTPROC”,而不识别我的任何 se3 或 mydb 数据库。我也能够设置 ORACLE_SID,但不能像你问的那样通过 sqlplus 连接。错误出来了。ORA- 01034 - Oracle 不可用.. 另一个也在.. ORA- 27101 - 共享内存领域不存在..!
  • 看来您的数据库已关闭。我不熟悉在 Windows 上运行 Oracle(我假设来自 tnsnames.ora 中的 G:\... 路径)但 instructions are here。如果 PC 尚未重新启动,那么您可能需要调查日志以了解数据库关闭的原因。

标签: oracle11gr2 ora-12514


【解决方案1】:

根据您自己的评论“我能够设置 ORACLE_SID 但无法通过 sqlplus ... ORA-01034 - Oracle 不可用”,您的数据库实例可能已关闭。理论上可以运行底层 Windows 服务 OracleServiceMYDB 并在进程中运行相应的 oracle.exe,但数据库实例已关闭。最好的办法是在服务器上查找包含 alert_mydb.log 的跟踪目录并查看最后的条目。

如果数据库根本没有运行并且警报日志显示没有严重错误,请像这样启动它:

set ORACLE_SID=MYDB
set ORACLE_HOME=D:\my\oracle\home

%ORACLE_HOME%\bin\sqlplus "/ as sysdba"
ORACLE not available.
SQL> STARTUP 
SQL> EXIT

lsnrctl services

最后一个命令应该显示 MYDB 已注册。 继续 ORACLE_SID=SE3

【讨论】:

    【解决方案2】:

    在我的例子中,当我尝试通过 SQL*Plusclient-only 机器连接到远程数据库:

    C:\Temp>sqlplus username@connect_descriptor
    
    SQL*Plus: Release 11.2.0.3.0 Production on Wed Sep 24 09:43:04 2014
    
    Copyright (c) 1982, 2011, Oracle.  All rights reserved.
    
    Enter password:
    ERROR:
    ORA-12514: TNS:listener does not currently know of service requested in connect
    descriptor
    

    我觉得这很令人费解,因为 tnsping 响应成功:

    C:\Temp>tnsping connect_descriptor
    
    TNS Ping Utility for 32-bit Windows: Version 11.2.0.3.0 - Production on 24-SEP-2
    014 09:48:04
    
    Copyright (c) 1997, 2011, Oracle.  All rights reserved.
    
    Used parameter files:
    D:\Oracle\product\11.2.0\client_1\network\admin\sqlnet.ora
    
    
    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host
    .intranet.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =
    HOST13)))
    OK (20 msec)
    

    最终,我在 tnsnames.ora 文件中发现我的问题是不正确的 SERVICE_NAME 值:

    CONNECT_DESCRIPTOR =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = host.intranet.com)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = HOST13)
        )
      )
    

    HOST13(通过普通文本编辑器)更改为SERVICE_NAME 的正确值后,我能够连接到远程Oracle 数据库。

    在我的 Oracle 11.2 客户端机器上,tnsnames.ora 的位置如下:

    C:\Oracle\product\11.2.0\client_1\network\admin\tnsnames.ora
    

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2012-08-23
      • 2011-12-29
      • 2012-03-13
      相关资源
      最近更新 更多