动态监听和静态监听、netca和netmgr创建监听,easy connect naming和local naming和directory naming连接方式、连接模式

监听程序和协议、主机名、端口相关(在listener.ora里);监听服务和协议、主机名、端口、服务名相关(在tnsnames.ora里,静态监听服务在listener.ora里且和global_dbname/oracle_home/sid_name相关);

监听和实例的对应关系是多对多,多个监听对应一个实例,一个实例可对应不同名不同端口的监听,但某一刻只能用一个端口;一个监听可以对应多个实例,即多个实例可以注册到一个监听上。连接建立后与监听的起停与否无关,建立监听之后通道就建立了,之后即使监听关闭了也还可以进行会话。

一、静态监听和动态监听

lsnrctl status;  //查看监听状态,status READY的是动态注册,status UNKNOWN的是静态注册,因为监听程序不知道数据库有没有准备好号

1、静态监听(优点是允许为特定PDB创建监听;当实例关闭时可远程重启,动态监听这时会报错)

静态注册就是实例启动时读取listener.ora文件(配置显式写进listener.ora),将实例和服务注册到监听程序。配置静态监听的好处就是即使数据库实例关闭了,远程客户端还可以通过静态监听连接一个空实例然后启动实例,而不用到服务器端来启动,动态监听在实例关闭后就连不到空实例了。监听程序无法判断监听文件中的服务是否存在。显示服务状态为UNKNOWN。

静态监听的配置模板在/u01/app/oracle/product/19.0.0/dbhome_1/network/admin/samples/listener.ora里

配置/u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora文件,global_dbname向外提供服务名,sid_name提供注册的实例名。

(1)单实例配置

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

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cmm)
      (ORACLE_HOME =/u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = sqldb)
      (ENVS="TNS_ADMIN=/u01/app/oracle/product/19.0.0/dbhome_1/network/admin")
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

status UNKNOWN表示是静态监听

sqlplus / as sysdba;  //在137上测试sqldb实例关闭时远程启动数据库
shutdown immediate;
//在另一台服务器172.25.100.2 连接172.25.100.137的sqldb实例,远程登录需要有密码文件,否则登录不上,知道IP、端口、服务名,协议默认是tcp
sqlplus sys/oracle@172.25.100.137:1521/cmm as sysdba
startup;

(2)多实例配置(配置一个SID_LIST,多个实例通过多个SID_DESC来设置,如果设置多个SID_LIST会出现syntax error in NV string错误

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

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cmm1)
      (ORACLE_HOME =/u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = sqldb)
      (ENVS="TNS_ADMIN=/u01/app/oracle/product/19.0.0/dbhome_1/network/admin")
    )
   (SID_DESC =
      (GLOBAL_DBNAME = cmm2)
      (ORACLE_HOME =/u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = chenmu)
      (ENVS="TNS_ADMIN=/u01/app/oracle/product/19.0.0/dbhome_1/network/admin")
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

(3)多端口配置

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
       (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = chenmu)(PORT = 1521))
          (ADDRESS = (PROTOCOL = TCP)(HOST = chenmu)(PORT = 1529))
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
       )
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cmm1)
      (ORACLE_HOME =/u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = sqldb)
      (ENVS="TNS_ADMIN=/u01/app/oracle/product/19.0.0/dbhome_1/network/admin")
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

2、动态监听(优点是可实现连接时的故障转移、负载均衡;RAC、DG环境下的高可用功能)

动态注册就是在instance启动的时候pmon进程(12c以后是LREG进程,处于mount状态或者每隔60s进程会自动注册监听信息)根据参数文件中的instance_name,service_name、实例当前和最大负载、dispatchers等几个参数将实例和服务动态注册到listener中,local_listener是哪一个就注册到哪一个监听上,默认是listener 1521 tcp,只能注册到一个监听上。监听关闭重启后,动态监听注册要等60s之后才会注册上,可以手动进行注册,就是在当前实例输入 alter system register命令,之后可以看到服务chenmu、和静态监听(静态监听不需要等待,重启之后立即开启)已经注册上。

一分钟后其他服务才注册上。

show parameter local_listener;  //输出为空表示默认服务注册到1521
alter system set  local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=chenmu)(PORT=1529))';  //修改服务注册到1529上

status READY表明是动态监听

sqlplus / as sysdba;  //在137上测试sqldb实例关闭时远程启动数据库
shutdown immediate;
//在另一台服务器172.25.100.2 连接172.25.100.137的sqldb实例
sqlplus sys/oracle@172.25.100.137:1529/sqldb as sysdba

(1)配置$ORACLE_HOME/network/admin/listener.ora文件

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
       (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = chenmu)(PORT = 1521))
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
       )
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

(2)配置local_listener参数

alter system set  local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=chenmu)(PORT=1521))'; 

(3)配置$ORACLE_HOME/network/admin/tnsnames.ora文件和local_listener

步骤一、在tnsname.ora中配置监听信息

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

步骤二、设置本地监听参数

alter system set local_listener='listener';

 

二、netca和netmgr创建监听

1、netca创建监听服务

