- 本篇图文深入介绍Oracle Network配置管理。
Oracle网络配置的目的
为了方便对Oracle 数据库进行管理,一般以下情况应该对Oracle进行网络配置。
• 在客户端对服务器端数据库进行管理(网络客户端管理)
• 在一台服务器上管理多个数据库(本地管理)
在客户端上管理,只需要安装客户端管理软件即可。客户端为了连接特定的服务器和数据库,需要对网络进行配置,通过网络可以连接到不同的Oracle 数据库服务器。如图所示,首先需要在数据库服务器端配置侦听程序,然后需要在客户端配置网络服务名。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/782d6513585c4c8c959f2f0b62eb7857.png
配置服务端侦听器(LISTENER)
网络配置可以使用网络配置管理器 Net Manager 来完成。Net Manager 用于网络连接服务名、侦听器等的创建和设置。在同一台服务器上可以配置多个侦听器,但侦听的端口号不能相同。不同的侦听器可以侦听对同一个数据库的请求,同一个侦听器也可以侦听对不同数据库的请求。这样当一个侦听器忙时,另外的侦听器仍然可以为客户端请求提供服务,减少用户连接的等待时间。侦听器的配置信息存入对应的配置文件listener.ora(注:使用Net Manager工具配置侦听器相当于修改该文件),该文件的默认路径为
O
R
A
C
L
E
H
O
M
E
/
n
e
t
w
o
r
k
/
a
d
m
i
n
,其中
ORACLE_HOME/network/admin,其 中
ORACLEHOME/network/admin,其中ORACLE_HOME代表服务器软件的安装目录。另外通过设置环境变量TNS_ADMIN可以改变侦听器配置文件的位置(.bash_profile文件中设置)。侦听器的设置主要包括侦听位置和对应的数据库服务,侦听位置包括主机、端口和使用的通讯协议,Oracle 默认的标准端口是1521,通常采用的协议是TCP/IP。
1.启动NetManager
[oracle@oracle ~]$ netmgr
2.弹出页面,可以增加和删除侦听器。
3. 点击“+”增加一个监听器,并且输入监听名称。
• 协议:用于指定监听程序要使用的网络协议,监听程序可以使用多种网络协议,但最常用的是“TCP/IP”协议。
• 主机:用于指定Oracle 服务器所在机器的主机名或IP 地址。因为侦听器和Oracle服务器位于同一台机器,主机名在这里也可以输入LOCALHOST。
• 端口号:用于指定监听程序所要使用的TCP/IP 端口号,默认监听端口号为1521。如果要指定其他端口号,则必须是操作系统未占用的端口。
例如:为了区别于LISTENER与LISTENER1,将LISTENER1 端口号改为1522。
注意:如果网络客户端想要通过LISTENER1 连接数据库,其用于连接数据库的网络服务名配置,也要使用同样的端口号。
• 全局数据库名:一般设置为DB_NAME.DB_DOMAIN(DB_NAME 和DB_DOMAIN为初始化参数),这里设为orcl。
• Oracle 主目录:应该设置为Oracle 软件的安装路径。
• SID:设置为数据库的 SID,这里设置为 orcl。
配置客户端网络服务名
通过客户端访问服务器端的数据库,就需要进行网络配置。客户端通过提供必要的参数,包括要连接的服务器名称、连接的端口号、使用的通讯协议等连接到服务器端。对于普通用户,这些参数不便于理解和记忆。通过网络配置,可以把网络服务名同配置联系起来,一旦配置完成,以后就可以使用该网络服务名进行数据库的连接,使连接过程得
到简化。当安装Oracle 数据库产品时,系统会自动在服务器端为数据库配置相应的网络服务名,默认网络服务名与实例标识(SID)相同。为了便于访问同一台服务器上的多个Oracle 数据库,应该为新数据库配置相应的网络服务名。网络服务名对应的配置文件名称为 tnsnames.ora,该文件的默认路径为$ORACLE_HOME/network/admin。同样,通过设置环境变量 TNS_ADMIN 可以改变该配置文件的位置。配置网络服务名也可以使用工具 Net Manager 来完成。
1. 填写客户端网络服务名
2. 选择协议
3. 填写主机名
4. 填写数据库的服务名(Service_names)
5. 点击“Finish”完成配置。
注册的意义
- 什么是注册:
注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。)相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。
2.关于注册的两个参数
- instance_name:
注册到监听器中的实例值从参数文件中的 instance_name 参数取得。如果该参数没有设定值,那么它将取参数文件中的 db_name 的值。如果在 RAC 中配置,您必须将集群中每个实例的 instance_name 参数设置为一个唯一的值。 - service_names:
注册到监听器中的服务值从参数文件中的参数 service_names 取得。如果该参数没有设定值,数据库将拼接参数文件中的 db_name 和 db_domain 的值来注册自己。
//修改参数 service_names
SQL> alter system set service_names='orcl,aaa';
System altered.
SQL> show parameter service_names;
NAME TYPE VALUE
---------------------------------- ------- ----------------
service_names string orcl,aaa
//查看监听状态
[oracle@oracle admin]$ lsnrctl stat
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.example.com)
(PORT=1521)))
STATUS of the LISTENER
------------------------
Listener Parameter File
/u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File
/u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle.example.com)(PORT
=1521)))
Services Summary...
Service "aaa" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl_XPT" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
//查看 listener.ora 内容
[oracle@oracle admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/n
etwork/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
1521))
)
//没有写 list,动态注册
//查看 tnsnames.ora 内容
[oracle@oracle admin]$ more tnsnames.ora
ORCL_S =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
AAA_S =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
1521))
)
(CONNECT_DATA =
(SERVICE_NAME = aaa)
)
)
//验证能否通过 orcl_s 成功登录
[oracle@oracle admin]$ sqlplus sys/oracle@orcl_s as sysdba
//验证能否通过 aaa_s 成功登录
[oracle@oracle admin]$ sqlplus sys/oracle@aaa_s as sysdba
/验证 oracle 注册 service_names 的值
SQL> alter system set service_names='bbb';
System altered.
//aaa_s 无法正常连接
[oracle@oracle admin]$ sqlplus sys/oracle@aaa_s as sysdba
//orcl_s 仍然可以正常连接(oracle 会自动注册)
//测试 service_names 参数的值
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- -----------
db_name string orcl
//当前 db_domain 的值为空
SQL> show parameter domain
NAME TYPE VALUE
------------------------------------ ----------- ------------
db_domain string
//当前 servcie_names 的值为非默认值
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ----------- -----------
db_name string bbb
//定义 db_domain 的值
SQL> alter system set db_domain='oracle.com' scope=spfile;
System altered.
//重置 service_names 的值
SQL> alter system reset service_names scope=spfile sid='*';
System altered.
//重启数据库
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 92276304 bytes
Database Buffers 188743680 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> show parameter domain
NAME TYPE VALUE
------------------------------------ ----------- ---------------
db_domain string oracle.com
SQL> show parameter service
//验证 service_names 的值为 db_name+db_domain
NAME TYPE VALUE
------------------------------------ ----------- --------------------
service_names string orcl.oracle.com
- 动态注册
动态注册是在 instance 启动的时候 PMON 进程根据参数文件中的 instance_name,service_names 两个参数将实例和服务动态注册到 listener 中。首先要在参数文件中指定 instance_name,service_names 两个参数的值。在 sqlplus 下通过 show parameter service_names 和 show parameter instance_name 可以查看这两个参数的值。可选择的是,您可以在 service_names 参数中指定多个服务值,值之间用逗号格开,这对于共享服务器配置是很有用的。动态注册默认只注册到默认的监听器上(名称是 LISTENER、端口是1521、协议是TCP),因为 pmon 只会动态注册 port 等于1521的监听,否则 pmon 不能动态注册 listener,如果需要向非默认监听注册,则需要配置 local_listener 参数!
- Pmon 进程注册(默认端口):
//为方便实验,将 db_domain 参数改回来
SQL> alter system set db_domain='' scope=spfile;
System altered.
//重启数据库使参数生效
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 92276304 bytes
Database Buffers 188743680 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
//验证参数
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ----------- --------------
service_names string orcl
//查看 listener.ora
[oracle@oracle admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/12.2.0/db_1/n
etwork/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT =
1521))
)
//查看监听器状态
[oracle@oracle admin]$ lsnrctl stat
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.example.com)(PORT=15
21)))
//查看 tnsnames.ora
[oracle@oracle admin]$ more tnsnames.ora
ORCL_S =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT
= 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
//尝试连接
[oracle@oracle admin]$ sqlplus sys/oracle@orcl_s as sysdba
- 修改参数注册(非默认端口):
演示过程省去。
- 静态注册
静态注册就是实例启动时读取 listener.ora 文件中实例和服务的配置,将实例和服务注
册到监听程序。
//示例:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = orcl)
)
(SID_DESC =
(GLOBAL_DBNAME = emrep)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = emrep)
)
)
List 列表中的即是需要静态注册的服务。
如何查询某服务是静态还是动态注册
可以使用命令 lsnrctl status 来查看某服务是静态注册还是动态注册。
• 实例状态为 UNKNOWN 值时表明此服务是静态注册的。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,才检查该实例是否存在。
• 实例状态为 READY 或 BLOCKED(数据库 nomount 时)表明是此服务是动态注册的。
完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB基本知识和排障案例及经验、性能调优等。