在前面的测试环节中,我们一直使用的数据库连接方式是本地连接,即通过SQL*Plus工具在数据库服务器本地,通过SYSDBA身份进行登陆,这种登陆方式在进行数据库管理时需要经常用到。
而数据库启动之后,要想提供网络服务,通过远程连接访问,我们还需要启动数据库的监听器(配置文件通常为listener.ora),监听器用于在特定的端口上(缺省的端口是1521)提供监听,接收来自客户端的访问请求(客户端请求通过tnsnames.ora文件定义发送)。
在专用服务器模式下(Dedicated Server),监听器会为每个请求衍生一个服务器进程相对应,通过这个服务器进程将客户端与数据库联系起来。下图描述了建立网络连接时客户端以及服务器端的相关文件及关系:
客户端的TNSNAMES.ORA文件配置
客户端为了连接Oracle数据库服务器,需要安装客户端软件,并在客户端配置网络服务名文件(当然Oracle支持多种连接方式,这里主要介绍网络服务名文件方式连接,也就是tnsnames.ora文件),这个配置文件位于$ORACLE_HOME/network/admin目录下,在Windows和Unix/Linux上的位置是相同的,文件名为tnsnames.ora。
一段典型的配置为:
EYGLE= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.33.11)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = eygle) ) )
复制
这里的ADDRESS部分包含了服务器的地址及监听端口信息,CONNECT_DATA部分包含了连接信息,用于定义目标服务的名称。SERVICE_NAME在这里用于识别访问的数据库服务;SERVICE_NAME在这里也经常可以用SID来替代,从Oracle 9i开始,Oracle推荐使用SERVICE_NAME而不是SID。
配置完成之后,可以通过tnsping工具进行连通性测试:
[oracle@jumper oracle]$ tnsping eygle Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.33.11)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = eygle))) OK (10 msec)
复制
如果能够顺利通讯,则可以通过SQL*Plus或其他工具通过网络服务名进行数据库网络访问:
SQL> connect system/oracle@eygle Connected. SQL> select sid,username,machine from v$session where username='SYSTEM'; SID USERNAME MACHINE ---------- ------------------------------ ------------------------------ 11 SYSTEM eygle.com
复制
注意:tnsping工具只是测试监听能否连通,如果tnsping返回的结果为OK,表明客户端到服务器的网络是通畅的,同时表明监听的TCP端口与客户端配置的TCP端口是一致的。
实际上tnsping测试时,监听并不检查客户端输入的SERVICE_NAME或SID,所以tnsping成功并不意味着tnsname的配置就是完全正确的,也不意味着就一定能连接上数据库,也许数据库根本还没启动。
特殊的,除了tnsnames.ora文件之外,Oracle支持通过SQL*Plus直接连接远程或本地数据库,当然需要在连接时指定必须的参数信息,例如:
SQL>conn eygle/eygle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.33.32)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=hsbill))) Connected. SQL> select instance_name,startup_time,version from v$instance; INSTANCE_NAME STARTUP_T VERSION ---------------- --------- ----------------- hsbill 07-MAY-08 9.2.0.4.0
复制
连接本地数据库可以使用类似如下方式:
conn eygle/eygle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=localhost)(Port=1521))(CONNECT_DATA=(SID=eygle)))
复制
从Oracle 10g开始,还可以使用如下方式进行连接(这个特性在本章后面“简捷的Easy Connect方式”一节有详细说明):
SQL> connect eygle/eygle@localhost:1521/eygle Connected. SQL> select sid,program from v$session where username='EYGLE'; SID PROGRAM ---------- ------------------------------------------------ 158 sqlplus@test126 (TNS V1-V3)
复制
前面说的是客户端,现在说说服务器端;在服务器端数据库中存在一个初始化参数SERVICE_NAMES,这个参数就是用于定义客户端请求的数据库服务名。
Oracle文档中这样定义这个初始化参数:
SERVICE_NAMES为实例所连接的数据库定义一个或多个服务名,可以通过定义多个服务名将不同用户连接区分开来。
这个参数的缺省格式为:DB_NAME.DB_DOMAIN,如果定义了DB_DOMAIN那么定义的服务名就类似:
SERVICE_NAMES = sales.eygle.com, news.eygle.com
复制
通过这样的定义,销售用户可以通过在客户端TNSNAME定义中使用SALES服务名来建立连接,而新闻用户则可以通过NEWS服务名进行连接,最终用户可以不必关注数据库是哪一个,他们只需要关心服务名。
注意:在RAC环境中,tnsnames.ora文件中的参数设置会有所不同。