netca无法配置静态监听,Listener configuration是监听配置程序(配置端口,修改的是listener.ora);Naming Methods configuration是命名方法配置(修改的是sqlnet.ora);Local Net Service Name configuration是本地服务配置(修改的是tnsnames.ora);Directory Usage configuration是目录使用配置

 使用参考连接:https://blog.csdn.net/hezuijiudexiaobai/article/details/109321111

2、netmgr创建监听

netmgr可以配置静态监听(静态监听也可在listener.ora手动配置),Profile修改的是sqlnet.ora文件;Service Naming修改的是tnsnames.ora;Listeners修改的是listener.ora文件。

(1)Service Naming

添加一个监听服务

输入Net Service Name

选择协议TCP/IP

输入主机名chenmu(在/etc/hosts里配置),端口号选择1529(查看oracle服务的端口号可以通过sql命令show parameter local_listener查看)

输入服务名sqldb(这里的oracle服务名可以通过sql命令show parameter service_name查看)

测试,因为没有tiger用户测试未成功,改变登录用户,输入system/oracle进行测试。

可以点击右边的测试来测试监听服务

 

三、连接方式

1、Easy Connect Naming Method(简易连接命名方式,直接在连接的时候加上ip、端口、服务名,默认协议是tcp),优点是简单易用,仅支持tcp/ip,不支持故障转移,不支持负载均衡,不支持源路由(source routing)

sqlplus sys/oracle@172.25.100.137:1529/sqldb as sysdba;  //在100.2上远程登录100.137,加上ip、port、service_name

注:如果简易连接出现TNS:could not resolve the connect identifier specified,要注意查看主机IP,端口号和服务名

sqlplus sys/oracle@172.25.100.137:1521/chenmu as sysdba;  //连接chenmu这个服务时出现错误

lsnrctl status;  //系统界面查看监听器的状态,查看端口1521
show parameter service;  //sql命令界面查看服务名,都没问题
sqlplus sys/oracle@chenmu as sysdba;  //通过TNSNAME方式也可以连接

 

 

 

 网上搜索之后发现是sqlnet.ora的问题,sqlnet.ora用于控制客户端访问数据库服务器;SQLNET.AUTHENTICATION_SERVICES=(NTS),指定启动一个或多个认证服务,NTS是允许本地操作系统用户认证;ALL是允许所有登录方式;NONE是不允许通过OS用户登录数据库,需要提供用户名和密码。NAMES.DIRECTORY_PATH=(TNSNAMES,EZCONNECT),指定client name解析方法的次序,在连接数据库时先到tnsnames.ora文件中找对应的db_alias,找不到之后按EZCONNECT配置找。

 

 这里看到只有LDAP和TNSNAMES方法,没有简易连接方法,所以加上简易连接就可以连上了。

2、local naming(本地命名方式,就是在客户端的tnsnames.ora配置相关信息,在连接的时候加上net service name即可,这个文件路径可以修改),优点是支持其他协议,故障转移,负载均衡,source routing

tnanames.ora信息如下

sqlplus sys/oracle@SQLDBTEST as sysdba;  //SQLDBTEST是net service name,sqldb是服务名

3、Directory Naming(LDAP Lightweight Directory Protocol)

 

四、连接模式

系统有user_process、server_process、background_process三种进程

1、DEDICATED(专用模式)

用一个服务器进程响应一个用户进程,优点是能够快速与客户端建立连接,无需等待;缺点是消耗服务器资源较多

tnsnames.ora的配置信息

CHENMU =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = chenmu)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = chenmu)
    )
  )

即server = DEDICATED

select sid,server from v$session where sid=(select distinct sid from v$mystat);  //查看v$session视图查看连接模式,v$mystat查看当前会话的sid

2、SHARED(共享模式)

一个分派器dispatcher响应一个客户端请求,分派器分配服务器进程响应客户端请求。优点是大大减少资源消耗,适用于高并发场景;缺点是可能拿不到连接导致客户端访问失败,比专用模式要慢

alter system set shared_server_sessions =10;  //最大同时处理的会话数,允许为专用模式预留会话
alter system set shared_servers=3;  //实例启动时创建的共享进程数,是最少要保留的进程数,一半情况下每10个连接对应一个shared server
alter system set max_shared_servers=10;  //可以同时运行的最大共享进程数
alter system set dispatchers='(PROTOCOL=TCP)(DISPATCHERS=3)'; //设置调度进程
alter system set max_dispatchers=5;  //最大调度进程数,可由dispatchers参数的设置所覆盖

tnsnames.ora的配置信息

CHENMU =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = chenmu)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = SHARED)
      (SERVICE_NAME = chenmu)
    )
  )

通过tnsnames.ora连接出现ORA-12520: TNS:listener could not find available handler for requested type of 错误,本地登录数据库确认shared_servers参数(确保其大于0)和dispatcher参数,发现其监听的服务名是chenmuxdb,搞成chenmu之后连接就成功了。

show parameter shared_servers;
show parameter dispatchers;
//修改dispatchers
alter system set dispatchers='(PROTOCOL=TCP)(SERVICE=CHENMU)'; 
exit;
sqlplus sys/oracle@chenmu as sysdba;

select sid,server from v$session where sid=(select distinct sid from v$mystat);

posted @ 2022-09-06 17:35  微风徐徐$  阅读(911)  评论(0编辑  收藏  举报