oracle网络原理及配置教程
一)监听的体系结构
先看oralce网络的一个拓扑结构
首先来讲
oracle数据库已经启动了
oracle的网络是什么结构呢
oralce整个数据库启动起来以后是这种状况
内存有SGA、PGA
磁盘中还有就是几个文件
日志文件、dbf、控制文件、归档日志文件
然后用户连接
oralce数据库启动后除了这些东西以外
还有一个叫监听的一个独立的模块
记住是独立的模块
这个模块需要独立启动
从某种意义上来讲
这个模块和oracle数据库之间没有太多的关系
可以先启监听再启动数据库或者先启数据库再启监听
都可以
双方之间没有直接的关系
数据库崩了监听可以存在
监听完蛋了数据库可以存在
它们之间没什么内在的联系
当然有一些联系后面会讲
用户连接我们平时连接的时候可以用sqlplus
实际的工作中我们往往用weblogic等等这些软件
用户连接的时候
发起连接,连的是监听
网络操作系统linux或者windows
它们所谓的服务其实就是端口
就是ip地址加端口
用户首先来讲连的是监听
我们虽然讲过监听和数据库之间没有太多的联系
但它们之间也互相知道对方在哪儿
也就是它们之间内部互相之间可以找到
它们之间没有常连接
只不过监听知道数据库在什么位置
用户连接监听
因为监听知道数据库在什么地方
监听就会把用户的连接请求转发给数据库的实例
这个时候实例专门的为这个连接会启一个serverprocess
同时它会将serverprocess的地址告诉监听
监听会把serverprocess的地址告诉客户端
然后客户端直接发起对serverprocess的一个连接请求
这时候客户端和oracle数据库的实例正式建立了连接
然后客户端会把用户名和密码给serverprocess
serverprocess会拿着用户名和密码去验证
验证成功以后这个连接正式建立
此后的所有的客户端和数据库之间的操作
全部通过这个会话,和监听没有关系
记住监听只做一件事情
就是建立连接的时候负责转发
此后就没有任何意义了
即使把监听关了
这个实例已经建立的这个会话
照样存在、照样工作
所以说
监听只是在建立连接的时候帮了个小忙
一旦连接建立以后监听就没有负载了
所以说监听唯一能够出问题的地方
就是在短时间内有大量的连接请求
短时间内突然有一百多个二百多个连接请求去请求监听
这个时候监听可能忙不过来
监听会出现一个短时间内一个延迟
这时候会出现
用户感觉连数据库的时候速度比较慢
oracle有一个报表
报表里面写着每秒新建立的连接的数量
如果数量很大的话,可能监听的负载比较重
正常情况下监听是没有什么负载的
我们再回顾一下
客户端向监听发起请求
监听接受请求以后把这个请求转发给oracle数据库实例
实例然后启一个serverprocess
并把serverprocess的地址告诉监听
监听把这个地址告诉客户端
客户端直接连serverprocess
客户端跟serverprocess建立了一个连接、一个会话
此后客户端访问数据库实例一直靠这个会话
监听不再起作用
也就是监听只负责一件事情
只负责在建立连接的时候起作用
这就是oracle监听的一个体系结构
同时我们知道监听和实例之间没有什么关系
它们之间没有常连接
监听只是知道数据库实例在什么地方
这是我们讲的体系结构
同时讲了连接的建立流程和监听的独立性
二)监听使用的资源
1)监听端口
oracle的监听是个端口
这个linux熟的话应该知道
监听的端口是1521
默认是1521
你启1522、1523都可以
默认客户端连的时候连1521
如果你这个监听改了,改成1522了
客户端连接的时候要连1522
oracle的监听英文叫listener
监听的默认端口号1521
2)监听文件
我们把监听配一下
对oracle的监听来讲
我们用netca命令配
netca这个命令可以建立三个文件
oracle的监听其实就是三个文件
listener.ora、tnsnames.ora、sqlnet.ora
而且sqlnet.ora几乎不用
监听主要是两个文件
一个listener.ora,一个是tnsnames.ora
这两个文件放的位置
客户端应该放一个tnsnames.ora
服务器端的监听应该放listener.ora
也就是说监听
对数据库对服务器端来讲只需要一个listener.ora
客户端只需要tnsnames.ora
当然了我们往往在服务器端
除了有listener.ora外还有tnsnames.ora
往往有两个文件
一个是listener.ora,一个是tnsnames.ora
客户端只有一个文件tnsnames.ora
这俩文件有一系列语法和对应关系
三)建立实验环境
1)本课程中的环境
我们实验中连oracle服务器用的是Xmanager连上来
结构大家稍微注意一下
我们用的是linux服务器
使用Xmanager连上服务器
Xmanager可以启动界面,实验中方便一些
Xmanager远程连上去,链上linux服务器
在Xmanager中的系统界面中打开一个终端
在终端中按
‘ctrl’+’shift’+’+’快捷键
放大终端中的字体尺寸到适当的大小
‘ctrl’+’shift’+’-‘可以缩小终端中字体显示的大小
先配置一下xmanager中Xserver服务器(图形显示服务器)的使用
先在终端执行xhost + 命令
[root@redhat4 ~]# xhost +
access control disabled, clients can connect from any host
然后执行w命令看一下
[root@redhat4 ~]# w
10:10:25 up 2:03, 3 users, load average: 0.38, 0.36, 0.29
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root 192.168. 192.168.3.1 10:00 0.00s 0.00s 0.10s /usr/bin/gnome-session
root pts/1 192.168.3.1:0.0 10:05 0.00s 0.00s 0.00s w
root :0 – 10Dec17 ?xdm? 1:18 0.11s /usr/bin/gnome-session
结果中发现远程是通过
root pts/1 192.168.3.1:0.0 10:05 0.00s 0.00s 0.00s w
登上来的
然后在Xmanager打开的终端中继续执行
[root@redhat4 ~]# export DISPLAY=192.168.3.1:0.0
也就是把图形界面映射到本地
然后切换到oracle用户
[root@redhat4 ~]# su – oracle
[oracle@redhat4 ~]$
然后执行netca命令
netca的图形界面就直接映射到本地了
2)linux系统中Xserver的使用和相关的几个命令
Linux系统内核没有图形界面,是一个基于命令行的操作系统
它要显示图形要由linux下的应用程序实现,Xfree86就是这样一个程序
现在发行版的linux或unix系统见到的图形界面操作环境
是由不属于内核的窗口管理器类软件实现的
LINUX里最常用的是KDE和GNOME
UNIX系统中常常使用CDE
也就是说linux系统和图形的显示并不在一起
和我们常见的windows系统不同
在windows系统图形界面是操作系统的一部分在系统内核中就实现了
而linux显示图形要使用X协议在需要使用图形的程序和图形显示程序之间传递信息
X协议在X服务器软件和X应用程序都要遵循
XFree86是LINUX上最常用的实现X协议的一个X服务器软件
常用的X服务器软件还有MOTIF、XORG等
一个基于X的应用程序需要运行并显示内容时就联接到X服务器,开始用X协议和服务器交谈
X应用程序告诉X服务器要显示的内容
X服务器负责捕捉键盘和鼠标的动作等告诉X应用程序
这样可以在linux系统上运行一个X应用程序然后在另一台有X服务器的系统上显示
当然也可以在本机的X服务器上把图形显示出来
我们使用的oracle软件它是一个数据库服务器
被安装在linux中是个数据库的服务器
而在X协议这里就是图形显示协议X协议里
oracle是个X应用程序
一般XFree86是它使用的图形显示服务器
oracle要启动图形界面
它需要把内容发送到图形服务器去显示
当前的实验环境
就是linux中oracle运行的图形程序
要把图形发送到windows系统中运行的Xmanger中
用Xmanager中的Xserver显示出来
Xmanager是运行于windows中的一个Xserver服务器软件
一般在Xmanager和linux之间我们使用
XDMCP(X Display Manager Control Protocol)X显示监控协议
建立图形传输的连接
XDMCP在linux中表示为一个服务有它的端口
可以将linux的整个桌面发送到Xmanager并由Xmanager显示出来
经过一些配置建立连接后
本节课还用到了几个命令
xhost命令、w命令 和DISPLAY环境变量
DISPLAY用来设置将图形显示到何处
DISPLAY环境变量格式如下hostname: displaynumber.screennumber
host指Xserver所在的主机主机名或者ip地址,为空则表示Xserver运行于本机
displaynumber是显示设备号,不同的远程连接方式它的数字表示不同类型的值
screennumber为屏幕号,几乎总是0
这三个部分最终决定将图形输出到什么位置
Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上
如果需要别的用户的图形显示在当前屏幕上
则应以当前登陆的用户,也就是切换身份前的用户执行如下命令
xhost +
这个命令将允许别的用户启动的图形程序将图形显示在当前屏幕上
该命令必须从有显示连接的机器上运行
语法:
xhost [ + | – ] [ Name ]
“+”表示增加,”-“表示去除
本节课使用的xhost + 是使所有用户都能访问当前使用的Xserver
w命令
该命令用于显示登录到系统的用户情况
结果中这节课用到的FROM列是远程主机名
表示这行的USER(登录帐号)是从什么位置连接到linux系统的
结果中192.168.3.1:0.0就是在Xmanager中运行界面root用户执行w命令时的位置
export DISPLAY=192.168.3.1:0.0
表示将linux系统的图形输出到192.168.3.1:0.0位置
xhost +使所有linux中的其它用户都可以使用当前用户使用的当前屏幕作为输出
这三个命令都是在Xmanager连接到的linux系统中实际运行的
四)配置监听文件listener.ora
1)使用netca配置监听
[oracle@redhat4 ~]$ netca
Oracle Net Services 配置:
在这里就打开了
Oracle Net Configuration Assistant界面窗口
第一个界面
请选择希望进行的配置:
选择第一项
监听程序配置
记住这个是在数据库服务器端配的
数据库服务器端有监听,在数据库端来配
选择了监听程序配置后点击下一步
是 监听程序 界面
让选择要做的工作
这里选择 添加
继续 下一步
进入 监听程序名 界面
要求手工输入一个 监听程序名
默认是 LISTENER
老师在这里没有修改
如果已有同名的监听程序名,因为进行的是添加的工作,这里自己就要使用个新名字
下一步
选择协议
可以选择这个监听程序接受连接可以使用的协议
默认是通过tcp协议来连接监听
继续 下一步
TCP/IP协议 界面
让用户选择协议使用的端口号
这里监听使用标准端口号1521,不改
点击下一步
这个监听程序就建立完了
进入 更多的监听程序 界面
询问是否配置另一个监听程序
这里就不配了
选择 否
点击下一步
配置程序完成
下一步
完成
就行了
配置监听LISTENER
在终端的返回结果是:
[oracle@redhat4 ~]$ netca
Oracle Net Services 配置:
正在配置监听程序:LISTENER
默认本地命名配置完成。
监听程序配置完成。
Oracle Net 监听程序启动:
正在运行监听程序控制:
/u01/app/oracle/product/10.2.0/db_1/bin/lsnrctl start LISTENER
监听程序控制完成。
监听程序已成功启动。
成功完成 Oracle Net Services 配置。退出代码是0
监听配完了
非常简单,几乎什么都没配
netca是生成监听程序
每添加一个就会生成一个监听程序
并且保存在listener.ora中
每个监听程序都会用来在指定的端口进行监听行为
netca不会用来生成监听信息的,和动态注册和静态注册的注册信息没有关系
2)生成的监听文件内容
刚才配的监听那一系列操作
其实对oracle来讲它是生成一个文件
listener.ora这么个文件
刚才那个配置生成了一个文件listener.ora
[oracle@redhat4 ~]$ cd $ORACLE_HOME
[oracle@redhat4 db_1]$ cd network/
[oracle@redhat4 network]$ cd admin
[oracle@redhat4 admin]$ pwd
/u01/app/oracle/product/10.2.0/db_1/network/admin
[oracle@redhat4 admin]$ ls
listener.ora samples shrept.lst tnsnames.ora
在目录
/u01/app/oracle/product/10.2.0/db_1/network/admin
下的listener.ora就是刚才生成的文件
刚才那个配置就是生成这个文件
执行vi看这个文件的内容
[oracle@redhat4 admin]$ vi listener.ora
显示结果:
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = redhat4)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
这就是这个文件
上面这些SID_LIST_LISTENER可以不看
当前的内容和PLsql有关系,是留给PLSQL使用的
我们不看它
LISTENER =
部分就是前面所做的配置工作
在监听配置文件中的配置信息
对我们这里面
别的可以都不去看,所有的都不看
只看一个部分就行了
哪个地方就是
(ADDRESS = (PROTOCOL = TCP)(HOST = redhat4)(PORT = 1521))
这一行
主机名
HOST = redhat4
端口号
PORT = 1521
我的监听
这个主机名是redhat4
是我本机的名字
也就是将来我的1521端口会在redhat4这个主机上启着
一般往往把
HOST = redhat4
部分改成本机的ip地址
老师的本机ip地址是192.168.0.100
就是老师服务器端的这个HOST地址可以改成的服务器端的ip地址
本人的主机ip地址是192.168.3.47
这就是当前listener.ora文件大概的内容
如果对文件进行了修改,可在VI内执行:x保存并且退出
五)操作监听的几个命令
监听可以重启
先stop
[oracle@redhat4 admin]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 03-JAN-2018 08:38:38
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
The command completed successfully
先停一下
然后start启一下
[oracle@redhat4 admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 03-JAN-2018 08:40:44
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait…
TNSLSNR for Linux: Version 10.2.0.1.0 – Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener. ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 03-JAN-2018 08:40:45
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener .ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.l og
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
The command completed successfully
这就是监听起来了
起来以后看状态用lsnrctl status
[oracle@redhat4 admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 03-JAN-2018 08:42:22
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 03-JAN-2018 08:40:45
Uptime 0 days 0 hr. 1 min. 37 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
Service “jiagulun” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulunXDB” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulun_XPT” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
The command completed successfully
那么监听就配完了
就这么简单
就是一个文件
/u01/app/oracle/product/10.2.0/db_1/network/admin
目录下的
listener.ora文件
这个文件是用netca生成的
好我们配完了
其实即使系统中没有这个listener.ora文件
系统中也是有监听的
这时系统会自动生成一个名为LISTENER端口号为1521的监听器
并且默认接受实例在监听的注册
六)配置tnsnames.ora文件
sqlnet.ora这个文件我们先不理他
没有意义,我们不用它
我们除了配listener.ora文件以外
还有tnsnames.ora
配完listener.ora这个文件以后
服务端就可以启监听了
而tnsname.ora这个文件是监听在客户端用的
我们去配一下
也是执行netca
[oracle@redhat4 ~]$ netca
欢迎使用界面
选第三项
选:本地Net服务名配置
它是生成tnsnames.ora的
Net服务名配置 界面
选择 添加
Net服务名配置.服务名 界面
这里输入要为哪个oracle数据库服务器建立网络服务名
我们数据库的服务名叫jiagulun
——————(
数据库的服务名怎么判断呢
我们再打开一个终端
开启一个sqlplus连接数据库
执行
SQL> show parameter service
NAME TYPE VALUE
———————————— ———– ——————————
service_names string jiagulun
数据库的service_names是jiagulun
)
在netca配置的这个地方
这一步输入数据库的服务名jiagulun
配置界面中对这个服务名的解释是:
每个Oracle数据库或服务都有一个服务名。Oracle数据库的服务名
通常是全局数据库名。请输入要访问的数据库或其它服务的服务名。
下一步
Net服务名配置.请选择协议
我们使用TCP
下一步
Net服务名配置.TCP/IP协议
这里有个主机名
tnsname.ora是客户端的
客户端要连接数据库
所以这个ip地址应该是数据库的监听的IP地址
就是listener.ora中配的IP地址
在主机名中输入IP地址
192.168.3.47
——————(
也可以去看一下是哪个ip地址
可以使用netstat命令去看
[root@redhat4 oracle]# netstat -tulnp|grep 1521
tcp 0 0 192.168.3.47:1521 0.0.0.0:* LISTEN 14668/tnslsnr
好是192.168.3.47这个ip地址
那个1521端口在哪个ip地址上启着用netstat来看
因为在实际的生产中
我们发现
一个oracle数据库服务器可能有4个6个或8个网卡
到底在哪个网卡上,哪个ip地址启的1521
我们以上面的查询作为标准
实训、实际生产里一个数据库服务器都有很多网卡
而这里是在3.47上
)
回到配置界面
使用标准端口号1521
下一步进入
Net服务名配置.测试
咱先不测试
下一步进入
Net服务名配置.Net服务名 界面
这是网络服务名,整个配置就为了得到这一个名字
netservers名输入随便起
一般我这个名字和前面的服务名是一样的
整个配置过程中
第一个服务名
必须和oracle里面的service_names一样
刚才已经看了
后面这个网络服务名无所谓
比如我们可以叫jiagulun_ora
和前面那个可以不一样也可以一样
这里输入jiagulun_ora
下一步进入
Net服务名配置.是否配置另一个Net服务名
这里选否
下一步
Net服务名配置完毕!
下一步
完成
配完了
终端命令行显示结果:
[oracle@redhat4 ~]$ netca
Oracle Net Services 配置:
默认本地命名配置完成。
已创建的 Net 服务名: jiagulun_ora
成功完成 Oracle Net Services 配置。退出代码是0
配完以后
我们看看oracle做了一件什么事情
[oracle@redhat4 admin]$ pwd
/u01/app/oracle/product/10.2.0/db_1/network/admin
[oracle@redhat4 admin]$ ls
listener18010310上午3037.bak shrept.lst
listener18010310上午4433.bak tnsnames18010310上午3037.bak
listener1801038上午0327.bak tnsnames18010310上午4433.bak
listener1801038上午0441.bak tnsnames1801038上午0327.bak
listener.ora tnsnames1801038上午0441.bak
samples tnsnames.ora
生成了tnsnames.ora这个文件
我们vi一下这个文件
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
JIAGULUN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = jiagulun)
)
)
JIAGULUN_ORA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = jiagulun)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
我们看这里面生成了一个JIAGULUN_ORA
JIAGULUN_ORA =部分就是我们最后起的名字包含的内容
其中的(SERVICE_NAME = jiagulun)
这个名字SERVICE_NAME必须和数据库的服务名字service_names一样
而上面的名字JIAGULUN_ORA
这个名字随便起
我们这里叫JIAGULUN_ORA
这里面的(HOST = 192.168.3.47)是ip地址
和(PORT = 1521)是端口号
退出vi编辑器时
先使用:w保存
然后使用:q退出
七)客户端连接监听
监听刚才有了,怎么去使用?
我们看我们访问oracle数据库的时候怎么访问
在客户端我用
sqlplus 用户名/密码@一个字符串
用户名和密码是属于数据库的用户名和密码
在客户端sqlplus中执行用户名/密码@一个字符串
在客户端发现用户名/密码@一个字符串的时候
这个时候oracle的客户端自动的去tnsname.ora里面去解析这个字符串
把这个字符串解析成
我们要连谁、连谁的端口号是多少、我连的服务名字是谁
这三个信息
也就是通过这个字符串
马上找tnsname.ora这个文件
找这个文件去解析这个字符串
在tnsname.ora针对这个字符串去解析
解析里面有
IP地址、端口号
ip地址是连谁,端口号是连谁的那个端口
还有在这个端口上连哪个服务
所以说我们连的时候
如用sqlplus hr/hr@jiagunlun_ora
要把jiagunlun_ora这个串在tnsname.ora里面被解析
在
/u01/app/oracle/product/10.2.0/db_1/network/admin
目录下
查看tnsname.ora文件
这个文件里面
有这个串JIAGULUN_ORA
大小写不区分
这个串被解析成
(HOST = 192.168.3.47)是这个ip地址
(PORT = 1521)是这个端口号
和(SERVICE_NAME = jiagulun)这个是服务名字
根据
(HOST = 192.168.3.47)(PORT = 1521)
这俩ip地址和端口号能够找到监听
然后告诉监听要连接哪个服务名字
根据服务名字能够找到数据库
所以说tnsname.ora里面有三个选项
配置时:
HOST = 192.168.3.47是数据库服务器的ip地址
PORT = 1521为端口号
这两个给大家讲了可以用netstat查
而SERVICE_NAME = jiagulun
这个用show parameter查
show parameter service
执行结果
SQL> show parameter service
NAME TYPE VALUE
———————————— ———– ——————————
service_names string jiagulun
里面有service_names是jiagulun
所以配置完然后就可以连了
八)一个排错流程
整个实验是使用的sqlplus做的
在远程控制软件PUTTY登陆到oracle服务器所在的linux系统后
在服务器环境中启动的sqlplus
所以这里sqlplus中使用的是oracle服务器中的本地tnsnames.ora文件
现在使用sqlplus hr/hr@jiagunlun_ora字符串连一下数据库实例
[oracle@redhat4 ~]$ sqlplus hr/hr@jiagunlun_ora
SQL*Plus: Release 10.2.0.1.0 – Production on Thu Jan 4 07:25:25 2018
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
Enter user-name:
连不上来
这是出问题了
我们讲过用户名密码hr/hr是正确的
@jiagunlun_ora好像是它有问题
我们看有什么问题
一起看一下当连接的时候的排错流程
第一步就是tnsnames.ora
先看tnsname.ora这个文件
[oracle@redhat4 admin]$ vi tnsnames.ora
前面有这个文件的显示结果
这里面有ip地址、有端口号
在服务器端
用netstat -tulnp|grep 1521这个命令得到的结果
去看一下在我客户端tnsnames.ora里面配置到底对不对
这个刚才看了是对了
除了这个以外
还有SERVICE_NAME是否等于oracle数据库端的service_names
如果等于的话说明它没问题
这个用show parameter service可以看到
如果说tnsnames.ora里面的配置里面
ip地址和1521都没问题
然后SERVICE_NAME也没问题
这些都没问题说明客户端是没有问题的
然后客户端tnsping
用这个命令ping一下服务器的ip看看连没连通
我们在客户端去ping一下
[oracle@redhat4 admin]$ tnsping jiagunlun_ora
TNS Ping Utility for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 07:48:07
Copyright (c) 1997, 2005, Oracle. All rights reserved.
Used parameter files:
TNS-03505: Failed to resolve name
还是报错误
再看是不是jiagunlun_ora大小写的问题
我们设置的小写,但是在tnsnames.ora这里面成大写了
我们把tnsnames.ora里面的大小写改一下
把JIAGULUN_ORA改成jiagulun_ora
正常命令中使用时是小写
再去试一下,再去ping一下
tnsping jiagunlun_ora
结果仍连不上
再次检查文件的内容
[oracle@redhat4 admin]$ cat tnsnames.ora
没有问题
直接把tnsnames.ora中的名字复制到命令中执行
[oracle@redhat4 ~]$ tnsping jiagulun_ora
TNS Ping Utility for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 07:58:00
Copyright (c) 1997, 2005, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = jiagulun)))OK (0 msec)
命令成功
是刚才执行命令时输入错了字符
当前这个执行tnsping是没问题的
是可以解析的OK (0 msec)
刚才那个没注意为什么ping不行
是不是输入错了
检查结果:是输入错了
错误的输入是:tnsping jiagunlun_ora
错误jiagunlun_ora中比正确的jiagulun_ora多了一个字符n
说明在tnsnames.ora中的大小写也没问题
我们再改回用大写JIAGULUN_ORA
tnsping JIAGULUN_ORA
和
tnsping jiagulun_ora
都没问题
其实大小写不区分
记住tnsping如果能ping通的话只说明一个问题
只说明tnsnames.ora里面
ip、端口号配置是没问题的
但是service_names对不对这里还测不出来
虽然在tnsping的返回结果中把整个网络服务名的定义返回了
但服务名SERVICE_NAME是tnsping不能验证的对象
sqlplus连接时SERVICE_NAME却是必须要验证的
tnsping是oracle软件提供的一个程序
tnsping在通讯时使用TCP协议
它能解析名称并核实相应主机的端口是否打开
用来检测oracle监听端口的状态
并不会核实网络服务名定义中的SERVICE_NAME在监听状态中是否存在
所以记住tnsping能ping通不一定oracle能连上去
使用正确的字符串连一下
[oracle@redhat4 ~]$ sqlplus hr/hr@jiagulun_ora
SQL*Plus: Release 10.2.0.1.0 – Production on Thu Jan 4 08:07:45 2018
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Production
With the Partitioning, OLAP and Data Mining options
SQL>
链上了,没问题
九)连接字符串
连的流程里面
客户端只做一件事情
把jiagulun_ora解析成ip地址、端口号和SERVICE_NAME
在客户端使用
用户名/密码@一个串
这时候它自动找tnsname.ora里面,解析这个串
ip地址和端口号可以找到监听
这个SERVICE_NAME是数据库的service_names
通过ip地址监听连上来以后
监听必须知道这个SERVICE_NAME
但是SERVICE_NAME的值是oracle的,是数据库相关的
所以现在就要判断监听知不知道这个SERVICE_NAME
这个很关键
我们用哪个命令可以查看监听的状态
[oracle@redhat4 admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 10:33:39
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 03-JAN-2018 08:40:45
Uptime 1 days 1 hr. 52 min. 54 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
Service “jiagulun” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulunXDB” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulun_XPT” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
The command completed successfully
看一下我们的监听
查询结果是我们的监听的状态
状态信息的最下面有这么一行
Service “jiagulun” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
状态是status READY
这行的Service “jiagulun”
这个Service是jiagulun等于tnsname.ora中的SERVICE_NAME
他俩必须相等才能用tnsname.ora中的网络服务名连接到Listener监听器
记住要连上来
必须知道这个Service,必须有这么个Service
可以通过lsnrctl status命令看一下
我们再回顾一下
我们知道客户端tnsname里面有几个名字
第一个是串的名字
就是jiagulun_ora这个串名字
第二个是ip地址端口号
用来找到监听
第三tnsname里面还有个SERVICE_NAME
还有个服务名字
这个ip地址和端口号对应着监听
串的名字必须对应着客户端的sqlplus的用户名密码@的时候对应这个串
对应这个串以后
根据ip地址端口号找到监听
找到监听以后
监听又知道这个SERVICE_NAME对应的service
监听的状态里面有Service和tnsname.ora里面的SERVICE_NAME它俩是必须一样的
十)动态注册和监听中的service的来源
那么监听里面这个service从哪里来的呢
默认的情况下
oracle数据库会把自己的service_names注册到监听里面去
oracle数据库会把自己的用在监听的信息注册到listener监听里面去
是注册进来的
我们来看一下
把监听关一下
[oracle@redhat4 admin]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 10:53:15
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
The command completed successfully
再启一下监听
[oracle@redhat4 admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 10:55:00
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait…
TNSLSNR for Linux: Version 10.2.0.1.0 – Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 04-JAN-2018 10:55:00
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
The command completed successfully
好我们再看一下监听的状态
[oracle@redhat4 admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 10:56:59
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 04-JAN-2018 10:56:57
Uptime 0 days 0 hr. 0 min. 2 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
The command completed successfully
因为刚起来
监听信息的最底下Services里面没有jiagulun这个名字
因为这时候还没有注册进来
因为这个注册是后台进程PMON注册的
PMON进程根据init.ora中的instance_name、service_names两个参数将实例和服务动态注册到listener中
就是将数据库的名字将数据库的Service_names注册进监听来
pmon进程在instance启动的时候会注册
而且它定期巡查,每隔一段时间可以进行新的注册
所以监听程序有改变后,PMON注册需要一段时间才能够过来
为了加快速度我们可以用手工注册一下
先连入数据库
[oracle@redhat4 admin]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 – Production on Thu Jan 4 11:01:55 2018
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Production
With the Partitioning, OLAP and Data Mining options
SQL>
然后执行命令
SQL> alter system register;
System altered.
这个命令常用
就是强制PMON抓紧时间将service_names注册到监听里面去
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Production
With the Partitioning, OLAP and Data Mining options
退出sqlplus
马上再看一下
[oracle@redhat4 admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 11:05:40
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 04-JAN-2018 10:56:57
Uptime 0 days 0 hr. 8 min. 43 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
Service “jiagulun” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulunXDB” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulun_XPT” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
The command completed successfully
好了,jiagulun过来了
Service “jiagulun” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
甲骨论这个名字过来了
然后状态是status READY
所以我们来看oracle数据库会把service_names注册到监听里面来
如果说注册的过程晚的话
可以使用alter system register;命令
强制注册过来
记住无论是强制注册过来还是自己注册过来
都叫自动注册,叫动态注册
也就是说实例自动将名字注册到监听里面去
十一)监听连接过程中对应的SERVICE_NAME
我们来看oracle连接的时候怎么连接
首先你在客户端
sqlplus 用户名/密码@一个串
要确定这个串sqlplus认不认识
sqlplus不认识后面@这个串
sqlplus就拿着这个串去tnsname.ora里面去找
如果这个串对应着tnsname.ora里面的这么个串
根据这个串然后找ip地址和端口号以及SERVICE_NAME
根据ip地址和端口号找到监听
监听状态里面有一个service和tnsname.ora里面的SERVICE_NAME如果对上口的话
双方之间就建立连接了
是客户端和监听建立连接了
这里面如果说
客户端里面SERVICE_NAME和监听里面service如果对应不上的话
客户端和监听之间就建立不了连接
建立不了连接
更谈不上监听把这个链接转到数据库实例上
所以说第一步客户端在找到服务器监听后
它们之间是对SERVICE_NAME
所以说两个service必须一样
服务器的service_names
用show parameters service 可以看
这个对应关系现在应该理解了
十二)静态注册
除了动态注册以外还可以静态注册
1)配置静态监听
老师显示了一个listener.ora
内容如下:
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.203)(PORT = 1521))
)
LISTENER1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.203)(PORT = 1522))
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = static_ora)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = oraclr10g)
)
)
静态注册就是在监听里面
在LISTENER.ora里面
如文件中的
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = static_ora)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = oraclr10g)
)
)
这一部分这几行敲上
这个文件中的LISTENER1先不看它
在监听这一端LISTENER部分的主机名字和端口号不动它
关键是再加上
SID_LIST_LISTENER
部分的这几行
加上了
(SID_DESC =
(GLOBAL_DBNAME = static_ora)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = oraclr10g)
)
这五行
这叫静态注册
就是加上类似上面的那五行
静态注册的效果
首先来讲
静态注册是为了解决oracle动态注册不稳定的情况,这种情况有时候会出现
看看当前自己的listener.ora文件的内容
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
这里面静态注册的是
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
这五行
是监听默认添加的,和oracle客户端软件PLSQL的使用有关
复制一下
在vi编辑器中
光标停在
(SID_DESC =
行上
然后按下依次按下5、y、y
就复制了这5行
然后把光标停在这5行的后面
按下p键
复制的五行就粘贴在了原五行的后面
然后对粘贴的五行进行修改
把
(SID_NAME = PLSExtProc)
这一行修改为
(GLOBAL_DBNAME = jiagulun)
GLOBAL_DBNAME这个名字是等于数据库的service_names
底下还有个名字
将
(PROGRAM = extproc)
这一行修改为
(SID_NAME = jiagulun)
数据库里面几个名字一会儿讲一下
修改后的内容
(SID_DESC =
(GLOBAL_DBNAME = jiagulun)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = jiagulun)
)
这个是静态注册
静态注册把那五行复制下来以后
GLOBAL_DBNAME等于数据库的service_names
SID_NAME等于数据库的实例名字instance_name
数据库的这几个名字怎么去看呢
SQL> show parameter service
NAME TYPE VALUE
———————————— ———– ——————————
service_names string jiagulun
这就是数据库的service_names
SQL> show parameter instance
NAME TYPE VALUE
———————————— ———– ——————————
active_instance_count integer
cluster_database_instances integer 1
instance_groups string
instance_name string jiagulun
instance_number integer 0
instance_type string RDBMS
open_links_per_instance integer 4
parallel_instance_group string
parallel_server_instances integer 1
结果里面
instance_name string jiagulun
数据库的实例名字叫jiagulun
这两个在这里是一样
这两个值分别对应刚才的两个名字
一个是用
show parameter service
一个用
show parameter instance
分别找到两个名字
对应着静态监听的定义的这个地方
我们看配好的listener.ora文件的内容
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = jiagulun)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = jiagulun)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
配好了看到
GLOBAL_DBNAME = jiagulun
SID_NAME = jiagulun
然后保存编辑好的listener.ora文件
vi编辑器中输入 :x
保存并退出
2)静态监听的效果
把监听重启一下
[oracle@redhat4 admin]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 15:15:31
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
The command completed successfully
[oracle@redhat4 admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 15:16:18
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait…
TNSLSNR for Linux: Version 10.2.0.1.0 – Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 04-JAN-2018 15:16:18
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
Service “jiagulun” has 1 instance(s).
Instance “jiagulun”, status UNKNOWN, has 1 handler(s) for this service…
The command completed successfully
[oracle@redhat4 admin]$
静态注册的好处
我们看监听一起来以后
对应实例jiagulun的这个Service马上注册进来了
但是它的状态是status UNKNOWN
因为它是静态注册的
动态注册是数据库实例动态过来的
静态是手工在listener.ora里面写的
监听状态中的数据并不知道数据库的实际状态
所以静态注册unknown也是正常的
其实静态注册信息的这个状态status UNKNOWN自始至终都是不改变的
没关系,这个不是问题
状态中
Service “jiagulun” has 1 instance(s).
Instance “jiagulun”, status UNKNOWN, has 1 handler(s) for this service…
中的
Service “jiagulun”
这个service对应着GLOBAL_DBNAME
Instance “jiagulun”
这个jiagulun对应着SID_NAME
对应上以后
将来就可以直接给连接了
相比动态注册
静态注册的实例服务
即使实例一时半会儿动态注册不过来也没关系
十三)监听中静态注册和动态注册的对应关系
静态注册它稳定
动态注册它方便
动态注册自己就动态注册过来了
lsnrctl start监听开始
过后一会儿,动态注册还会过来
我们再执行lsnrctl status命令
看一下监听开始以后一段时间后的监听中的注册信息
[oracle@redhat4 admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 04-JAN-2018 15:28:51
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 04-JAN-2018 15:16:18
Uptime 0 days 0 hr. 12 min. 33 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.47)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary…
Service “PLSExtProc” has 1 instance(s).
Instance “PLSExtProc”, status UNKNOWN, has 1 handler(s) for this service…
Service “jiagulun” has 2 instance(s).
Instance “jiagulun”, status UNKNOWN, has 1 handler(s) for this service…
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulunXDB” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
Service “jiagulun_XPT” has 1 instance(s).
Instance “jiagulun”, status READY, has 1 handler(s) for this service…
The command completed successfully
[oracle@redhat4 admin]$
结果中看出动态注册的已经过来了
内容中有
Service “jiagulun”
其中又有
Instance “jiagulun”, status UNKNOWN
这个是静态注册的
而
Instance “jiagulun”, status READY,
这个是动态过来的
也就是针对这个Service “jiagulun”
一个静态、一个动态
但是静态的早就有了
所以静态就是为了
防止监听起来以后这个动态一时半会注册不过来
还有有时候动态的不稳定
静态注册就是稳定
这是静态和动态注册对应关系
当监听状态信息中的注册信息status为UNKNOWN时这个信息一定是静态注册信息
动态注册信息中的状态可以为READY或BLOCKED
一般在数据库启动到unmount状态时向监听注册的信息就是BLOCKED
表示客户不能使用这个注册信息进行连接,即数据库对用户还是不可用的
而注册READY状态信息是表示数据库运行正常可接受用户连接
十四)listener.ora文件内容详细分析
1)listener.ora中定义的是监听程序和它的静态信息
前面netca程序设置了监听后
设置的内容都被保存在了instener.ora文件中
这个文件的内容是数据库中的监听程序的设置
有监听程序的名字
和这个监听程序在哪个ip的哪个端口打开
当然也可以手动修改这个文件的内容
可以向这个文件中添加多个监听程序的定义
这样就可以有多个监听在多个端口同时运行
使用lsnrctl status 监听程序名
每个已定义的监听程序都会有返回结果
监听程序的运行和数据库实例的运行没有直接的关系
即使在数据库实例关闭的状态下
监听程序仍可以处于运行状态只不过这时监听中得不到实例的动态注册信息而已
监听程序的定义在listener.ora中的格式是这样的
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = redhat4)(PORT = 1521))
)
)
把这段定义复制后进行适当的修改可以得到一个新的监听器的定义
如:
LISTENER2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = redhat4)(PORT = 1522))
)
)
这样在listener.ora中就有了LISTENER和LISTENER2这两个监听程序的定义
都可以使用lsnrctl命令操作
如:
lsnrctl status listener2
listener.ora文件中还可以给已定义的监听程序添加静态的数据库实例的信息
方法是建立一个
SID_LIST_监听程序名 的定义
如instener.ora文件中有了LISTENER3这个监听程序
定义为:
LISTENER3 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = redhat4)(PORT = 1523))
)
)
给这个监听添加静态信息
就要增加一个
SID_LIST_LISTENER3的定义
SID_LIST_LISTENER3 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = jiagulun)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = jiagulun)
)
)
而且在里面一定要说明oracle服务的服务名和实例名
这里(GLOBAL_DBNAME = jiagulun)对应实例的服务名service_names
而(SID_NAME = jiagulun)对应实例的实例名instance_name
因为在这里的定义叫做静态注册
就是这里的注册不会被自动更新,除非你手动修改在这个文件中的内容
这样只要这个监听LISTENER3运行start了
这个监听程序静态的服务信息就会起作用
并且可以用于连接
用户根据这个静态信息可以使用
sqlplus hr/hr@192.168.3.47:1523/jiagulun
连接到数据库
只要listener.ora文件中配置了一个监听
这个监听就会被打开
实例就可以指定向它注册信息,这里实例给它的注册信息是动态注册
包括它的静态注册信息或动态注册信息就会起作用
而且只要一个监听程序打开
客户端就可以对它请求连接
就可以使用它得到的注册信息进行下一步工作
当然实例向哪个定义的监听程序注册信息还要看数据库的设置
我看到网上很多的资料把这个文件中监听程序的定义说成了是监听的动态注册
这种说法不对
这个文件本身不包含任何的动态注册的服务状态信息
只有可以开启的监听程序的定义和给监听程序添加的静态信息
动态注册可以将注册信息注册到这些监听程序中
注册后监听程序的状态中才有这些动态注册信息
在这个文件中
仅可以给监听程序添加静态的实例信息
而且这些静态的信息始终不会被自动更新
而动态注册是可变的
可以改变当前接受动态注册的监听程序
以及实例会定期更新自己在监听程序中注册的内容
在oracle数据库实例中有个local_listener参数
用它来指定动态注册要注册给哪个监听器
默认参数值为空,这时动态注册都注册到1521端口的监听程序中
该参数值指定了一个其它端口号后
动态注册都会注册到这个指定的端口号相应的监听程序中
oracle监听程序启动后
不管任何的情况都会在1521端口自动建立一个监听程序
即使listener.ora文件为空也会有一个名为LINSTENER在1521的监听在运行
lsnrctl命令是对监听的操作命令
可以启动关闭每个监听程序
并且可以查看每个监听程序的状态
没有监听名的lsnrctl命令
默认的操作对象是名为LISTENER监听
就是 lsnrctl status 和 lsnrctl status listener 总是相等的
如果local_listener指定了其它端口
lsnrctl默认操作的还是名为LISTENER的监听
这时它不会管实际名为LISTENER的监听定义的端口号是多少
如果这时listener.ora文件中没有名为LISTENER的监听
那它的操作对象就是那个默认自动建立在1521端口的监听程序
2)定义了多个监听程序
在listener.ora文件中有了多个监听的定义后
监听程序的使用会变得有些复杂
但是一定存在1521端口的默认建立的监听
和lsnrctl命令默认的操作对象是名为LISTENER的监听器
listener.ora中定义的每个监听都是可以运行的
都可以使用
lsnrctl start 监听名 启动监听
lsnrctl stop 监听名 关闭监听
lsnrctl status 监听名 查看监