最近碰到一个ORACLE 18c上面的PDB的监听问题,折腾了好久没成功,找了专业DBA协作才搞定。故整理和记录下。

1. 监听参数

ORACLE跟监听相关的几个参数:

SQL> show parameter listen;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
forward_listener                     string
listener_networks                    string
local_listener                       string      LISTENER_ORADB
remote_listener                      string

几个参数的含义:

LOCAL_LISTENER    本地侦听器
REMOTE_LISTENER   用于远程侦听器,如果有的话
FORWARD_LISTENER  为转发侦听器
listener_networks  当rac加入额外的监听时,一般会设置此参数。

这里只涉及local_listener的讨论,其它参数不讨论。
local_listener 默认值为空,这种情况下会动态注册监听,也是推荐的方式。当oracle的本地监听为非默认情况时,会用到local_listener参数。

2. 遇到的问题 及解决办法

此次的问题就在于这个参数设置了值。从上面看到,local_listener的值为 LISTENER_ORADB,这个监听名称必须在tnsname.ora文件里进行配置,如下:

LISTENER_ORADB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.162.168)(PORT = 1521))

当不存在这个配置项的时候就会报错(此次就是不知道为何这个配置项被删了,重启数据库后监听就一直注册不了导致无法访问)。报错内容如下:

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect

解决办法就是加上这个配置或者修改LOCAL_LISTENER参数的值,修改方法如下:

alter system set local_listener='';
alter system register;