Oracle 的网络配置文件详解

Oracle 的网络配置文件详解

目录

  • [Oracle 的网络配置文件详解](#Oracle 的网络配置文件详解)
    • [一、Oracle 的网络配置文件概述](#一、Oracle 的网络配置文件概述)
        • [1、`listener.ora` 的内容](#1、listener.ora 的内容)
        • 2、`sqlnet.ora`的内容
        • [3、`tnsnames.ora` 的内容](#3、tnsnames.ora 的内容)
    • [二、配置 listener.ora 文件](#二、配置 listener.ora 文件)
    • [三、配置 tnsnames.ora 文件](#三、配置 tnsnames.ora 文件)
        • [1、tnsnames.ora 文件的内容](#1、tnsnames.ora 文件的内容)
        • [2、tnsnames 连接过程](#2、tnsnames 连接过程)
    • [四、配置 sqlnet.ora 文件](#四、配置 sqlnet.ora 文件)

一、Oracle 的网络配置文件概述

为了使外部进程能够访问 Oracle 数据库,必须配置 Oracle 网络环境。Oracle 网络环境是通过配置listener.orasqlnet.oratnsnames.ora 三个文件来实现的。

由于 Oracle 数据库是一个客户端服务器的软件,首先需要接收来自客户端的连接请求,服务器就必须配置监听器;其次,客户端要连接到某个制定的服务器,就必须配置到服务器的 tns 服务名。

其中 listener.ora 和服务器端相关,而 tnsnames.orasqlnet.ora 和客户端相关。只有远程连接数据库才需要用到这三个文件,其中,listener.ora 一般配置在服务端,sqlnet.oratnsnames.ora 一般配置在客户端。

以上三个文件保存在 $ORACLE_HOME/network/admin目录下。

shell 复制代码
[oracle@ora admin]$ cd $ORACLE_HOME/network/admin
[oracle@ora admin]$ ll
总用量 16
-rw-r--r-- 1 oracle oinstall 676 12月 31 18:47 listener.ora
drwxr-xr-x 2 oracle oinstall  64 12月 30 21:15 samples
-rw-r--r-- 1 oracle oinstall 381 12月 17 2012 shrept.lst
-rw-r--r-- 1 oracle oinstall 223 12月 30 21:28 sqlnet.ora
-rw-r----- 1 oracle oinstall 500 12月 31 18:51 tnsnames.ora

当我们安装好 Oracle数据库之后,会自动生成这三个文件。其中含有 listener.ora 文件是因为安装数据库的这台机器作为服务端,用来监听客户端发送过来的数据库连接;而含有 sqlnet.oratnsnames.ora 文件,是因为安装数据库的这台机器同时也可以作为客户端,用来配置连接其他远程数据库。

1、listener.ora 的内容
shell 复制代码
[oracle@oradg admin]$ cat listener.ora 
# listener.ora Network Configuration File: /usr/local/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradg)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /usr/local/oracle
2、sqlnet.ora的内容
shell 复制代码
[oracle@oradg admin]$ cat sqlnet.ora 
# sqlnet.ora Network Configuration File: /usr/local/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /usr/local/oracle
3、tnsnames.ora 的内容
shell 复制代码
[oracle@ora admin]$ cat tnsnames.ora 
# tnsnames.ora Network Configuration File: /usr/local/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

HISDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hisdb)
    )
  )

二、配置 listener.ora 文件

listener进程接受远程对数据库的接入申请并转交给 Oracle 的服务器进程。所以如果不是使用远程连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。

1、注册

注册就是将数据库作为一个服务注册到监听程序!

客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也可能不一样。

在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务。无论何时启动一个数据库,都有两条信息注册到监听器中:数据库服务器对应的实例和服务。如下所示:

shell 复制代码
[oracle@ora admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 01-JAN-2025 10:51:29

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                31-DEC-2024 18:51:55
Uptime                    0 days 15 hr. 59 min. 33 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /usr/local/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /usr/local/oracle/diag/tnslsnr/ora/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora)(PORT=1521)))
Services Summary...
Service "hisdb" has 1 instance(s).                                    # 服务名
  Instance "ora", status READY, has 1 handler(s) for this service...  # 实例名
Service "hisdbdg" has 1 instance(s).
  Instance "oradg", status UNKNOWN, has 1 handler(s) for this service...
Service "oraXDB" has 1 instance(s).
  Instance "ora", status READY, has 1 handler(s) for this service...
The command completed successfully

对应的服务名和实例名如下:

sql 复制代码
SQL> show parameter name

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
cell_offloadgroup_name		     string
db_file_name_convert		     string
db_name 			     string	 hisdb
db_unique_name			     string	 hisdb
global_names			     boolean	 FALSE
instance_name			     string	 ora    -- 实例名
lock_name_space 		     string
log_file_name_convert		     string
processor_group_name		     string
service_names			     string	 hisdb  --- 服务名

在数据库服务器和客户端之间有一监听程序(Listener ),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。

2、动态注册

动态注册是监听先启动,然后如果实例启动,则注册到监听当中,提供服务。

动态注册是在实例启动的时候PMON进程根据spfilepfileinit.ora)中的instance_nameservice_names两个参数将实例和服务动态注册到listener中。

首先要在init.ora中指定instance_nameservice_names两个参数的值。注册到监听器中的实例值从init.ora文件中的instance_name参数取得。如果该参数没有设定值,那么它将取init.ora文件中的db_name的值。如果在RAC中配置,必须将集群中每个实例的instance_name参数设置为一个唯一的值。

注册到监听器中的服务值从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接init.ora文件中的db_namedb_domain的值来注册自己。如果选择提供service_names值,可以使用完全限定的名称(如:orcl.oracle.com)或缩写的名称(如:orcl)。如果选择缩写的名称并设置了db_domain参数,注册到监听器中的服务将是service_name值和db_domain值的拼接。

例如:下面的设置将导致服务orcl.oracle.com被注册到监听器中:

shell 复制代码
db_domain=oracle.com
service_names=orcl

采取动态注册方法时,文件listener.ora中的内容如下:

shell 复制代码
SID_LIST_LISTENER =
 (SID_LIST =
   (SID_DESC =
     (GLOBAL_DBNAME = hisdb)
     (ORACLE_HOME = /usr/local/oracle/product/11.2.0/db_1)
     (SID_NAME = ora)
    )
  )

可以在service_names参数中指定多个服务值,值之间用逗号格开,这对于共享服务器配置是很有用的。动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),因为pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数。

(1)动态注册默认端口

说明:动态注册默认端口时监听的名字必须叫LISTENER 、端口号必须是1521

动态注册默认端口时,文件 listener.ora的内容如下:

shell 复制代码
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.129)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /usr/local/oracle
(2)动态注册非默认端口

说明:

■ 动态注册非默认端口时,监听的名字必须叫LISTENER

■ 端口使用其它未占用端口(如:1530)

■ 配置一个tns,假设名字为HISDB,使用1530 端口

■ 执行如下命令,配置数据库的local_listener参数为:HISDB

sql 复制代码
alter system set local_listener = HISDB ;

动态注册非默认端口的步骤如下:

步骤一:修改listener.ora 文件

shell 复制代码
[oracle@ora admin]$ vi listener.ora 

# listener.ora Network Configuration File: /usr/local/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora)(PORT = 1530))
    )
  )


