Oracle 的网络配置文件详解
Oracle 的网络配置文件详解
目录
- Oracle 的网络配置文件详解
- 一、Oracle 的网络配置文件概述
- 1、`listener.ora` 的内容
- 2、`sqlnet.ora`的内容
- 3、`tnsnames.ora` 的内容
- 二、配置 listener.ora 文件
- 1、注册
- 2、动态注册
- (1)动态注册默认端口
- (2)动态注册非默认端口
- 3、静态注册
- 三、配置 tnsnames.ora 文件
- 1、tnsnames.ora 文件的内容
- 2、tnsnames 连接过程
- 四、配置 sqlnet.ora 文件
一、Oracle 的网络配置文件概述
为了使外部进程能够访问 Oracle 数据库,必须配置 Oracle 网络环境。Oracle 网络环境是通过配置listener.ora
、sqlnet.ora
和 tnsnames.ora
三个文件来实现的。
由于 Oracle 数据库是一个客户端服务器的软件,首先需要接收来自客户端的连接请求,服务器就必须配置监听器;其次,客户端要连接到某个制定的服务器,就必须配置到服务器的 tns 服务名。
其中 listener.ora
和服务器端相关,而 tnsnames.ora
与 sqlnet.ora
和客户端相关。只有远程连接数据库才需要用到这三个文件,其中,listener.ora
一般配置在服务端,sqlnet.ora
、tnsnames.ora
一般配置在客户端。
以上三个文件保存在 $ORACLE_HOME/network/admin
目录下。
[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.ora
、tnsnames.ora
文件,是因为安装数据库的这台机器同时也可以作为客户端,用来配置连接其他远程数据库。
1、listener.ora
的内容
[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
的内容
[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
的内容
[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、注册
注册就是将数据库作为一个服务注册到监听程序!
客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也可能不一样。
在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务。无论何时启动一个数据库,都有两条信息注册到监听器中:数据库服务器对应的实例和服务。如下所示:
[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> 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
进程根据spfile
或pfile
(init.ora
)中的instance_name
、service_names
两个参数将实例和服务动态注册到listener
中。
首先要在init.ora
中指定instance_name
、service_names
两个参数的值。注册到监听器中的实例值从init.ora
文件中的instance_name
参数取得。如果该参数没有设定值,那么它将取init.ora
文件中的db_name
的值。如果在RAC
中配置,必须将集群中每个实例的instance_name
参数设置为一个唯一的值。
注册到监听器中的服务值从init.ora
文件中的参数service_names
取得。如果该参数没有设定值,数据库将拼接init.ora
文件中的db_name
和db_domain
的值来注册自己。如果选择提供service_names
值,可以使用完全限定的名称(如:orcl.oracle.com
)或缩写的名称(如:orcl
)。如果选择缩写的名称并设置了db_domain
参数,注册到监听器中的服务将是service_name
值和db_domain
值的拼接。
例如:下面的设置将导致服务orcl.oracle.com
被注册到监听器中:
db_domain=oracle.com
service_names=orcl
采取动态注册方法时,文件listener.ora
中的内容如下:
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
的内容如下:
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
alter system set local_listener = HISDB ;
动态注册非默认端口的步骤如下:
步骤一:修改listener.ora
文件
[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
文件
ORA_LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora)(PORT = 1530))
(CONNECT_DATA =
(SERVICE_NAME = hisdb)
)
)
步骤三:修改参数
alter system set local_listener = HISTDB;
步骤四:重启监听,查看监听状态
[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_DBNAME
与SID_NAME
参数。
注意:静态注册的监听status
永远为UNKNOWN
。
例如:
[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 文件的内容
该文件类似于 Linux
的 hosts
文件,提供 tnsname
到主机名或者ip
的对应。文件的内容如下:
[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 文件的默认内容如下:
[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
此时,如果在客户端输入如下内容:
[oracle@ora admin]$ sqlplus sys/oracle@hisdb as sysdba
则客户端会首先在tnsnames.ora
文件中找hisdb
的记录,如果没有相应的记录则尝试把 hisdb
当作一个主机名。