共计 3932 个字符,预计需要花费 10 分钟才能阅读完成。
首先,我们必须知道在 Oracle 11g 中,官方推荐 GI 和Oracle 数据库软件分开管理,在这种情况下,我们会发现数据库监听器其实是位于 GI 的管理账号下,即通常我们所创建的 grid 账号。在该 grid 账号的 $ORACLE_HOME/network/admin 目录下我们会发现我们的 listener.ORA 文件。同时监听器的启动与关闭都是由该 grid 账号来控制,若使用 oracle 账号此时就会发现报错如下:
TNS-01190: The user is not authorized to execute the requested listener command
当然我们仍然可以透过 oracle 账号用 netca 命令创建监听器,此时的监听器位于 oracle 账号的 $ORACLE_HOME/network/admin 目录下。
此外,默认情况下我们的 tnsnames.ora 文件仍然存在于 oracle 账号下的相关位置。
下面我们就监听器的具体配置分析下:
首先我们必须清楚地明白在 RAC 环境下都有哪些实例,各个实例是否都需要监听呢,针对该问题我们测试一把:
[grid@RAC01 ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 – Production on 03-JAN-2014 08:33:35
…………………………
Copyright (c) 1991, 2009, Oracle. All rights reserved.
………………
Listener Parameter File /u/app/11.2.0/grid/network/admin/listener.ora
Listener Log File /u/app/grid/diag/tnslsnr/RAC01/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.134.30.27)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.134.30.47)(PORT=1521)))
Services Summary…
Service “+ASM” has 1 instance(s).
Instance “+ASM2”, status READY, has 1 handler(s) for this service…
The command completed successfully
观察我们的监听器状态,此时可以发现 只有 ASM 实例的监听服务 ,但是数据库实例的监听去哪儿呢?关于该问题我的推荐关注两个参数:local_listener、remote_listener。我们再次只需要参数local_listener 就ok了。
其实上面所说的 no listener、no services 都是与该参数有关的。我们看看现在服务器上该参数的配置:
首先观察的是 ASM 实例:
SQL> show parameter local_l
NAME TYPE
———————————— ———————————
VALUE
——————————
local_listener string
(DESCRIPTION=(ADDRESS_LIST=(AD
DRESS=(PROTOCOL=TCP)(HOST=RAC0
1-vip)(PORT=1521))))
SQL> select instance_name,status from v$instance;
INSTANCE_N STATUS
———- ————————————
+ASM2 STARTED
可以看到 asm 实例的 local_listener 参数实际上使用的是vip。
再看看我们的数据库实例:
SQL> show parameter local_li
NAME TYPE VALUE
———————————— ———– ——————————
local_listener string (DESCRIPTION=(ADDRESS_LIST=(AD
DRESS=(PROTOCOL=TCP)(HOST=RACS
CAN.localdomain.)(PORT=1521)))
)
SQL> select instance_name,status from v$instance;
INSTANCE_N STATUS
———- ————
RACDB2 OPEN
我们观察到数据库实例使用的是scan-ip。
那是不是就是应为使用的 ip 情况的不同,listener监听器中的监听服务不同呢?
我们来测试一把:
此处我们只测试 asm 实例的参数 local_listener 即可,其他服务的雷同。
SQL> alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=RACSCAN.localdomain.)(PORT=1521))))’;
System altered.
SQL> host lsnrctl status
Listener Parameter File /u/app/11.2.0/grid/network/admin/listener.ora
Listener Log File /u/app/grid/diag/tnslsnr/RAC01/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.134.30.27)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.134.30.47)(PORT=1521)))
The listener supports no services
The command completed successfully
我们观察到监听还是那个监听,但是服务却不是那个服务了,此时 no services 了。
此时我们在透过 tnsnames.ora 文件的配置从客户端登陆数据库时就会出现如下错误:
ORA-12520: TNS:listener could not find available handler for requested type of
server
Enter user-name:
无论是 vip 还是透过 scan-ip 都是不行的。从此处我们可以得出结论:ASM实例的监听地址必须是 VIP 而不能是scan-ip。否侧会出现上述报错。
将 ASM 实例的监听器修改回来。
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=RAC01-vip)(PORT=1521))))’;
那么数据库实例应该使用那个类型的 ip 呢,是 scan-ip 还是 vip 呢,其实这两个 ip 都行,就看你怎么用了。如果 local_listener 参数配置为指向 vip,此时客户端只能透过vip 访问数据库,如果 local_listener 参数配置为 scan-ip 此时客户端必须透过 scan-ip 访问,否则登陆同样报错如下:
ORA-12520: TNS:listener could not find available handler for requested type of
server
Enter user-name:
总结:
在 oracle11g RAC 环境中,监听器是由 grid 账号来维护的,此外 ASM 实例使用的一定是 vip,数据库实例vip、scan-ip 均可使用。如果数据库参数 local_listener 配置了 vip,此时客户端只能透过vip 访问数据库,如果数据库参数 local_listener 参数设置为 scan-ip 此时客户端只能透过 scan-ip 访问数据库。建议使用 scan-ip,这样数据库在增删节点的时候就不会影响到客户端的使用,客户端也无需也节点的变化而修改配置。Oracle 官方建议在使用 scan-ip 时最少配置 3 个scan-ip。这样透过冗余可防止某个 scan-ip 不可用导致客户端无法访问数据库。
以上测试仅为个人测试分析,若有不对请各位及时指出,鄙人自当万分感谢。
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148976.htm