动态监听和静态监听、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);