##listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = zlm_SN)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = zlm)
)
)
经过上面的 tnsnames.ora 和 linstener.ora 的配置,当我们查看监听状态的时候,就会发现不同:
$lsnrctl status ...... Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "zlm_SN" has 1 instance(s).## 表示对应的 SERVICE_NAME 为 zlm_SN
Instance "zlm", status UNKNOWN, has 1 handler(s) for this service... ##表示对应的
INSTANCE_NAME 为 zlm,也即 SID 和 ORACLE_SID
The command completed successfully
而通常情况下,我们会设置 SERVICE_NAME 和 INSTANCE_NAME 一致。这里还要注意的是,SERVICE_NAME
虽然可以脱离 INSTANCE_NAME 搞别名,但是必须对应 listener.ora 里配置的 GLOBAL_DBNAME,否则就
算配好了静态监听,也是注册不了服务的
注意,数据库数据文件存放的路径,是根据 DB_NAME 来确定的,而对于单实例数据库而言,默认与 SID 和
INSTANCE_NAME 是一致的,当然,也可以不一致(有 DB_DOMAIN 的情况下),DBCA 的时候可以选择,通常
这 3 个参数在 DBCA 的时候确认下来后,就基本不再去修改了,那么数据文件路径也就确定下来了,如我的环
境中:数据文件就放在/u01/app/oracle/oradata/zlm 下面而跟踪日志就放
在/u01/app/oracle/admin/zlm/bdump 下面
过了片刻以后,再查看监听状态,发现自动还是会去动态注册一个和 INSTANCE_NAME(SID)一致的
SERVICE_NAME
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.91)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "zlm" has 1 instance(s).
Instance "zlm", status READY, has 1 handler(s) for this service...
Service "zlmXDB" has 1 instance(s).
Instance "zlm", status READY, has 1 handler(s) for this service...
Service "zlm_SN" has 1 instance(s).
Instance "zlm", status UNKNOWN, has 1 handler(s) for this service...
Service "zlm_XPT" has 1 instance(s).
Instance "zlm", status READY, has 1 handler(s) for this service...
The command completed successfully
这样的话,我个人判断,如果不配置静态监听的话,pmon 进程始终会去监听那里注册一个名字和
INSTANCE_NAME(SID)一致的 SERVICE_NAME,即便是已经在 tnsnames.ora 中修改了
SERVICE_NAME=zlm_SN,而只有通过静态监听强制注册一个与 INSTANCE_NAME(SID)不一致的
SERVICE_NAME,才会被监听到
NET SERVICE NAME:
网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需,屏蔽了客户端
如何连接到服务器端的细节,实现了数据库的位置透明的特性。通常当我们用 DBLINK 连接数据库时,使用的
就是这个名字,由 USING 关键字指定,USING 'connect_string'这里 connect_string 其实就是 NET
SERVICE NAME。说到 DBLINK 还要提一点,就是当源数据库 GLOBAL_NAME=TRUE 时,link_name 必须与
远程数据库的全局数据库名 global_name)相同;否则,可以任意命名。同样地,当我们用 sqlplus
评论