Oracle数据库网络详解

数据库网络(监听)

1. 理解监听器

# 启动和关闭监听(oracle用户下执行)
[oracle@kevin ~]$ lsnrctl start
[oracle@kevin ~]$ lsnrctl stop

# 几种连接数据库用到的命令形式:
1)sqlplus "/ as sysdba" 这是典型的操作系统认证,不需要listener进程,数据库即使不可用也可以登录。
2)sqlplus username/password 不需要listener进程,登录本机数据库,数据库实例启动即可。
3)sqlplus username/password@tnsname需要listener进程,最常见的远程登录模式,需要启动数据库实例和listener进程。


1、实例以 service 的形式对外提供客户端访问支持,监听器负责注册 service2、Service_name 对外屏蔽了实例和数据库的复杂描述。 

3、客户端 tnsnames.ora 中 SERVICE_NAME 与服务器端 listener.ora 的静态监听中 GLOBAL_DBNAME 等同。

4、listener.ora 中监听器的 SID_NAME 与实例的 SID 等同,对应 instance_name。

5、一个 linstener.ora  可以描述多个监听器。 

6、一个 tnsnames.ora  可以描述多个网络连接符。  

7、一个 listener.ora 可以为多个数据库描述监听器。  

8、一个实例可以对应多个 service_name。

2. 对应关系

1. 相关命令

# 启动图形化界面
netca
netmgr
# 注意
配置监听时,tns的service_name 与 listener的global_name对应,服务端的tnsnames.ora也要配置

# 查看监听配置文件
vim $ORACLE_HOME/network/admin/listener.ora

# 查看sid
select instance_name from V$instance;

# 查看service_names和instance_name
SQL> show parameter instance_name
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
instance_name			     string	 orcl

SQL> show parameter service_names
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
service_names			     string	 orcl.example.com

2. 客户端连接Oracle服务器流程

在这里插入图片描述

1. 客户端使用sqlplus system/oracle@ORCL

# tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.202.132)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
根据tnsnames.ora的配置,这里ORCL就是orcl这个SERVICE_NAME所对应的NET SERVICE NAME,只有用sqlplus system/oracle@ORCL才行,NET SERVICE NAME可以随意设置,但是当源数据库GLOBAL_NAME=TRUE时,link_name必须与远程数据库的全局数据库名global_name相同;否则,可以任意命名

2. NET SERVICE NAME(ORCL)映射到Oracle服务器监听文件listener.ora

# listerner.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
      (SID_NAME = orcl)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl2)
      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
      (SID_NAME = orcl)
    )     
         
  )       
         
LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.202.132)(PORT = 1521))
  )   

ADR_BASE_LISTENER = /u01/app/oracle

tnsnames.ora与listerner.ora的连接(对应)基于参数SERVICE_NAME,通常情况下,我们会设置SERVICE_NAME和INSTANCE_NAME(SID)一致。这里还要注意的是,SERVICE_NAME虽然可以脱离INSTANCE_NAME搞别名,但是必须对应listener.ora里配置的GLOBAL_DBNAME,否则就算配好了静态监听,也是注册不了服务的。

# SERVICE_NAME和GLOBAL_DBNAME:
这两个参数之所以放在一起讲,是因为他们往往是成对出现的。SERVICE_NAME出现在tn snames.ora文件中,是客户端要请求的服务名。GLOBAL_DBNAME出现在listener.ora文件中,是服务器提供的服务名。

# 查看
show paramerer service_names
# 修改
alter systemset service_name='servicename' scope=both

二者对应,实现了listerner.ora/tnsnames.ora的重要功能——监听、请求与验证。


4. listener.ora 基于SID_NAME指定连接实例,就是数据库实例名,在Linux环境大小写敏感
SID_NAME 就是SID和INSTANCE_NAME

# ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)

以环境变量的形式出现的。Oracle实例是由SGA和一组后台进程组成的,实例的创建和启动需要一个参数文件,而参数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名称是init<ORACLE_SID>.ora,对于spfile文件,缺省的文件名称是spfile<ORACLE_SID>.ora