ADR_BASE_LISTENER = /usr/local/oracle

步骤二:修改tnsnames.ora 文件

shell 复制代码
ORA_LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora)(PORT = 1530))
    (CONNECT_DATA =
      (SERVICE_NAME = hisdb)
    )
  )

步骤三:修改参数

sql 复制代码
alter system set local_listener = HISTDB;

步骤四:重启监听,查看监听状态

shell 复制代码
[oracle@ora admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 01-JAN-2025 12:01:11

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                01-JAN-2025 12:00:00
Uptime                    0 days 0 hr. 1 min. 10 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /usr/local/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /usr/local/oracle/diag/tnslsnr/ora/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora)(PORT=1530)))
Services Summary...
Service "hisdb" has 1 instance(s).
  Instance "ora", status READY, has 1 handler(s) for this service...
Service "oraXDB" has 1 instance(s).
  Instance "ora", status READY, has 1 handler(s) for this service...
The command completed successfully
3、静态注册

静态注册监听一启动,不管实例是否启动,实例的名字已经注册到监听中,主要用于dba远程启动数据库实例。

静态注册设置方法:设置GLOBAL_DBNAMESID_NAME参数。

注意:静态注册的监听status永远为UNKNOWN

例如:

shell 复制代码
[oracle@ora admin]$ vi listener.ora 

# listener.ora Network Configuration File: /usr/local/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
# ===========以下为动态注册的监听============================================================
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora)(PORT = 1521))
    )
  )
