要用数据库的人最头疼的就是连接不上数据库 这个章节将讲述一些关于连接的配置
Oracle提供了Oracle Net Service组件: (Oracle Net;Oracle Net Listeners;Oracle Connection Listeners;Oracle Net Configuration Assistant;Oracle Net Manager)它们是用来配置和管理网络连接。 这些组件不需要独立安装,在安装数据库服务器或者客户端软件时会被自动安装,其中Oracle Net组件必须在客户机和服务器上都按照,它负责完成客户机和服务器之间的连接初始化、建立以及维护工作(此组件由Oracle Network Foundation Layer 和Oracle Protocol Support 两部分组成)
Oracle网络连接的流程:
客户端发起连接。需要服务器、静听端口、协议、数据库服务名。
客户端一旦与监听器建立连接,则在客户端生成用户进程,同时监听器会判断客户端所请求的服务名是否是自己所管理的服务名。如果客户端传过来的连接字符串不包含服务名,报错;如果请求的服务名不是自己管理的,报错并中断;如果请求的服务名是自己管理的,监听器就在数据库服务器上创建服务器进程。
监听器在传教服务器进程以后,会将用户进程与服务器进程建立连接,之后,监听器退出与客户端的连接。
服务器进程根据用户进程提供的用户名和密码到数据字段李判断是否正确。
如果用户名和密码不匹配,报错;如果匹配,则分配PGA并生成SESSION。
服务器端监听器配置:无论是共享服务器还是专有服务器连接,数据库服务器端必须启动监听程序。
监听程序即 Oracle Net Service 服务,该文件名为 listener.ora 目录一般在 ORACLE_HOME/NETWORK/ADMIN 目录下Oracle的监听程序只运行在数据库服务器上,完成监听客户连接请求的作用。Oracle使用lsnrctl实用程序完成监听程序的配置和管理。
-----------------------------------------------------------------------------------------------------------------------------------------
LISTENER =
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP) (HOST=ocm1.oracle) (PORT=1521))
)
)
-----------------------------------------------------------------------------------------------------------------------------------------
监听器LISTENER使用的协议为TCP,HOST为ocm1,oracle,端口是1521(默认端口),改监听器为启动监听的默认监听器,即如果不具体指定启动那个具体,则默认启动名为LISTENER的监听器,当然也可以配置一个其他名字的监听器,端口也可以不同。
启动监听器要使用lsnrctl指令,并查看状态
-----------------------------------------------------------------------------------------------------------------------------------------
C:\oracle\product\10.1.0\db_1\BIN>lsnrctl status listener
LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 06-MAY-2014 17:01:04
Copyright (c) 1991, 2004, Oracle. ALL rights reserved.
Connecting to(DESCRIPTION=(ADDRESS-(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521)))
STATUS of the LISTENER
----------------------------------------------
Alias LISTENER
Version TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production
Start Date 05-MAY-2014 10:58:16
Uptime 1 days 6 hr. 2 min. 48 sec
Trace Leve1 off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File C:\oracle\product\10.1.0\db_1\network\admin\listener.ora
Listener Log File C:\oracle\product\10.1.0\db_1\network\admin\listner.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS-(PROTOCOL=TCP)(HOST=ocm1.oracle)(PORT=1521)))
Services Summary...
Serviece "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status READY, has 1 handler(s) for this service...
The command completed successfully
-----------------------------------------------------------------------------------------------------------------------------------------
以上可以看出,没有任何服务注册在该服务器上,客户端无法连接到改服务器。此时没有涉及服务器名的问题,只有客户端在将服务名传给监听器以后,监听器经过处理才能建立客户端到数据库服务器的连接。
那么该如何注册呢?(有两种手段:动态和静态的)
动态注册:
数据库实例里的PMON进程(在介绍几大进程里说过),将当前实例的服务名注册到同一台服务器上,默认在1521端口上监听的监听器(就是名为LISTENER的监听器),当前实例的服务名由初始化参数service_name决定。
先查看服务器名
-----------------------------------------------------------------------------------------------------------------------------------------
SQL> show parameter service_name
NAME TYPE VALUE
--------- ------------------- -------------------
service_names string PROD
-----------------------------------------------------------------------------------------------------------------------------------------
显示了当前的服务器名为PROD。接下来手动完成动态注册参数local_listener 控制动态注册到的监听器,也就是决定将数据库动态注册懂啊哪个监听器。
-----------------------------------------------------------------------------------------------------------------------------------------
SQL> show parameter local_listener;
NAME TYPE VALUE
---------- ---------------- ----------------
local_listener string
-----------------------------------------------------------------------------------------------------------------------------------------
可以看到当前的值为空,没有设置动态注册的监听器的信息。我们设计将数据库PROD动态注册到监听器LISTENER1。
LISTENER1的配置如下:
LISTENER1 =
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.1.10) (PORT=1522))
)
)
---------------------------------------------------------------------------------------------------------------------------------------------------------
SQL> alter system set local_listener = '(address_list=(address=(protocol=tcp)(host=192.168.1.10)(port=1522)))';
System altered.
---------------------------------------------------------------------------------------------------------------------------------------------------------
此时再去查看LISTENER的状态信息 方法就是使用Lsnrctl命令这里就不多说了。
静态注册:
就是将数据库的信息直接注册到监听器的配置文件中,这样只要监听器启动就会今天注册该服务,这里注意必须要重启监听器改注册才有效
如何配置呢?先看看一下的LISTENER.ORA文件内容
---------------------------------------------------------------------------------------------------------------------------------------------------------
LISTENER =
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.1.10) (PORT=1521))
)
)
LISTENER1 =
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.1.10) (PORT=1522))
)
)
SID_LIST_LISTENER =
(SID_LIST=
(SID_DESC=
(SID_NAME=PROD )
(Oracle_HOME=/oracle/product/10.1.0/db_1)
(GLOBAL_DBNAME=PROD)
)
)
---------------------------------------------------------------------------------------------------------------------------------------------------------
目前不要重启监听器,我们先查看PROD服务是否注册了监听器LISTENER1使用lsnrctl命令这里自己查看下会发现是没有注册的。
然后再重启监听器lsnrctl stop LISTENER;再 lsnrctl start LISTENER。
再去查看是否注册成功,自然会发现已经注册了。注意其中有句话是这样写的Service “PROD” has 1 instance(s).
Instance "PROD", status UNKNOWN,这句话说明是一个静态注册。
上面已经注册了监听器接下来我们要测试连接,
测试连接:
服务器端已经搞定,接下来就是客户端的事情了,客户端要设置和修改tns(tnsnames.ora文件)这个文件将客户端的服务器名和监听器服务名之间建立映射关系,并告诉客户端软件要连接到数据库服务器的实体信息,具体如下
---------------------------------------------------------------------------------------------------------------------------------------------------------
TEST_PROD=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.1.10)(PORT=1521))
)
(CONNECT_DATA=
(SERVER= DEDICATED)
(SERVICE_NAME=PROD)
)
)
---------------------------------------------------------------------------------------------------------------------------------------------------------
接下来我们使用tnsping 命令测试客户端到监听器是否畅通
---------------------------------------------------------------------------------------------------------------------------------------------------------
tnsping TEST_PROD
TNS Ping Utility for 32-bit Windows:Version 10.1.0.2.0 - Production on 07-MAY 2014 12:05:17
Copyright (c) 1997, 2003, Oracle. ALL rights reserved.
Used parameter files:
......
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)
(HOST = 192.168.1.10)
(PORT = 1521)
(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = PROD))))
OK(400msec)
---------------------------------------------------------------------------------------------------------------------------------------------------------
显然已经连接畅通,当然如果数据没有启动,而只是启动了监听,此时一样可以PING通,接下来可以去查看SQL*PLUS是否能正常连接。
监听程序管理命令:
lsnrctl 使用程序来管理和维护监听,具体命令可以使用help去查看;常用的有以下几个命令
lsnctl start:启动监听程序,默认启动名为LISTENER的监听程序,如果不是的就在后面加上要启动的名称。
lsnctl stop:关闭监听程序,默认启动名为LISTENER的监听程序,如果不是的就在后面加上要启动的名称。
lsnctl service:查看监听为连接请求监控的服务内容。
lsnctl reload:允许重做监听程序,如监听文件更改,可以使用该指令是的修改生效,在重载过程中已经建立连接的客户端继续保持连接。
lsnctl set:设置监听管理密码,防止未授权而操作监听器。
先说几个例子吧:
1.多监听器设置:在一个服务器上可以运行多个监听程序,在RAC环境下比较普遍,此时往往需要设置CONNECT_TIME)FAILOVER参数,其含义是在客户机使用新的监听程序建立连接前需要等等通过当前监听程序连接的时间长度
2.设置队列长度:如果有大量客户请求连接往往是的今天程序无法提供足够的连接资源,此时发生监听程序失败难以避免,为了控制客户连接到监听器的数量,在监听器文件中设置queuesize参数,告诉监听器可以为多少个连接提供并发服务如:
---------------------------------------------------------------------------------------------------------------------------------------------------------
LISTENER =
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.1.10) (PORT=1521)(QUEUESIZE=5))
)
)
---------------------------------------------------------------------------------------------------------------------------------------------------------
3.设置监听程序密码:因为默认是没有密码的,任何人进入操作系统的就可以操作监听器。如何设置如下
---------------------------------------------------------------------------------------------------------------------------------------------------------
LSNRCTL > set password
Password:
The command completed successfully
LSNRCTL> change_password
Old password:
New password:
Reenter new password:
Connecting to
(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP) (HOST=192.168.1.10) (PORT=1521)))
Password changed for LISTENER
The command completed successfullu
LSNRCTL> save_config
Connecting to
(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP) (HOST=192.168.1.10) (PORT=1521)))
Saved LISTENER configuration parameters.
Listener Parameter File
Old Parameter File
The command completed successfully
---------------------------------------------------------------------------------------------------------------------------------------------------------
以上就已经修改好密码了重启和关闭监听器需要输入相关密码。