本节将要讲到的知识点如下:
一、监听配置
二、服务名注册方式
三、客户端本地名称解析
四、专有模式和共享模式
五、DBLink
监听配置
问题:要求服务器有3个监听?
已有一个默认listener,端口1521,还需配置两个。
处理这个问题的两种方式:
1. 使用图形界面做
$netca
Step 1 of 6 选择Listener configuration
Step 2 of 6 选ADD添加
Step 3 of 6 设置监听名
Step 4 of 6 选择协议TCP
Step 5 of 6 设置端口号
Step 6 of 6 next直到完成
2. 使用grid用户修改listener.ora文件
文件位置:$ORACLE_HOME/network/admin/listener.ora
加入如下内容:
LSNR2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracleEDU)(PORT = 1531))
)
LSNR3 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracleEDU)(PORT = 1541))
)
:wq 保存修改。
$ lsnrctl start lsnr2
$ lsnrctl start lsnr3
查看监听是否启用:
[grid@oracleEDU admin]$ ps -elf |grep tns |grep -v grep
0 S grid 8680 1 0 75 0 - 19335 502738 22:11 ? 00:00:00 u01/app/grid/product/11.2.0/grid/bin/tnslsnr LISTENER -inherit
0 S grid 27562 1 0 79 0 - 19284 - 23:40 ? 00:00:00 u01/app/grid/product/11.2.0/grid/bin/tnslsnr lsnr2 -inherit
0 S grid 27579 1 0 78 0 - 19285 - 23:40 ? 00:00:00 u01/app/grid/product/11.2.0/grid/bin/tnslsnr lsnr3 -inherit
查看监听开启了哪些端口:
[grid@oracleEDU admin]$ netstat -tunlp |grep tns |grep -v grep
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:1541 0.0.0.0:* LISTEN 27579/tnslsnr
tcp 0 0 0.0.0.0:1521 0.0.0.0:* LISTEN 8680/tnslsnr
tcp 0 0 0.0.0.0:1531 0.0.0.0:* LISTEN 27562/tnslsnr
服务名注册方式
1. 动态注册(默认)
实例启动时,会由Oracle PMON进程将数据库实例信息动态注册到监听上,当实例关闭时,会由Oracle PMON自动从监听里面撤销当前实例信息。所以要实现动态注册,数据库至少要是在nomount状态。
监听动态注册的实例状态有三种:
i. READY 数据库处于mount或者open,可以接受客户端连接
ii. BLOCKED 数据库处于nomount状态或实例类型是ASM,不接受客户端连接
iii. RESTRICED 不接受普通权限的远程客户连接
2. 静态注册(直接把监听写入配置文件listene.ora)
没有延迟,但不一定能够连接,状态为UNKNOWN
例
将orcl数据库全部静态注册到listener lsnr2 lsnr3
grid用户修改listener.ora文件
全局数据库名 :orcl.example.com
数据库的home:/u01/app/oracle/product/11.2.0/dbhome_1
实例名:orcl
修改内容如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl.example.com)
(ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
SID_LIST_lsnr2 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl.example.com)
(ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
SID_LIST_lsnr3 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl.example.com)
(ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
:wq 保存。
使配置生效:
$ lsnrctl reload
$ lsnrctl reload lsnr2
$ lsnrctl reload lsnr3
查看监听状态:
$ lsnrctl status
Service "orcl.example.com" has 2 instance(s).
Instance "orcl", status UNKNOWN 静态注册, has 1 handler(s) for this service...
Instance "orcl", status READY动态注册, has 1 handler(s) for this service...
lsnrctl status lsnr2
Service "orcl.example.com" has 1 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
lsnrctl status lsnr3
Service "orcl.example.com" has 1 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Tips:实例同时可以静态注册和动态注册,状态分别显示为UNKNOWN 和 READY。
要求动态注册到 lsnr2
修改参数实现:(value为空就是用默认值(1521侦听))
SQL> show parameter local
NAME TYPE VALUE
------------------------------------ ----------- ---------------------------
local_listener string
修改local_listener参数
SQL>alter system set local_listener =' (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracleEDU)(PORT=1531)))' scope=both;
检查
$ lsnrctl status lsn2
Service "orcl.example.com" has 2 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Instance "orcl", status READY动态注册, has 1 handler(s) for this service...
$ lsnrctl status
Service "orcl.example.com" has 1 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
只有静态注册了。
客户端本地名称解析
名称解析:
Easy Connect 简易连接
不需要做任何配置(不支持SSH,不支持高级属性),语法:connect 账户名/密码@主机名或者ip地址:监听的端口/服务名
例如:CONNECT scott/tiger@db.us.oracle.com:1521/orcl
Local Naming 本地名称解析
通过配置名称解析文件tnsnames.ora(支持SSH,支持高级属性:连接时故障转移,负载均衡,源路由)
使用Oracle用户配置安装目录下network/admin目录下tnsnames.ora文件
语法:sqlplus 账户名/密码@服务别名
或者使用图形界面配置,命令:netmgr
增加一个TEST的服务名
$ su - oracle
$ cd $ORACLE_HOME/network/admin
$ vi tnsnames.ora (增加如下内容)
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.example.com)
)
)
:wq 保存。
检查:tnsping 服务名
检查语法是否正确,不保证通过服务别名一定能够连接数据库
$ tnsping test
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl.example.com)))
OK (40 msec)
现在就可以通过TEST去连接数据库:
$ sqlplus scott/oracle@test
扩展
如果服务器配置了多个监听,则客户端可以配置高级属性:
1.连接时故障转移(当用户连接时判断监听是否可用,不可用就搜索下一个监听)
例
建立一个监听t_orcl,可以向3个监听连接
使用Oracle用户修改配置文件tnsnames.ora或者使用图形界面添加 netmgr
添加如下内容:
T_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1531))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1541))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.example.com)
)
)
如果你的服务别名中有多个监听,则默认开启连接时故障转移
实际省略了关键字 (FAILOVER = on)
检查语法:tnsping t_orcl
测试连接
sqlplus scott/oracle@t_orcl
关闭任何监听,只要有一个是好的 就可以成功!
2.负载均衡
例
建立服务名f_orcl
F_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1531))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1541))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.example.com)
)
)
检查语法:tnsping f_orcl
测试连接
sqlplus scott/oracle@f_orcl
专有模式和共享模式
专有模式: Dedicated Server
每个用户进程独享一服务器进程。
共享服务器模式:Shared Server
数据启动的时候预先启动几个服务进程(共享服务进程) ,还有启动调度进程 ,用户把请求给监听,监听判断如果是共享模式则把用户请求转给调度进程,调度放入一个队列,共享服务进程从队列取任务,处理完毕后,把结果在放入一个结果队列,然后由调度进程吧结果给用户进程,如果服务进程处理完毕,继续在队列里找任务执行。
怎么查看当前数据库是专有还是共享模式?
如果存在共享服务进程或者存储调度进程 --> 共享模式
如果没有 --> 专有模式
共享模式下,建立专有连接,也可以建立共享连接(不产生新的服务进程,交给调度进程).
专有模式下,不能建立共享连接,只能建立专有连接。
判断:(shared_servers 非0就是共享模式)
SQL> show parameter SHARED_SERVERS
NAME TYPE VALUE
-------------------------------- ----------- ------------------------------
max_shared_servers integer
shared_servers integer 1
SQL> show parameter disp
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cell_offload_plan_display string AUTO
dispatchers string (PROTOCOL=TCP) (SERVICE=orclXD
B)
怎么配置共享模式?
参数:
SHARED_SERVERS:表示数据库启动的时候最小保持的共享服务进程数
MAX_SHARED_SERVERS:同时允许最多的共享服务进程数
DISPATCHERS:调度进程
MAX_DISPATCHERS:最大调度进程
MAX_SHARED_SERVERS:指定允许同时存在的最多的共享服务进程
设置共享模式,只需要设置4个参数:
例
要求shared server最多5个,开启3个
$ alter system set SHARED_SERVERS=3 scope=both;
$ alter system set MAX_SHARED_SERVERS=5;
[oracle@oracleEDU admin]$ ps -elf |grep ora_ |grep orcl |grep s0
0 S oracle 6404 1 0 78 0 - 185439 ? 01:37 ? 00:00:00 ora_s000_orcl
0 S oracle 9002 1 0 78 0 - 185439 ? 01:59 ? 00:00:00 ora_s001_orcl
0 S oracle 9010 1 0 78 0 - 185439 ? 01:59 ? 00:00:00 ora_s002_orcl
允许tcp/ip的调度进程3 最多5个
alter system set DISPATCHERS='(PROT=tcp)(DISP=3)';
alter system set MAX_DISPATCHERS=5;
我的数据库是共享模式:
SQL> show parameter shared_servers
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer 5
shared_servers integer 3
SQL>
此时,在客户端,你可以建立专有连接,也可建立共享连接。
Tips:共享连接必须只能对动态注册的监听,静态注册监听不可以。
建立专有连接:
D_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.example.com)
)
)
测试:服务器进程数
[oracle@oracleEDU ~]$ ps -ef|grep oracleorcl |wc -l
11
$ sqlplus scott/oracle@d_orcl
SQL> !ps -ef|grep oracleorcl|wc -l
12
系统产生一个新的服务进程。
建立共享连接:
S_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = orcl.example.com)
)
)
测试:
$ tnsping s_orcl
是ok ,路径没有问题。
[oracle@oracleEDU ~]$ sqlplus scott/oracle@s_orcl
SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 11 21:44:20 2017
Copyright (c) 1982, 2009, Oracle. All rights reserved.
ERROR:
ORA-12523: TNS:listener could not find instance appropriate for the client
connection
原因是s_orcl是共享连接,必须通过动态注册的侦听连接
我的环境里面1531是动态注册 所以修改s_orcl指定1531
S_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1531))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = orcl.example.com)
)
)
再测试:
$ ps -elf |grep oracleorcl |wc -l
11
$ sqlplus scott/oracle@s_orcl
SQL> !ps -elf |grep oracleorcl |wc -l
11
服务进程数没有变化
现在有中间件,一般不配置共享式 ,中间件和数据用专有连接。
把数据库从共享模式设置成专有模式
SQL> alter system set shared_servers=0 scope=both;
System altered.
SQL> alter system set max_shared_servers=0;
System altered.
SQL> alter system set dispatchers='';
System altered.
SQL> alter system set max_dispatchers=0;
System altered.
sqlplus scott/oracle@s_orcl
ERROR:
ORA-12520: TNS:listener could not find available handler for requested type of
server
专有模式,没有调度进程。
一个数据库最多建立的会话数
SQL> show parameter sessions
NAME TYPE VALUE
------------------------------------ ----------- -----------------------------
sessions integer 247
DBLink
使用 create database link 语句创建一个数据库连接,可以在一个数据库中访问另外一个数据库的对象。
语法:
CREATE DATABASE LINK <remote_global_name>
CONNECT TO <user> IDENTIFIED BY <pwd>
USING '<connect_string_for_remote_db>';
用dbca新建建另一个测试数据库
SID:ocp
字符:zhs16gbk
内存:512M
[oracle@oracleEDU ~]$ ps -elf |grep smon |grep ocp
0 S oracle 13488 1 0 75 0 - 187402 ? 02:32 ? 00:00:00 ora_smon_ocp
在orcl数据库上建一个表:
SQL> create table test as select * from emp;
要求在ocp数据库上访问orcl库上的这个表test:
操作步骤:
1.在ocp数据服务器上建立服务别名,可以连接orcl数据库
export ORACLE_SID=ocp
TO_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.example.com)
)
)
测试; sqlplus scott/oracle@to_orcl
2.建立去连orcl的dblink
$ export ORACLE_SID=ocp
$ sqlplus as sysdba
SQL> CREATE DATABASE LINK torcl
CONNECT TO scott IDENTIFIED BY oracle
USING 'to_orcl';
3.使用方式:对象名@dblink的名字
SQL> select count(*) from test@torcl;
COUNT(*)
----------
14
SQL> update test@torcl set sal=0;
SQL> commit;
实际操作的是orcl数据库的scott.test表。
反过来,如果orcl想去访问ocp数据库
1.登录orcl数据库服务器配置一个服务别名去连接ocp
export ORACLE_SID=orcl
TO_OCP =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ocp)
)
)
2.登录orcl数据库建立一个dblink
$ export ORACLE_SID=orcl
$ sqlplus as sysdba
SQL> CREATE public DATABASE LINK tocp
CONNECT TO scott IDENTIFIED BY oracle
USING 'to_ocp';
3.用dblink就可以访问ocp库的数据 SQL> select * from emp@tocp;
SQL> create view v1 as seelct * from emp@tocp;
查看DB link
SQL> select owner,object_name from dba_objects where object_type = 'DATABASE LINK';
OWNER OBJECT_NAME
-------------------- ------------------------------
SYS TORCL
或者:
SQL> select * from dba_db_links;
删除DB Link
SQL> drop database link torcl;
Database link dropped.
本篇的内容有点多,没有很详细的讲解,主要是例子操作,更多内容请看文末推荐的文档。
参考文档:
Net Services Reference 7 Oracle Net Listener Parameters
Net Services Administrator's Guide
Administrator's Guide 5 Managing Processes