设置不同的ORACLE_SID值,就可以默认使用不同的参数文件启动不同的数据库实例。另外,ORACLE_SID的作用远远不是作为一个实例入口这么简单的,在实例启动后,实例名称INSTANCE_NAME也是从ORACLE_SID得到的。

# INSTANCE_NAME:

实例名称,这是Oracle实例的名字,用来区分不通的实例。在Oracle9i之前,该名字存储在两个地方:参数文件和数据库的内部试图(V$INSTANCE),而在Oracle10g之后的版本中,该名字不再出现在参数文件中,而是动态从系统中获得,默认是取自ORACLE_SID。INSTANCE_NAME的作用除了区别不同实例之外,在监听器动态注册时,还会用于向监听器注册。比如instance_name=zlm,监听中将动态注册Instance "zlm",status READY信息。

# 查看以上两个参数
# 查看sid
select instance_name from V$instance;
# 查看instance_name
SQL> show parameter instance_name

3. 涉及配置文件

1. tnsnames.ora

# 用在oracle client端,用户配置连接数据库的别名参数,就像系统中的hosts文件一样。提供了客户端连接某个数据库的详细信息,主机地址,端口,数据库实例名等。

# 示例:
ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.147)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
PROTOCOL参数一般是TCP,可以根据服务器情况选择一种配置方式。
HOST 一般是ip地址,如果是主机名,则应该在客户端系统的host文件上配好主机名和ip地址的映射关系。

PORT 标准是1521,根据服务器端的监听端口而定。

2. listener.ora

tnslsnr进程是监听、并接受远程连接数据库请求的监听进程。listener.ora是tnslsnr进程的配置文件,监听的参数都是从该配置文件中读取,该文件位于服务端。如果你只需要在本地连接数据库,不接受远程连接,那么也不需要启动tnslsnr进程,也不需要去维护listener.ora文件。
启动监听进程的命令,在命令模式下,执行lsnrctl start命令就启动了监听进程tnslsnr。

# 示例:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /oracle/product/10.2.0/db_1)
      (SID_NAME = orcl)
    )
    (SID_DESC =
      (ORACLE_HOME = /oracle/product/10.2.0/db_1/)
      (SID_NAME = eas)
    )
  )


LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.147)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

LISTENER部分包含协议地址列表,每个实例一个入口。

SID_LIST_LISTENER部分标识全局数据库名称、标识监听程序正在服务的每个实例的Oracle软件主目录以及实例或SID。

当你执行命令sqlplus username/password@tnsname时,一般处理过程如下:
1) 查询sqlnet.ora看看名称的解析方式,由参数NAMES.DIRECTORY_PATH控制,常用参数值TNSNAME和hostname,不指定参数则默认使用TNSNAME。
2) 如果使用TNSNAME,则查询tnsnames.ora文件,从里边找tnsname的记录,并且找到主机名,端口和service_name。
3) 如果listener进程没有问题的话,建立与listener进程的连接。
4) 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。
5) 这时候网络连接已经建立,listener进程的历史使命也就完成了。

4. 动态注册

动态注册是在实例启动的时候,或使用命令Alter system register,或每隔一分钟,PMON进程会向监听进行动态注册,PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中。
如果init.ora中的instance_name,service_names两个参数没有指定值,那么系统将取默认值,注册到监听器中的实例名将取init.ora文件中的db_name值,服务名将取init.ora文件中的db_name+db_domain值。可以在service_names参数中指定多个服务值,值之间用逗号隔开,这对于共享服务器配置很有用。

# 前提
动态注册是默认启动的,要想立马刷新动态注册内容,可以使用Alter system register


# 查看动态注册
# 采用动态注册时,不需要有listener.ora,需要先配置一下local_listener才可以使用

1. 首先将listener.ora文件重命名。

