讲解下listener.ora与 tnsnames.ora
写过一篇NET的 不过实验完后 复制记录 时 顺序有问题,所以重新整理实验记录一次
服务器listener
C:/>sqlplus xh/a831115
SQL*Plus: Release 10.1.0.2.0 - Production on 星期三 8月 12 13:17:32 2009
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
这种是IPC 连接(进程间连接) client与SERVER 在一台机器上
SQL> connxh/a831115@orcl;
已连接。
这种TCP IP连接 CLIENT 用TNSNAMES.ora ,server用 listener.ora
基本理论:
基本的TCP IP 过程是 CLIENT 发请求 SERVER 的LISTENER 进程 监听请求 然后LISTENER 通过PMON 注册到LISTENER的信息检查下,然后LISTENER 衍生出一个SERVER HANDLER 新
进程(理论上为LISTENER进程的子进程)并且将连接描述符也交给这个子进程,这样子进程 与CLIENT 通信 沿用LISTENER的IP&PORT ,CLIENT 属于一次TCP/IP连接,若OS 不允许
直接传送(WIN NT上就如此)CLIENT 请求 LISTENER ,LISTENER 衍生出SERVER HANDLER ,LISTENER 与衍生出的新进程IPC连接
新进程将PORT 告诉LISTENER ,LISTENER将PORT 告诉 CLIENT,CLIENT 用新PORT 与 新进程连接(IP 还是用LISTENER的 因为只发了PORT) 这样CLIENT 就是2次TCP连接,另外若
是SHARED MODE那么 LISTENER不会衍生SERVER HANDLER 而是提前配置好DISPATCHER进程 并且注册到LISTENER中
服务器端的 LISTENER.ORA
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)~~~~~~~~为外部存储过程配置的本地监听
(ORACLE_HOME = E:/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
)
)
C:/>lsnrctl
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 07-9月 -2009 15
0
Copyright (c) 1991, 2005, Oracle. All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL> status
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl_XPT" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...~~~~~~~~~~~~可以看到为 动态注册
命令执行成功 动态ready,静态unknown
情况一先启动 DATABASE 后启动 LISTENER
LSNRCTL> stop (关闭lsnrctl)
SQL> connxh/a831115@orcl
ERROR:
ORA-12541: TNS: 无监听程序
警告: 您不再连接到 ORACLE。
LSNRCTL> start
启动tnslsnr: 请稍候...
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> STATUS
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
SQL> connxh/a831115@orcl
ERROR:
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
此时我们可以等待 PMON进程60秒向LISTENER 注册信息 也可以 手动注册
SQL> alter system register;
系统已更改
LSNRCTL> STATUS
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序.
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...~~~~~~~~~~~~~~~~~~~手动注册信息后
服务 "orcl_XPT" 包含 1 个例程。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~READY动态注册
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
SQL> connxh/a831115@orcl
已连接。
这样的情况是由于 是动态注册导致,listener.ora中没有服务的信息(要等 60秒PMON 才会向LISTENER注册)
下面针对这种情况 配置静态注册(静态配置 就是将信息明确的写到 LISTENER。ORA中)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:/oracle/product/10.2.0/Db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = E:/oracle/product/10.2.0/Db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))~~~~~~~~~~~~~~~~~~~~~把信息加到LISTENER.ORA中
)
) 协议,主机名字(IP也行) ,端口号
LSNRCTL>STop
LSNRCTL>START(造成DATABASE 先启动LSNRCTL 后启动)
LSNRCTL>STATUS
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...~~~~~~~~~~~~~~~~~~~~~~~~静态注册(UNKNOW) 此时可以看到没有动态注册(READY)
命令执行成功
SQL> connxh/a831115@orcl(通过静态注册连接)
已连接。
LSNRCTL>STATUS
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 2 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl_XPT" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...~~~~~~~~~~~~~~~过了会看 PMON想LSNRCTL 动态注册了
动态注册的一个特点就是不需要LISTENER.ORA文件
默认情况PMON 向LSNRCTL 注册TCP/IP协议,PORT 为1521*********当然可以改端口号 需要下面这个参数 ,对此将有单独的实验
SQL> show parameter local
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string
SQL> host move E:/oracle/product/10.2.0/Db_1/NETWORK/ADMIN/listener.ora d:/listene ~~~~~~~~~~~~~~~移走
r.ora
LSNRCTL> stop
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
命令执行成功
LSNRCTL> start
命令执行成功
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
TNS-12541: TNS: 无监听程序
TNS-12560: TNS: 协议适配器错误
TNS-00511: 无监听程序
32-bit Windows Error: 2: No such file or directory
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=6688-621)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Producti
on
启动日期 07-9月 -2009 16:31:59
正常运行时间 0 天 0 小时 0 分 6 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序日志文件 E:/oracle/product/10.2.0/db_1/network/log/listener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(PORT=1521)))
监听程序不支持服务
命令执行成功
*****
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...~~~~~过一会PMON 注册动态LISTENER了
服务 "orcl_XPT" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
SQL> connxh/a831115@orcl;
已连接。
静态时候 LISTENER 将 LISTENER.ORA中 GLOBAL_NAME 与CLIENT TNSNAMES.ORA中 SERVIEC_NAME 匹配 若CILENT TNSNAME.ORA中用的 SID 那么 listener use LISTENER.ORA中
SID_name 匹配就行了
实验看下
listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:/oracle/product/10.2.0/Db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = E:/oracle/product/10.2.0/Db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
)
)
tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl) ~~~~~~~~~~~~~~~~~~~将SERVICE_NAME 修改成别的
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ---------------
db_name string xhtest
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ---------------
db_domain string
SQL> show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------- ---------------
service_names string ORCL, XH
SQL> show parameter global_name
NAME TYPE VALUE
------------------------------------ ----------- ---------------
global_names boolean FALSE
SQL>
default service_name=global_name=db_name.db_domain
用server_name匹配
(SID_DESC =
(GLOBAL_DBNAME = tttttt)~~~~~~~~~~~~~~~~~~~修改 (LISTENER.ORA)
(ORACLE_HOME = E:/oracle/product/10.2.0/Db_1)
(SID_NAME = orcl)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)~~~~~~~~
(SERVICE_NAME= orcl)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(tnsnames.ORA)
)
)
LSNRCTL STOP
START
STATUS
服务 "tttttt" 包含 1 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...~~~此时只有一个静态
命令执行成功
LSNRCTL>
SQL> connxh/a831115@orcl
ERROR:
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务~~~出现问题 LISTENER.ORA中GLOBAL_NAME与 TNSNAMES.ORA中SERVICE_NAME 不匹配
警告: 您不再连接到 ORACLE。
用orcle_sid匹配
LISTENER.ORA
(SID_DESC =
(GLOBAL_DBNAME = tttttt)~~~~~~~~~~~~~~不在使用这个匹配
(ORACLE_HOME = E:/oracle/product/10.2.0/Db_1)
(SID_NAME = orcl)~~~~使用这个
)
)
tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(oracle_sid = orcl)**********************************让TNSNAMES使用ORACLESID 这样 LISTENER.ORA 将用 SID_NAME与起其匹配
)
)
LSNRCTL STOP
START
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "tttttt" 包含 1 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...~~~~~~~~~~~~~~~~~~静态注册
命令执行成功~~~~~~~~~~~~~LSTENER STATUS
SQL> connxh/a831115@orcl
已连接。
******************
关于tnsnames.ora
这个是CLIENT 要配的~~~CLIENT 总要知道些信息才能 才能连接吧 包括 用户 名 密码,IP,PORT,SERVICE_name
xh =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(oracle_sid = orcl)
)
)
AA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(oracle_sid = orcl)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
也可以 不用TNSNAME。ORA直接连
IP Address. . . . . . . . . . . . : 192.168.1.126
SQL> connxh/[email protected]:1521/xh (IP ,PORT,连接符) 属于EASY NAMING
Connected.
SQL> connxh/a831115@(description=(address=(protocol=tcp)(host=6688-621)(port=1521)
)(connect_data=(sid=orcl)))
已连接。
LOCAL NAMING 就是 都放入 TNSNAME。ORA
SQLNET。ORA
SQLNET.AUTHENTICATION_SERVICES= (NTS)~~可以控制/ AS SYSDBA(会有单独实验详细介绍 AS SYSDBA)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 这个是允许CLIENT连接的方式
若 TNSNAMES去掉
C:/>sqlplusxh/a831115@xh
SQL*Plus: Release 10.1.0.2.0 - Production on 星期三 8月 12 15:56:32 2009
Copyright (c) 1982, 2004, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~几个检查
C:/>PING 192.168.1.126~~~~~~~~~~~~网络
Pinging 192.168.1.126 with 32 bytes of data:
Reply from 192.168.1.126: bytes=32 time<1ms TTL=128
Reply from 192.168.1.126: bytes=32 time<1ms TTL=128
Reply from 192.168.1.126: bytes=32 time<1ms TTL=128
Reply from 192.168.1.126: bytes=32 time<1ms TTL=128
Ping statistics for 192.168.1.126:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
C:/>tnsping xh~~~~~~~~~oracle层的检查
TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 12-8月 -
2009 15:58:55
Copyright (c) 1997, 2003, Oracle. All rights reserved.
Used parameter files:
E:/oracle/product/10.1.0/Db_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621
)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (oracle_sid = orcl)))
OK (50 msec)
若PING通 但TNSPING不通 那么检查TNSNAMES.ora or sqlnet.ora中是否禁用TNSNAMES
C:/>lsnrctl~~~~控制LISTENER
LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 12-8月 -2009 16:0
1:17
Copyright (c) 1991, 2004, Oracle. All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:
start stop status
services version reload
save_config trace change_password
quit exit set*~~~~~~~~~~~~~~还有许多可设置的参数
show*
LSNRCTL> show
The following operations are available after show
An asterisk (*) denotes a modifier or extended command:
rawmode displaymode
rules trc_file
trc_directory trc_level
log_file log_directory
log_status current_listener
inbound_connect_timeout startup_waittime
snmp_visible save_config_on_stop 使用查联机文档就行了