数据库网络(监听)
1. 理解监听器
[ 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 的形式对外提供客户端访问支持,监听器负责注册 service 。
2 、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
select instance_name from V$instance ;
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
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
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出现在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实例是由SGA和一组后台进程组成的,实例的创建和启动需要一个参数文件,而参数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名称是init< ORACLE_SID> .ora,对于spfile文件,缺省的文件名称是spfile< ORACLE_SID> .ora
设置不同的ORACLE_SID值,就可以默认使用不同的参数文件启动不同的数据库实例。另外,ORACLE_SID的作用远远不是作为一个实例入口这么简单的,在实例启动后,实例名称INSTANCE_NAME也是从ORACLE_SID得到的。
实例名称,这是Oracle实例的名字,用来区分不通的实例。在Oracle9i之前,该名字存储在两个地方:参数文件和数据库的内部试图(V$INSTANCE ),而在Oracle10g之后的版本中,该名字不再出现在参数文件中,而是动态从系统中获得,默认是取自ORACLE_SID。INSTANCE_NAME的作用除了区别不同实例之外,在监听器动态注册时,还会用于向监听器注册。比如instance_name= zlm,监听中将动态注册Instance "zlm" ,status READY信息。
select instance_name from V$instance ;
SQL> show parameter instance_name
3. 涉及配置文件
1. tnsnames.ora
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
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
动态注册默认只注册到默认的监听器上(名称为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
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. 配置连接串
提供tnsname到主机名或者ip的对应( 也是客户端监听器配置文件)
orclstatic =
( DESCRIPTION =
( ADDRESS = ( PROTOCOL = TCP) ( HOST = 127.0 .0.1) ( PORT = 1521 ))
( CONNECT_DATA =
( SERVER = DEDICATED)
( SERVICE_NAME = orcl)
)
7. 配置DBLINK
创建dblink是在客户端创建,基于客户端tnsnames.ora建立的监听配置创建服务端数据库的dblink
SQL> grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to test ;
Grant succeeded.
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 )