[oracle@strong admin]$ mv listener.ora listener.ora.bak
[oracle@strong admin]$ ls
listener.ora.bak  samples  shrept.lst  tnsnames.ora


2. 启动监听器,并查看其状态。

[oracle@strong ~]$ lsnrctl start
 
[oracle@strong ~]$ lsnrctl status

Services Summary...
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...
The command completed successfully

# 说明:Instance状态为READY,说明采用动态注册监听器。


# 配置非默认端口动态注册
动态注册默认只注册到默认的监听器上(名称为LISTENER,端口为1521,协议为TCP),因为PMON只会动态注册端口为1521的监听,否则不能动态注册,如果使用非默认端口注册,则需要配置local_listener参数。


1. 配置listener.ora参数,新增LISTENER2,监听端口为1522

LISTENER2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = c12.example.com)(PORT = 1522))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
    )
  )


2. 修改local_listener参数,配置监听地址
SQL> alter system set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.202.132)(PORT=1522))','(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.202.132)(PORT=1521))';

或:

(1) 在Oracle服务器端建立$ORACLE_HOME/network/admin/tnsnames.ora解析文件,并填入如下内容

test =
(DESCRIPTION =
    (ADDRESS_LIST =
        (ADDRESS=(PROTOCOL=TCP)(HOST = 192.168.202.132)(PORT = 1525))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
)

(2) 设置参数,指定通过tnsnames.ora内的信息指定监听参数
SQL>alter system set local_listener=test;

(3) 连接
sqlplus test/test@test # @test为配置的tns名称

# 接上
SQL> alter system register;
 
SQL> show parameter local_listener

5. 静态注册

静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务名注册到监听器中。静态注册时,listener.ora中的GLOBAL_DBNAME提供服务名,listener.ora中的SID_NAME提供注册的实例名。

# 配置静态注册监听

1. listener.ora文件中配置静态注册
添加
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME =orcl)
(ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
(SID_NAME =orcl)
)
(SID_DESC =
(GLOBAL_DBNAME =orcl1)
(ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
(SID_NAME =orcl)
)
)
# 解释
listener.ora文件两大模块:

LISTENER模块:监听名字、连接协议、监听主机、监听端口等基本配置信息

SID_LIST_LISTENER模块:配置监听的静态注册特性,包含数据库服务名、ORACLE_HOME、实例名等信息。

注意:SID_NAME,就是数据库实例名,在Linux环境大小写敏感

GLOBAL_DBNAME就是数据库服务名,可以省略,默认和SID_NAME保持一致,也可以不一致。

ORACLE_HOME,默认和$ORACLE_HOME环境变量保持一致。Windows,该参数无效,取自注册表。
该文件表明数据库是单实例的,实例名为orcl,向外提供了两个服务:orcl和orcl1

2.重启监听
lsnrctl stop
lsnrctl start

6. 配置连接串

# 修改tnsnames.ora文件
提供tnsname到主机名或者ip的对应(也是客户端监听器配置文件)

orclstatic =
 (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))   #对应的SOCKET信息
      (CONNECT_DATA =                  
           (SERVER = DEDICATED)            #使用专用服务器模式去连接(server=shared共享模式)
            (SERVICE_NAME = orcl)           #这里填入对应 service_name,
                                           
  )   

7. 配置DBLINK

创建dblink是在客户端创建,基于客户端tnsnames.ora建立的监听配置创建服务端数据库的dblink
# 授权
SQL> grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to test;

Grant succeeded.

# 基于tnsnames.ora建立的监听创建连接
SQL> create public database link test_link connect to test identified by test123 using 'ORCL2';

Database link created.

# 或者直接创建
create database link link_name
connect to username identified by password
using ' (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.13.178)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = rzzqnew)
    )
  )';

# 查看是否创建成功
SQL> select * from dual@test_link;

D
-
X

# 使用
SQL> desc p_test@test_link;
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID						    NUMBER(7)
 TYPE						    VARCHAR2(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值