在Oracle的默认设置当中,监听的配置文件会默认存放在$ORACLE_HOME/network/admin/listener.ora文件中,在该文件中存放了Oracle的监听配置信息,在其同目录下有tns的配置文件tnsnames.ora文件和sqlnet.ora文件。
在前一段时间操作ERP数据库的时候发现一个问题:在进程中提及到的监听程序(假设监听程序的名字为ALTER)在$ORACLE_HOME/network/admin/listener.ora文件中没有相关的配置信息,经多方查找并请教公司大牛之后,找到在$ORACLE_HOME/network/admin下的一个子目录中,例如:$ORACLE_HOME/network/admin/abc/listener.ora中找到了监听器ALTER的相关配置信息。
当时,第一个疑问是,做了什么的配置能够是监听程序知道有这个文件的存在呢?(肯定不会自动识别的吧?)
所以,找问题,然后找到了TNS_ADMIN这个环境变量上。仅以此文做一个测试记录:
OS:rhel5.4
DB:oracle 10g R2
$ORACLE_HOME=/u02/app/oracle/product/10.2.0/db_1

将原来的监听程序停掉:
$ oracle@model ~> lsnrctl status
新建目录(为了营造一个反差比较大的情况,这里选择一个不属于ORACLE_HOME的路径):
$ oracle@model ~> mkdir /home/oracle/admin/
$ oracle@model ~> cd /home/oracle/admin/
$ oracle@model ~/admin> touch listener.ora
在listener.ora文件中添加如下内容进行监听服务的静态注册:
SID_LIST_HELLO_WORLD =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = hello)
(ORACLE_HOME = /u02/app/oracle/product/10.2.0/db_1)
(SID_NAME = test2)
)
)
HELLO_WORLD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1530))
)
这个时候启动监听程序:
$ oracle@model ~> lsnrctl start HELLO_WORLD
这个时候会报出下面的错误信息:
TNS-01151: Missing listener name, HELLO_WORLD, in LISTENER.ORA
因为在监听程序启动的时候,会默认的查找$ORACLE_HOME/network/admin/listener.ora文件来查找你需要启动的监听信息,现在里面没有,所以根本启动不了了!
下面我们添加如下一个环境变量:
$ oracle@model ~> export TNS_ADMIN=/home/oracle/admin/
再次启动HELLO_WORLD监听程序:
$ oracle@model ~> lsnrctl start HELLO_WORLD

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 22-NOV-2012 00:17:06

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Starting /u02/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /home/oracle/admin/listener.ora
Log messages written to /u02/app/oracle/product/10.2.0/db_1/network/log/hello_world.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1530)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1530)))
STATUS of the LISTENER
------------------------
Alias HELLO_WORLD
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 22-NOV-2012 00:17:06
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /home/oracle/admin/listener.ora
Listener Log File /u02/app/oracle/product/10.2.0/db_1/network/log/hello_world.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1530)))
Services Summary...
Service "hello" has 1 instance(s).
Instance "test2", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
监听器启动成功!可见在TNS_ADMIN环境变量发挥了相关的作用。那之前的配置能否正常启动呢?
$ oracle@model ~/admin> lsnrctl start
结果就不截出来了,为了证明启动成功呢,我们截出来进程来看一下:
$ oracle@model ~/admin> ps -ef | grep tns | grep -v grep
oracle 17930 1 0 00:17 ? 00:00:00 /u02/app/oracle/product/10.2.0/db_1/bin/tnslsnr HELLO_WORLD -inherit
oracle 17994 1 0 00:29 ? 00:00:00 /u02/app/oracle/product/10.2.0/db_1/bin/tnslsnr LISTENER -inherit