暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle数据库的访问——客户端的TNSNAMES.ORA文件配置

原创 eygle 2019-12-26
6980

在前面的测试环节中,我们一直使用的数据库连接方式是本地连接,即通过SQL*Plus工具在数据库服务器本地,通过SYSDBA身份进行登陆,这种登陆方式在进行数据库管理时需要经常用到。

而数据库启动之后,要想提供网络服务,通过远程连接访问,我们还需要启动数据库的监听器(配置文件通常为listener.ora),监听器用于在特定的端口上(缺省的端口是1521)提供监听,接收来自客户端的访问请求(客户端请求通过tnsnames.ora文件定义发送)。

在专用服务器模式下(Dedicated Server),监听器会为每个请求衍生一个服务器进程相对应,通过这个服务器进程将客户端与数据库联系起来。下图描述了建立网络连接时客户端以及服务器端的相关文件及关系:

image.png

客户端的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文件中的参数设置会有所不同。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论