暂无图片
oracle ora-12154问题如何处理?
我来答
分享
愿世间无疾无病
2022-12-28
oracle ora-12154问题如何处理?

oracle ora-12154问题如何处理?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
yBmZlQzJ

一、监听器介绍

1、概念   

        监听器直接面向用户,也就是客户端程序。监听器启动时,负责打开监听端口,等待客户端连接。当有客户端连接时,在专用服务器连接模式下,创建专用服务器进程,用来处理和响应用户请求;而在共享服务器连接模式下,将监听到的用户请求转发调度器,再由调试器调度共享服务器进程处理。以前一直以为oracle服务器中一个实例对应一个监听器,最近才刚知道oracle服务器可以创建多个数据库实例,这多个实例可以使用同一个监听器。这样一来,数据库实例进程只负责维护管理数据库,并不参与和客户端的通信。

 2、listener.ora文件

        监听器在服务器中对应的配置文件叫listener.ora,在…\dbhome\network\admin\目录下,格式如下。SID_LIST_LISTENER表示名为LISTENER的监听器内注册的实例列表,里面包含所注册的实例信息,全局名称和sid名称;LISTENER表示监听器,里面包含该监听器所支持的协议及地址。监听器创建可以直接修改listener.ora文件,也可以通过oracle自带的配置工具创建。给监听器注册实例可以通过修改该文件静态注册,也可以动态注册(可查看相关资料)。


SID_LIST_LISTENER =  #监听器LISTENER服务的实例列表
  (SID_LIST =  
    (SID_DESC =      #实例1
      (SID_NAME = CLRExtProc)  
      (ORACLE_HOME = C:\app\root\product.2.0\dbhome_1)  
      (PROGRAM = extproc)  
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\root\product.2.0\dbhome_1\bin\oraclr11.dll")
    )  
    (SID_DESC =      #实例2
      (GLOBAL_DBNAME = orcl)  
      (ORACLE_HOME = C:\app\root\product.2.0\dbhome_1)  
      (SID_NAME = orcl)  
    )  
  )  
LISTENER =           #监听器LISTENER
  (DESCRIPTION_LIST =  
    (DESCRIPTION =  
      (ADDRESS_LIST =  # 监听器协议及地址
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))  
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))  
      )  
    )  
  )

SID_LIST_LISTENER2 =  #监听器LISTENER2服务的实例列表
  (SID_LIST =  
    (SID_DESC =      #实例1
      (SID_NAME = CLRExtProc)  
      (ORACLE_HOME = C:\app\root\product.2.0\dbhome_1)  
      (PROGRAM = extproc)  
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\root\product.2.0\dbhome_1\bin\oraclr11.dll")
    )  
    (SID_DESC =      #实例2
      (GLOBAL_DBNAME = orcl2)  
      (ORACLE_HOME = C:\app\root\product.2.0\dbhome_1)  
      (SID_NAME = orcl2)  
    )  
  )  
LISTENER2 =           #监听器LISTENER2
  (DESCRIPTION_LIST =  
    (DESCRIPTION =  
      (ADDRESS_LIST =  # 监听器协议及地址
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))  
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1522))  
      )  
    )  
  )
复制

3、监听器常用命令

         在命令行中输入lsnrctl命令,进入lsnrctl命令行,输入help可以查看支持的命令。常用的包括status,start <xxx>和stop <xxx>等。其中,status可以查看当前服务器中监听器的状态,start可以启动特定监听器,stop可以关闭特定监听器,不加参数指启动或关闭所有监听器。

二、问题原因

1、监听服务未启动,通过lsnrctl status命令查看监听服务有没启动

2、连接的数据库实例没有在监听器中注册

      检查listener.ora文件,看SID_LIST_LISTENER内有无所连接的实例。如果没有,补上。

3、监听器的IP配置为localhost

      在oracle服务器端,检查tnsnames.ora和listener.ora文件(一般情况下oracle服务器不需要tnsnames.ora文件,在多服务器做数据共享时才需要
。网上查的,未确认过),将监听器和实例中的localhost改为IP地址。

      在使用netmanager工具来配置时,比较容易出现这些问题。

4、tnsnames.ora和listener.ora中实例名不一致

      这种情况可能出现在为了解决12541问题,而多次删除或创建监听器导致。
在修改监听器时,最好先用lsnrctl stop命令关闭所有监听服务

5、客户端配置问题,检查客户端的tnsnames.ora文件

      这类问题是在搜索解决方法时发现的,本人并没有遇到过。症状多发生在使用plsql或其他客户端工具时,没有配置oracle主目录导致未找到tnsnames.ora文件或该文件本身有问题(文件中的实例名前不能有空格)。


附tnsnames.ora文件格式

orcl =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100 )(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
复制

三、解决思路

1、先确认客户端连接配置没有问题,特别是服务名。如果使用plsql之类工具,检查oracle主目录和oci路径配置是否正确;

2、检查服务器端,首先通过lsnrctl status命令查看监听服务有没启动,状态有无问题;

3、如服务已启动且状态正确,检查服务器端配置文件,包括listener.ora和tnsnames.ora;

4、修改配置文件时,要先关闭监听服务,修改完成后再打开。

暂无图片 评论
暂无图片 有用 3
打赏 0
暂无图片
Oracle
2022-12-28
相当到位了,学习学习了,https://www.modb.pro/issue/19412
Ty3306
2022-12-28
相当到位了,学习学习了,https://www.modb.pro/issue/19412
JiekeXu
2022-12-28
这个详细,赞
展开全部评论(1条)
Oracle

路过,学习了,先收藏https://www.modb.pro/issue/19412

暂无图片 评论
暂无图片 有用 3
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
Oracle的包中能定义type吗?
回答 1
已采纳
可以的
oracle 分区表 分区索引
回答 4
你的第二个查询结果展示不对,第二个查询中的locality就是针对分区表查询索引是否是local还是global的。
Oracle删除用户及表空间
回答 1
使用其他DBA权限用户连接删除需要删除的用户
分区表的选择
回答 2
可以考虑使用组合分区,主分区按照addtime进行时间分区,子分区按照作业taskid进行list分区。
oracle 数据库中有一个表select * 查询卡死
回答 2
已采纳
如果已经中断了,通过ash报告也可以找到问题。
统计数据大小 和表的行数
回答 2
通常数据库多大,通过查询数据文件占用空间和段占用空间两个标准来衡量:数据文件总大小select&nbsp;sum(BYTES)/1024/1024/1024&nbsp;dbfileG&nbsp;fro
oracle 一张表1000行记录, 现在这些记录被删除了, 能查到这些记录,在数据文件的哪个块号吗?
回答 1
已采纳
你尝试一下看看用闪回查一下他的rowid。然后根据rowid去定位。前提是你rowid这些没有被重新写入。
Oracle数据库为什么要将标量子查询改写为外连接而不是内连接?
回答 1
已采纳
当SQL里面有标量子查询时,可以将标量子查询等价改写为外连接,从而使它们可以进行HASH连接。为什么要将标量子查询改写为外连接而不是内连接?因为标量子查询是一个传值的过程,如果主表传值给子查询,子查询
Oracle 9i碎片整理
回答 2
还有机会摸到9i,实名羡慕
在Oracle中使用rollup函数时,用哪个函数来进行原始列值是“null”的判断?
回答 6
已采纳
仔细读题吧,看清楚题意,“null”