作者:GDY1039
这是又长又臭的一章,让我们一起征服它吧。
本章是围绕SQLNET.ORA、TNSNAMES.ORA和LISTENER.ora三个配置文件展开的,管理这三个文件有三个方法:
- 启动Oracle net Manager工具
- 使用OEM,点击主目录->一般信息->监听程序->进入后在下面“相关连接”中找到“网络服务管理”
- 使用文本编辑,位置是%oracle_home%/network/admin。警告:不要在这里删除监听器,最好只是修改。
创建监听器
其实我觉得只要明白原理,抓图介绍真的很无聊。所以不抓图了,反正当初我不明白的时候,看了网上很多带图了(甚至包括ORACLE官方的”两天DBA“的教程)也还是不明白。总的来说,不明白原理,带图也带是不会明白的。现在我们用Oracle Net Manager创建一个”listener1"监听器吧。创建时有两点注意的:- 监听器的端口必需唯一
- 记得保存
- 在lsnrctl中使用start listener1命令启动它
# listener.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/NETWORK/ADMIN/listener.ora
# Generated by Oracle configuration tools.
LISTENER1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = netplus)(PORT = 1523))
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)
SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(SID_NAME = ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
)
)
创建完后,我们可以看一下启动它,并看一下它的状态。这里我们会用到"lsnrctl",它是监听器的命令行工具。
D:/Documents and Settings/gdy>lsnrctl
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 22-6月 -2007 20:4
6:29
Copyright (c) 1991, 2005, Oracle. All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL> status listener1
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1523)))
TNS-12541: TNS: 无监听程序
TNS-12560: TNS: 协议适配器错误
TNS-00511: 无监听程序
32-bit Windows Error: 61: Unknown error
LSNRCTL> start listener1
启动tnslsnr: 请稍候...
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
写入D:/oracle/product/10.2.0/db_1/network/log/listener1.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1523)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1523)))
LISTENER 的 STATUS
------------------------
别名 listener1
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 22-6月 -2007 20:46:43
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener1.lo
g
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1523)))
服务摘要..
服务 "ORCL" 包含 1 个例程。
例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> status listener1
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1523)))
LISTENER 的 STATUS
------------------------
别名 listener1
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 22-6月 -2007 20:46:43
正常运行时间 0 天 0 小时 0 分 9 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener1.lo
g
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1523)))
服务摘要..
服务 "ORCL" 包含 1 个例程。
例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序... #为什么是UNKNOWN我也不知道,但是它就是能用,有人能告诉我为什么吗?如果用数据库自动注册到这个监听器,它就不会是UNKNOWN
命令执行成功
LSNRCTL>
重新载入监听器
各位请注意,我在这里要展示一个ORACLE中lsnrctl的BUG。!!!如果在Net Manager里修改了监听器,而没有重新进入lsnrctl,则会遇到各种奇怪问题。
按照文档和lsnrctl的帮助,如果监听器正在运行,而listener.ora又被修改。这时可以使用reload命令重新载入监听器。它比起关闭再启动监听器更有效率。我们先在Oracle Net Manager里把listener1的监听端口改成 1524,然后reload试试.
LSNRCTL> reload listener1
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1523))) #注意这里,PORT是1523,它的端口并没有被更新
命令执行成功
LSNRCTL> reload listener1
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.1)(PORT=1523))) #再来一次结果还是一样
命令执行成功
LSNRCTL> stop listener1 #重启监听器试试
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.1)(PORT=1523)))
命令执行成功
LSNRCTL> start listener1
启动tnslsnr: 请稍候...
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
写入D:/oracle/product/10.2.0/db_1/network/log/listener1.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.1)(PORT= 1524)))
#结果更惨,看看下面一大堆的错误。不要恢心,我们看看上面一行监听端口已经被更新为1524,但是为什么下面还是尝试连接1523呢?
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.1)(PORT= 1523)))
TNS-12541: TNS: 无监听程序
TNS-12560: TNS: 协议适配器错误
TNS-00511: 无监听程序
32-bit Windows Error: 61: Unknown error
LSNRCTL> status listener1 #我们看一下状态,还是显示1523。会不会是LSNRCTL在内存有一些东西没被清理好呢?好灵感来了
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.1)(PORT= 1523)))
TNS-12541: TNS: 无监听程序
TNS-12560: TNS: 协议适配器错误
TNS-00511: 无监听程序
32-bit Windows Error: 61: Unknown error
LSNRCTL> exit
D:/Documents and Settings/gdy> lsnrctl
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 23-6月 -2007 14:0
1:32
Copyright (c) 1991, 2005, Oracle. All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL> start listener1
TNS-01106: 使用名称listener1的监听程序已经启动
LSNRCTL> status listener1 #从这里正常的状态,加上刚刚上面那条启动命令的结果。我们可以猜到,在之前一次LSNRCTL里,我们尝试启动虽然出错,但是监听器其实已经正常工作了。出错只是在它自检测试时。
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.1)(PORT=1524)))
LISTENER 的 STATUS
------------------------
别名 listener1
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 23-6月 -2007 14:00:00
正常运行时间 0 天 0 小时 1 分 46 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener1.lo
g
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.1)(PORT=1524)))
服务摘要..
服务 "ORCL" 包含 1 个例程。
例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> #终于正常了
上面是出错的一种情况,下面我再展示另一个同类错误.
首先,我们不要退出上面的LSNRCTL(这一点很重要!!!)。然后我们在NET MANAGER里创建一个listener5并保存,然后我们还是用之前打开的LSNRCTL窗口看一下它的状态.LSNRCTL> status listener5
TNS-01101: 无法找到服务名称
LSNRCTL> start listener5 ##出错,糟糕的出错!
启动tnslsnr: 请稍候...
Failed to open service <OracleOraDb10g_home1TNSListenerlistener5>, error 1060.
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
写入D:/oracle/product/10.2.0/db_1/network/log/listener5.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1525)))
TNS-01101: 无法找到服务名称
LSNRCTL>
#不要恢心,我们另外开一个DOS窗口,再进入LSNRCTL试试
D:/Documents and Settings/gdy>lsnrctl
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 23-6月 -2007 14:2
8:26
Copyright (c) 1991, 2005, Oracle. All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL> status listener5 #应该也是之前的一条启动命令让监听器启动了
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1525)))
LISTENER 的 STATUS
------------------------
别名 listener5
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 23-6月 -2007 14:28:41
正常运行时间 0 天 0 小时 0 分 24 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener5.lo
g
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1525)))
服务摘要..
服务 "ORCL" 包含 1 个例程。
例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> stop listener5
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1525)))
命令执行成功
LSNRCTL> start listener5
启动tnslsnr: 请稍候...
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
写入D:/oracle/product/10.2.0/db_1/network/log/listener5.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1525)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1525)))
LISTENER 的 STATUS
------------------------
别名 listener5
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 23-6月 -2007 14:29:35
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener5.lo
g
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1525)))
服务摘要..
服务 "ORCL" 包含 1 个例程。
例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> #终于正常了
总结上面经验,我们先创建一个LISTENER6并保存,然后再打开一个新的DOS窗口,并进入LSNRCTL试试
D:/Documents and Settings/gdy>lsnrctlLSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 23-6月 -2007 14:3
1:18
Copyright (c) 1991, 2005, Oracle. All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL> status listener6
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1526)))
TNS-12541: TNS: 无监听程序
TNS-12560: TNS: 协议适配器错误
TNS-00511: 无监听程序
32-bit Windows Error: 61: Unknown error
LSNRCTL> start listener6
启动tnslsnr: 请稍候...
#看看下面那一行,还是出错呀!!!真受不了。
Failed to open service <OracleOraDb10g_home1TNSListenerlistener6>, error 1060.
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
写入D:/oracle/product/10.2.0/db_1/network/log/listener6.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1526)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1526)))
LISTENER 的 STATUS
------------------------
别名 listener6
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 23-6月 -2007 14:31:39
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener6.lo
g
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1526)))
服务摘要..
服务 "ORCL" 包含 1 个例程。
例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> exit #退出去再试试!!!
D:/Documents and Settings/gdy>lsnrctl
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 23-6月 -2007 14:3
1:51
Copyright (c) 1991, 2005, Oracle. All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL> stop listener6
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1526)))
命令执行成功
LSNRCTL> start listener6
启动tnslsnr: 请稍候...
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
写入D:/oracle/product/10.2.0/db_1/network/log/listener6.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1526)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=netplus)(PORT=1526)))
LISTENER 的 STATUS
------------------------
别名 listener6
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 23-6月 -2007 14:32:05
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.o
ra
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener6.lo
g
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1526)))
服务摘要..
服务 "ORCL" 包含 1 个例程。
例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> #终于正常了
动态注册服务
配置这个特性只需要修改init.ora或spfile.ora中的三个参数- 修改Local_Listener,使它看起来像以下的样子,其实就是把需要动态注册到的监听器的信息写到LOCAL_LISTENER
- Local_Listener=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = NETPLUS) (PORT = 1522)
- 配置Instance_name为需要动态注册的数据库服务的SID
- 配置Service_names为需要动态注册的数据库服务的全局数据库名,如果没有则配置为SID
使用多个监听器时的附加配置
连接时间故障切换特性
启用这个特性只需要在tnsnames.ora的地址列表中添加多个监听器即可。它会 按顺序尝试每个地址, 直到有一个地址成功具体例子如下ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1524))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1526))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)
客户负载平衡
启用这个特性,本地命名会 随机尝试每个地址, 直到有一个地址成功ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1524))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1526))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)
配置客户的Oracle Net
主机命名方法
没什么好说的,就是配置sqlnet.ora和主机名。主机名可以使用HOSTS文件或DNS。Oracle Easy Connect Naming
简单,看理论编就明白了本地命名(tnsnames.ora)
也是在理论里说明白了。首先我们明白本地命名是客户寻找监听器的方法,然后我们明白tnsnames.ora里面选项是什么意思,一切已经那么明白,还有什么好说?Tnsping工具
最后,我们说一下这个工具吧使用它,我们可以测试我们配置好的命名方法和监听器。例如我们配置了一个叫orcl的本地命名,它指向名叫listener的监听器的监听地址和端口。这时候我们可以tnsping测试客户到监听器的通讯是否正常,需要注意的是tnsping并不实际连接到ORACLE服务器,它只测试客户到监听器的通讯是否正常。
D:/Documents and Settings/gdy>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 23-6月 -
2007 16:03:39
Copyright (c) 1997, 2005, Oracle. All rights reserved.
已使用的参数文件:
D:/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 192.168.1.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVIC
E_NAME = orcl)))
OK (10 毫秒)
D:/Documents and Settings/gdy>