欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle网络原理及配置教程

程序员文章站 2022-10-31 22:29:52
oracle网络原理及配置教程 一)监听的体系结构 先看oralce网络的一个拓扑结构 首先来讲 oracle数据库已经启动了 oracle的网络是什么结构呢 oral...

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 监听名 查看监