# ===========以下为静态注册的监听============================================================
SID_LIST_LISTENER =
 (SID_LIST =
   (SID_DESC =
     (GLOBAL_DBNAME = hisdb)
     (ORACLE_HOME = /usr/local/oracle/product/11.2.0/db_1)
     (SID_NAME = ora)
    )
    (SID_DESC =
     (GLOBAL_DBNAME = hisdbdg)
     (ORACLE_HOME = /usr/local/oracle/product/11.2.0/db_1)
     (SID_NAME = oradg)
    )
  )


ADR_BASE_LISTENER = /usr/local/oracle

重启监听,查看监听状态:

[oracle@ora admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 01-JAN-2025 12:25:31

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                01-JAN-2025 12:24:12
Uptime                    0 days 0 hr. 1 min. 18 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /usr/local/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /usr/local/oracle/diag/tnslsnr/ora/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora)(PORT=1521)))
Services Summary...
Service "hisdb" has 2 instance(s).
  Instance "ora", status UNKNOWN, has 1 handler(s) for this service...
  Instance "ora", status READY, has 1 handler(s) for this service...
Service "hisdbdg" has 1 instance(s).
  Instance "oradg", status UNKNOWN, has 1 handler(s) for this service...
Service "oraXDB" has 1 instance(s).
  Instance "ora", status READY, has 1 handler(s) for this service...
The command completed successfully

说明:

实例状态为UNKNOWN值时表明此服务是静态注册的设置。这时监听器不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。

动态注册的数据库通过状态信息中的状态READY或状态BLOCKED来指明。不管何时关闭数据库,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。不管数据库是在运行还是已经关闭,监听器总是知道它的状态。

三、配置 tnsnames.ora 文件

1、tnsnames.ora 文件的内容

该文件类似于 Linuxhosts 文件,提供 tnsname到主机名或者ip的对应。文件的内容如下:

shell 复制代码
[oracle@ora admin]$ vi tnsnames.ora

# tnsnames.ora Network Configuration File: /usr/local/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.


HISDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = hisdb)
    )
  )

说明:

(1)PROTOCOL:客户端与服务器端通讯的协议,一般为TCP ,该内容一般不用改。

(2)HOST:数据库监听所在机器的主机名或IP地址,数据库侦听一般与数据库在同一个机器上。

(3)PORT:数据库监听的端口。

(4)SERVICE_NAME:服务名。

2、tnsnames 连接过程

当输入sqlplus sys/oracle@hisdb 时:

(1)查询sqlnet.ora,查看名称的解析方式,发现是 TNSNAME

(2)查询tnsnames.ora文件,找到 HISDB 的记录,并且找到主机名,端口和 service_name

(3)如果listener进程没有问题的话,建立与listener 进程的连接。

(4)根据不同的服务器模式(如:专用服务器模式或者共享服务器模式,默认为专用服务器模式),listener采取接下去的动作。

四、配置 sqlnet.ora 文件

Oracle 通过该文件决定怎么样找一个连接中出现的连接字符串。 sqlnet.ora 文件的默认内容如下:

shell 复制代码
[oracle@ora admin]$ cat sqlnet.ora 
# sqlnet.ora Network Configuration File: /usr/local/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /usr/local/oracle

此时,如果在客户端输入如下内容:

sql 复制代码
[oracle@ora admin]$ sqlplus sys/oracle@hisdb as sysdba

则客户端会首先在tnsnames.ora文件中找hisdb的记录,如果没有相应的记录则尝试把 hisdb当作一个主机名。

相关推荐
开心工作室_kaic31 分钟前
springboot548二手物品交易boot代码(论文+源码)_kaic
前端·数据库·vue.js·后端·html5
尘浮生3 小时前
Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven
网络安全Ash3 小时前
全国知名网络安全赛事西湖论剑·杭州网络安全技能大赛启动报名
网络·安全·web安全
m0_634601665 小时前
2025.1.2
java·服务器·数据库
Spiffo_Sir5 小时前
【Spiffo】排障:VsCode报错“过程试图写入的管道不存在”(网络环境正常且地址正常的情况下依然出现)
网络·ide·vscode
MAR-Sky6 小时前
集线器,交换机,路由器,mac地址和ip地址知识记录总结
网络·tcp/ip·智能路由器
柒烨带你飞6 小时前
热备份路由HSRP及配置案例
网络·智能路由器
张乔247 小时前
spring boot项目启动时自定义logo
java·数据库·spring boot
黑客呀7 小时前
网络安全笔记
网络·安全·web安全
xiaobai12 37 小时前
MySQL图形化界面工具--DataGrip
数据库·mysql