【问题标题】:Oracle throws ORA-12514 after shutdown immediateOracle 在立即关闭后抛出 ORA-12514
【发布时间】:2015-09-08 21:32:21
【问题描述】:

我的目标是让我的容器数据库进入挂载模式以执行系统更改语句以启用闪回功能。

Configuring Your Database for Flashback Transaction

环境:操作系统 Win 8.1 64 位,Oracle 12c (12.1.0.2.0) 64 位

我验证了我的监听器和数据库服务都在运行。

Listener.log

Tue Sep 08 13:31:42 2015 系统参数文件为 C:\OracleServer\product\12.1.0\dbhome_1\network\admin\listener.ora 日志 写给的消息 C:\OracleServer\diag\tnslsnr\NA-D02979\listener\alert\log.xml 跟踪 信息写入 C:\OracleServer\diag\tnslsnr\NA-D02979\listener\trace\ora_9672_20416.trc 跟踪级别当前为 0

从 pid=9672 开始监听: (描述=(地址=(协议=tcp)(主机=10.1.105.118)(端口=1521))) 收听: (描述=(地址=(协议=tcp)(主机=127.0.0.1)(端口=1521))) 收听: (描述=(地址=(协议=ipc)(管道名称=\.\pipe\EXTPROC1521ipc))) 侦听器在开始时完成向 CRS 的通知

时间戳 * 连接数据 [* 协议信息] * 事件 [* SID] * 返回 代码监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=NA-D02979.vgnet.volgrp.com)(PORT=5500))(Security=(my_wallet_directory=C:\ORACLESERVER\admin\CDB1\xdb_wallet))(演示=HTTP)(会话=RAW)) 动态地址已被监听 (描述=(地址=(协议=tcp)(主机=127.0.0.1)(端口=1521))) 2015 年 9 月 8 日 13:32:25 * service_register * cdb1 * 0 08-SEP-2015 13:33:22 * service_update * cdb1 * 0

SqlPlus 的结果

C:\Users\jeff>sqlplus sys/**********@CDB1 as sysdba

SQL*Plus:2015 年 9 月 8 日星期二 13:44:18 发布 12.1.0.2.0 生产版

版权所有 (c) 1982、2014、甲骨文。保留所有权利。

连接到:Oracle Database 12c 企业版版本 12.1.0.2.0 - 具有分区、OLAP、高级分析和实际应用程序测试选项的 64 位生产

SQL> 立即关闭

数据库关闭。

数据库已卸载。

ORACLE 实例关闭。

错误:ORA-12514:TNS:监听器当前不知道连接描述符中请求的服务

警告:您不再连接到 ORACLE。

SQL> 启动挂载

SP2-0640:未连接

SQL> ^C

C:\Users\jeff>sqlplus> sys/**********@CDB1 as sysdba

SQL*Plus:2015 年 9 月 8 日星期二 13:46:24 发布 12.1.0.2.0 生产版

版权所有 (c) 1982、2014、甲骨文。保留所有权利。

错误:ORA-12514:TNS:监听器当前不知道连接描述符中请求的服务

输入用户名:

当我以 sysdba 身份连接到我的容器数据库时,我可以发出关闭立即命令,但是一旦数据库卸载,侦听器就不再知道数据库并且我无法发出“启动挂载”命令。

Listener.ora

SID_LIST_LISTENER = (SID_LIST =

(SID_DESC =

  (SID_NAME = CLRExtProc)

  (ORACLE_HOME = C:\OracleServer\product\12.1.0\dbhome_1)

  (PROGRAM = extproc)

  (ENVS = "EXTPROC_DLLS=ONLY:C:\OracleServer\product\12.1.0\dbhome_1\bin\oraclr12.dll")

) 

(SID_DESC =

 (GLOBAL_DBNAME = CDB1)

 (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)

 (SID_NAME = CDB1)

)   )

LISTENER = (DESCRIPTION_LIST = (DESCRIPTION =

  (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.105.118)(PORT = 1521))
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)   )

TNSNames.ora

LISTENER_CDB1 =

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

CDB1 =

 (DESCRIPTION =

   (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.105.118)(PORT = 1521))

   (CONNECT_DATA =

    (SERVER = DEDICATED)

     (SERVICE_NAME = CDB1.vgnet.volgrp.com)

   )

 )

ORACLR_CONNECTION_DATA =

 (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

   )

   (CONNECT_DATA =

     (SID = CLRExtProc)

     (PRESENTATION = RO)

   )

 )

我已经为我的容器数据库定义了一个静态 SID。

第二轮结果

根据以下结果,我遵循了 Alex Pool 在答案中记录的内容。我和数据库在同一台机器上。我已将 ORACLE_SID 设置为 cdb1,然后每次尝试连接时,我都会收到 ORA-12560:TNS:协议适配器错误。当我尝试基于 SID 连接时,为什么我的监听器仍然抛出 TNS 错误?

C:\Users\jeff>%ORACLE_SID%
'cdb1' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\jeff>sqlplus sys/********** as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Wed Sep 9 08:05:25 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

ERROR:
ORA-12560: TNS:protocol adapter error

Enter user-name: ^C
C:\Users\jeff>sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Wed Sep 9 08:05:36 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

ERROR:
ORA-12560: TNS:protocol adapter error

Enter user-name: ^C
C:\Users\jeff>sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Wed Sep 9 08:05:50 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> connect / as sysdba
ERROR:
ORA-12560: TNS:protocol adapter error

SQL>

【问题讨论】:

    标签: oracle12c


    【解决方案1】:

    侦听器不再知道服务,因为数据库在关闭期间注销了自身。它仍然知道 SID,尽管这不是很有用。关机前后可以lsnrctl status看看区别。

    您说您已经定义了一个静态 SID,这是真的(假设您指的是 SID_LIST_LISTENER 条目),但是您正在使用 @CDB1 TNS 别名进行连接,该别名在您的 tnsnames.ora 中被定义使用服务名称,而不是 SID。您可能会对别名和 SID 具有相同的值感到困惑,但它们之间没有直接关系;您可以将别名称为完全不同的东西(尽管它们通常相同)。

    如果您从同一个框进行连接,请将 ORACLE_SID 设置为 CDB1 并在本地而不是通过 SQL*Net 进行连接,只需:

    sqlplus sys/********** as sysdba
    

    甚至

    sqlplus / as sysdba
    

    或者

    sqlplus /nolog
    connect / as sysdba
    

    【讨论】:

    • 我已经执行了您描述的步骤,但仍然收到侦听器错误。我已将我的测试结果添加到我的问题中。
    • @JeffP。 - 如果你像这样连接,那么你不会通过 TNS 或监听器。除非您设置了 TWO_TASK 以及/而不是 ORACLE_SID。 (呃,或者在 Windows 上......我认为 TWO_TASK 的等价物是 LOCAL?)
    • @JeffP。 - 您的环境中是否设置了%LOCAL%?我没有完全注意到你在 12c 上的任何意义,but this should still work for a container DB
    • 我检查了 LOCAL,但没有定义。只是为了好玩,我确实检查了 TWO_TASK (即使它应该被 Unix 使用)。所以我确实检查了我的 ORACLE_SID 环境变量到 cdb1。然后我就可以连接了。谢谢!
    【解决方案2】:

    $ 导出 TWO_TASK =

    sqlplus /nolog

    conn sys/pass as sysdba

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2014-06-23
      • 1970-01-01
      • 2011-12-29
      • 2013-09-20
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 2012-08-23
      相关资源
      最近更新 更多