转眼到年关。但凡是年关,总要总结一下过去,畅想一下未来。
总的来说,过去还是修行不够,和大人们的差距很大。未来就是继续努力!
这次说一说我们从连接Oracle到断开的整个过程吧,也作为一个总结。其中肯定有环节是不明确或者有认识误区,希望不吝指教。
连接数据库到执行操作,直至最后断开,共分为下面几个阶段。
1、 建立连接,发起会话
这个环节的主要过程是实现客户端应用程序到数据库实例之间的会话。其中主要涉及到Oracle监听器和实例组件。
客户端程序通过sqlplus或者plsql developer等工具,向数据库服务器提出连接请求。连接时,大部分情况是通过本地NET命名服务指定一个名称来进行连接。
我们在netca中创建的“本地NET命名服务”实际上就是一个配置文件项目。查看客户端上的tnsname.ora文件,可以看到所配置的所有的本地NET命名服务信息。下面是一段连接名配置段。
//tnsname.ora文件配置片段
WILSON =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = wilson)
)
)
在配置片段中,说明定义了一个名字为wilson的本地命名,连接的数据库服务器在192.168.0.88的IP地址上。连接数据库实例的服务名为wilson,监听器所在的端口是1521。
我们连接的时候,使用conn命令。
SQL> conn scott/tiger@wilson
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
分隔符@后,使用的就是本地命名服务。本质上说,这个服务名就是连接服务器地址、服务名和监听端口的代名词。
在cmd窗口中,使用tnsping命令,是可以查看本地命名服务对应的连接信息的。
C:\Documents and Settings\Administrator>tnsping wilson
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 30-12月-
2010 21:43:36
Copyright (c) 1997, 2005, Oracle. All rights reserved.
已使用的参数文件:
D:\oracle\network\admin\sqlnet.ora //定义了oracle net service组件的一些参数,如安全等
已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 192.168.0.88)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = wilson)))
OK (0 毫秒)
有时候,手工进行tnsname.ora文件修改的时候,常常出现错误。实际中,可以使用tnsping命令查看连接的信息,判断是否配置正确。
连接命令尝试访问数据库服务器的指定端口。这时候,要注意它尝试连接的是数据库服务器的监听程序进程。监听程序作为一个独立的进程(Linux/Unix和Windows),在监听服务器主机的特定端口(默认为1521)等待客户端的请求。
监听程序是客户端与数据库实例连接的桥梁纽带。监听程序一方面在等待客户端的连接请求,另一方面接受数据库实例的连接信息。如果监听器使用动态注册技术,是可以周期性的获取到PMON后台进程提交的实例注册信息。实例注册信息包括实例的名称和服务名。在这个过程中,监听器也可以及时了解实例活动情况。下面是一段监听器运行情况:
LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 30-DEC-2010 14:09:52
Uptime 0 days 2 hr. 0 min. 50 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/network/admin/listener.ora
Listener Log File /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))
Services Summary...
Service "wilson" has 1 instance(s).
Instance "wilson", status READY, has 1 handler(s) for this service...
Service "wilsonXDB" has 1 instance(s).
Instance "wilson", status READY, has 1 handler(s) for this service...
The command completed successfully
当监听器接受到客户端的请求时,要进行请求匹配。将已有的注册信息与请求进行对比,如果有相同的注册内容,就认为连接允许,并且转接到数据库实例进行处理。
要注意,这个步骤中,不进行任何的身份验证。
监听器向数据库实例申请获取到一个Server Process进行会话连接。Oracle实例是若干后台进程和共享内存构成。客户端是不允许直接和实例内存空间进行交互,都需要通过Server Process(也成为影子进程)。监听器需要为客户端寻找一个Server Process进行联系。
这时不同的连接模式下,Oracle的行为就有所差别了。如果是专用连接模式,也就是一个客户端对应一个Server Process,客户端连接断开,Server Process释放,监听器需要向OS申请fork一个全新的Server Process。
如果是共享连接模式,数据库服务器上就还有一个名为Dispatcher的进程协同工作。监听程相当于向Dispatcher提出要求,获取一个Server Process。Dispatcher依据共享Server Process的原则,找到一个可以共享的Process返回给监听器程序。
监听器程序获取到Server Process的信息(进程号、通信端口等)之后,将其返回给客户端。客户端重新连接服务器主机,与Server Process单独通信连接。注意,这时两者通信的端口,不一定是1521。
直到这个阶段,客户端才将登陆用户名和密码信息通过Server Process进行验证。验证通过后,两者开始建立联系。