在生产环境中,我们经常会碰到数据库监听假死的情况,导致监听假死的原因很多,通常主要是服务问题,或client连接请求过多导致oracle server资源被大量暂用,从而无法处理其他正常的client的请求。所以我们可以对同一个数据库实例配置多个不同的监听,分发给不同的用户或部门使用,如果哪一个监听经常假死,可以排查该用户或该部门的session使用情况,而其他用户或部门是不会受到影响的。
常用的多个监听的使用方式:
1、顺序分配执行,failover模式:当一个用户请求连接时,server会顺序的将可用的监听分配给client,从而保证一个监听故障而不会影响到其他用户正常访问。
2、随机分配执行,负载均衡模式:当一个用户请求连接时,server会随机的将负载低的监听分配给client,从而保证一个监听故障而不会影响到其他用户正常访问,并且每个监听对session的处理请求是相对平均的。
监听的HA+LB配置在后面的文章中在做讨论。
监听注册实例的两种方式:
1、动态注册:需要修改数据库参数和tnsnames.ora文件,每次启动监听服务会显示实例的运行状态,如果是正常的则显示”READY”
2、静态注册:只需要配置listener.ora文件,每次启动监听只能显示连接了哪些数据库实例,无法判断数据库实例是否正常工作,实例的运行状态显示为”UNKNOW”,所以我们通常在启动监听的时候,看到有的实例是READY的,有的实例是UNKNOW的,这个是正常的,因为有部分实例可能是动态注册的。
监听的配置文件:$ORACLE_HOME/network/admin/listener.ora
TNS的配置文件:$ORACLE_HOME/network/admin/tnsnames.ora
下面开始如何配置两个监听,要求实例都是动态注册的,每个监听可以单独管理:
首先配置listener.ora文件,
建立侦听LISTENER1 协议为:TCP 主机名称为:OracleServer 端口为:1500
建立侦听LISTENER2 协议为:TCP 主机名称为:OracleServer 端口为:1501
(主机名称也可以直接写为oracle 服务器的IP,OracleServer的ip为:192.168.1.100)
[root@OracleServer ~]# su – oracle
[oracle@OracleServer ~]$ echo $ORACLE_SID
felix
[oracle@OracleServer ~]$ echo $ORACLE_HOME
/u01/oracle/product/10.2.0/db_1
[oracle@OracleServer ~]$ cd $ORACLE_HOME/network/admin
[oracle@OracleServer admin]$ cat ./listener.ora
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleServer)(PORT = 1500))
)
)
LISTENER2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleServer)(PORT = 1501))
)
)
在tnsnames.ora添加一个tns配置,让数据库可以调用,tnsname 为FELIX,这个不一定要和SID一样,用户可以自定义。然后配置两个监听的连接地址信息。
我们可以看到监听2的实例 felix 也已经起来了, 而且状态显示为 READY, 说明数据库也是正常运行的,如果数据库服务没有起来,可以用sqlplus登陆后执行 startup force 来启动数据库。如果监听启动后,实例felix的状态要几分钟才能刷出来,我们为了更快看到效果,可以进入sqlplus执行一个命令让系统立刻快速注册刷新:alter system register;
另外注意,oracle的图形化配置工具都比较傻瓜,建议大家手工修改配置文件,有可能修改好的文件可以正常运行,但是图形工具无法识别,这个是很正常的。