欢迎投稿

今日深度:

oracle网络原理及配置教程,oracle原理教程

oracle网络原理及配置教程,oracle原理教程


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

每个监听启动后

每个监听端口都是开启的

每个监听程序的静态的实例信息在监听程序启动时被自动加载

并且在运行时都是可以被使用的

这里的不同点产生在

实例动态注册的监听的位置也就是注册在哪个监听器上

没有指定local_listener时

动态注册是注册到所有使用1521端口的监听器中

包括默认建立的那个1521端口的监听

即使这时这个默认1521端口的监听的默认名字LINSTENER给了其它端口的监听

就是不会管这时的默认建立的1521端口的监听没有名字

当然用户定义的使用1521端口的监听也会得到动态注册信息

指定了local_listener后

它一般会对应一个非1521的其它端口号,如:1522

这是动态注册是注册到这个新指定的端口号所在的监听中

如果有多个监听使用这个端口号就会向多个监听器注册实例和服务信息

虽然这时默认的1521端口的监听仍然存在并运行着但它已不接受动态注册信息

如果local_listener指定了端口1522

这时监听程序会自动建了两个默认监听而且不理会listener.ora文件中的定义

一个在1521端口一个在1522端口

这时1521的默认监听不接受动态注册而1522端口的默认监听接受动态注册

在local_listener指定了端口1522后

如果这时在listener.ora文件中没有1522端口的监听定义

自动建立的1522端口的监听还是会接受动态注册

并且使用1522端口可以进行数据库的连接

这时运行

sqlplus hr/hr@192.168.3.47:1522/jiagulun

是可以连上的

当一个监听启动,并且有了静态或动态注册的实例服务信息后

客户端就可以和这个监听建立正确的连接了

先通过ip和端口找到监听程序

再在监听的注册信息中去找对应的服务名

这里不会管是静态注册的还是动态注册的实例的服务名

如果匹配了这个连接就建立成功了

如果你在1522端口接收动态注册

而在1523端口中有静态的信息

使用开启状态的1523端口也是可以正常连接到数据库的

因为这里的正确的静态的信息一样可以正常使用

多个监听之间还有一个地方会发生冲突

就是在监听定义中的

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

这一行

它说明这个监听还使用

PROTOCOL = IPC

就是还可以使用IPC协议进行连接

IPC是Inter Process Communication即进程间通讯

是指多个进程之间相互通信,交换信息的方法

同一主机的至少两个进程间进行通讯可以使用IPC,不能跨物理机器,IPC包括共享内存、队列、信号量等几种方式

在使用时要给IPC定义KEY,来唯一标示这个IPC,key就是IPC结构的外部名

如果两个进程在不同的物理机上或在不同的操作平台,则不能用IPC,这时可以用TCP/IP通讯

监听中使用IPC可以使程序在本地直接连接Oracle数据库的Listener

如果多个监听程序的定义使用了IPC并且KEY值相同

这样会造成多个监听在启动时发生冲突

导致后启动的监听无法启动成功

处理方法有两种

1、把有相同IPC key值的监听的KEY值修改成不同的值

2、直接把监听定义中的IPC协议的使用删除或注释掉

就是直接把(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))这一行注释掉

或者把这一行中的KEY的值修改为不同的值

3)lsnrctl命令要注意的地方

在使用lsnrctl命令时

可以进入LSNRCTL>状态

[oracle@redhat4 ~]$ lsnrctl

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 28-JAN-2018 07:32:50

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL>

在监听文件内容改变后

要先退出LSNRCTL>状态

LSNRCTL> exit

[oracle@redhat4 ~]$

然后重新进入

否则在执行命令时会出现一些不该有的错误

因为在进入LSNRCTL>后

使用的都是进入LSNRCTL>时的状态和信息

这时即使listener.ora文件改变了

当前LSNRCTL>中使用的信息并不会随之改变

仍然使用的是进入时的状态信息

所以要先退出然后重新进入才能得到最新的listener.ora文件状态信息

4)多监听配置中的一个特殊情况

在listener.ora文件中添加了多个监听程序后情况会有些复杂

这里在监听程序配置时就有一个特殊的情况

就是一般总会自动建立一个监听名为LISTENER端口为1521的默认监听程序

不管listener.ora中有没有定义这么个监听

当有使用1521端口的其它监听的定义时它也会被自动建立

但当定义中LISTENER名的监听指定了其它端口

这时名为LISTENER的监听就不是默认监听了

这时仍会建立一个默认监听在1521端口上只是没有名字

就是这个特殊情况:默认建立的监听有端口号但是没有名字

可以通过实验证明

a)当local_listener参数为默认即没有指定值时

在没有其它监听使用1521的时候

LISTENER名的监听使用了非1521端口

这时LISTENER名的监听没有动态注册信息

在这时对1521端口执行

sqlplus hr/hr@192.168.3.47:1521/jiagulun

可以连接上

[oracle@redhat4 ~]$ sqlplus hr/hr@192.168.3.47:1521/jiagulun

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jan 28 08:45:36 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>

证明1521端口的监听是存在的

就是在1521端口默认自动建立的监听总是存在并接受动态注册信息

b)当local_listener指定了值时

如指定了1522端口

SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1522))';

System altered.

为了试验

先设置这时在listener.ora文件中没有1521端口的定义

并先设置名为listener2的监听使用1522端口

执行命令

[oracle@redhat4 ~]$ lsnrctl status

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 28-JAN-2018 08:56:03

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production

Start Date 25-JAN-2018 10:41:57

Uptime 2 days 22 hr. 14 min. 5 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /etc/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=redhat4)(PORT=1521)))

The listener supports no services

The command completed successfully

发现端口号为1521的默认监听仍然是已经建立了

只是这时它没有接受动态注册信息

而接受动态注册信息的是listener2监听

[oracle@redhat4 ~]$ lsnrctl status listener2

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 28-JAN-2018 08:57:36

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=redhat4)(PORT=1522)))

STATUS of the LISTENER

------------------------

Alias listener2

Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production

Start Date 23-JAN-2018 10:42:44

Uptime 4 days 22 hr. 14 min. 52 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/listener2.log

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=redhat4)(PORT=1522)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))

Services Summary...

Service "jiagulun" has 1 instance(s).

Instance "jiagulun", status READY, has 1 handler(s) for this service...

Service "jiagulun2" has 1 instance(s).

Instance "jiagulun2", status UNKNOWN, 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

如果这时再把1522端口的监听从listener.ora文件中去掉

就是listener.ora文件中也没有了1522端口的定义

而local_listener参数指定在1522端口

sqlplus hr/hr@192.168.3.47:1521/jiagulun

连不通

但可以ping通

[oracle@redhat4 ~]$ tnsping 192.168.3.47:1521/jiagulun

TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 28-JAN-2018 09:03:32

Copyright (c) 1997, 2005, Oracle. All rights reserved.

Used parameter files:

Used HOSTNAME adapter to resolve the alias

Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=jiagulun))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.47)(PORT=1521)))

OK (0 msec)

并且有状态

[oracle@redhat4 ~]$ lsnrctl status listener

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 28-JAN-2018 09:04:41

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production

Start Date 25-JAN-2018 10:41:57

Uptime 2 days 22 hr. 22 min. 44 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /etc/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=redhat4)(PORT=1521)))

The listener supports no services

The command completed successfully

而在1522端口

[oracle@redhat4 ~]$ sqlplus hr/hr@192.168.3.47:1522/jiagulun

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jan 28 09:02:50 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>

数据库是可以连通的

说明

这时local_listener指定在了1522端口

而且listener.ora文件中没有1521和1522端口的定义

这时oracle监听

仍会自动建立一个1521的默认监听但这时不接受动态注册

而且还会在1522端口自动建一个监听并用来接受动态注册

5)local_listener参数的修改

实例中的local_listener参数用来指定实例把它的信息动态注册到哪个监听中

在修改local_listener参数时有两种方法

一种直接把字符串给它

alter system set LOCAL_LISTENER=’(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1522))’;

另一种方法

先在tnsname.ora文件中设置了一个网络服务名

如:

listener_in =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.47)(PORT = 1522))

)

(CONNECT_DATA =

(SERVICE_NAME = jiagulun)

)

)

tnsname.ora文件中这个服务名可以用来连接数据库

sqlplus hr/hr@listener_in

也可以指定给local_listener

alter system set local_listener= listener_in;

用这个网路服务名来确定使用哪个端口号接受动态监听注册

6)sqlplus本地连接和使用静态注册链接

当listener.ora文件中定义了LISTENER端口号为1521的监听

并且没有其它的监听使用这个1521端口

这时实例向这个监听进行动态注册

这时sqlplus hr/hr@192.168.3.47:1521/jiagulun

是可以正常连接的

当把这个监听关闭后

执行了lsnrctl stop listener后

这个监听被关闭

这时候执行

[oracle@redhat4 ~]$ sqlplus hr/hr@192.168.3.47:1521/jiagulun

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jan 28 14:09:38 2018

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ERROR:

ORA-12541: TNS:no listener

Enter user-name:

说明sqlplus要连接到1521端口是连接不上了

但是

[oracle@redhat4 ~]$ sqlplus hr/hr

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jan 28 14:10:16 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>

可以连接上

说明不带连接字符串的sqlplus是可以连接上的

因为不带参数的sqlplus hr/hr是本地连接不使用监听

当然了这时候

假设有一个监听程序如listener7使用这个1521端口

而LISTENER监听是关闭状态

sqlplus hr/hr@192.168.3.47:1521/jiagulun

也是可以连接上的

这时实例向拥有1521端口的监听注册动态信息

而listener7使用1521端口

它就有实例注册信息

这时请求1521端口的远程连接使用的就是listener7监听开启的1521端口

它的1521端口又有动态信息,所以可以连到数据库实例

当监听中只有一个local_listener定义的端口时

把这个端口关闭

就没有动态注册了

并不是说没有动态注册就进不了数据库

除了本地接入数据库还可以通过静态注册进入数据库

假设这时有个

LISTENER3监听程序

端口号是1523并且这个监听已开启

它的静态注册信息是

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@redhat4 ~]$ sqlplus hr/hr@192.168.3.47:1523/jiagulun

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jan 28 14:27:27 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>

一样成功的接入了数据库

一个监听得不到实例的动态注册信息

当它有正确的静态信息时一样可以用来连接

十五)Oracle数据库的几个名字

本讲前面课程

相关命令

lsnrctl status/stop/start

tnsping

alter system register

这几个命令都看了

netca相关的几个文件

listener.ora

tnsnames.ora

sqlnet.ora

也看了

Oracle数据库的几个名字

数据库名

实例名

服务名

就是实例名字、服务名字和数据库的名字

来看一下oracle的几个名字

SQL> show parameter name

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert string

db_name string jiagulun

db_unique_name string jiagulun

global_names boolean FALSE

instance_name string jiagulun

lock_name_space string

log_file_name_convert string

service_names string jiagulun

第一个

db_name string jiagulun

数据库的名字

这个名字不能改

一般对应我们的普通的单实例环境

instance_name string jiagulun

实例名就等于我们的数据库的名字

这个也不要改

数据库实例中唯一可以改的是

service_names string jiagulun

这个名字是可以改的

service_names改了以后就意味着

这个名字注册的时候

注册到监听里面去

监听状态信息中那个Service就改了

service_names改了注册进监听的就改了

然后客户端也需要改

因为客户端tnsname.ora文件里面有对应的SERVICE_NAME

而这个SERVICE_NAME还对应着监听状态中的service的name

监听的service的name来自于oracle的数据库的service_names

所以说这个名字service_names可以改

改了以后有些地方对应着也要改

这个名字service_names还可以对应着静态注册里面GLOBAL_DBNAME

记住这几个名字

在RAC中这几个名字也会涉及到

数据库的名字、实例的名字和service_names

其中service_names是可以改的

十六)一些其它内容

动态注册、静态注册 讲了

相关命令 讲了

排错流程

tnsnames.ora

ip、端口号:服务器端 netstat -tulnp|grep 1521

service_names: show parameter service

tnsping

lsnrctl status

排错流程中

一个是tnsping

这个有了以后,接着使用

sqlplus hr/hr@

还可以用lsnrctl status

看一下对应关系

我们看一下

几种连接方式

sqlplus hr/hr

sqlplus hr/hr@jiagulun

sqlplus hr/hr@192.168.0.100:1521/jiagulun

sqlplus / as sysdba

在服务器端

如果sqlplus 用户名/密码

直接这个连的时候它不走监听

直接在本地链没走监听

因为监听启不启它都能连上

sqlplus hr/hr

sqlplus / as sysdba

是一样的都不走监听

sqlplus hr/hr@jiagulun

这个是走监听的,完整地走监听

sqlplus hr/hr@192.168.0.100:1521/jiagulun

是走监听了但是没有走tnsname.ora

也就是你tnsname.ora你配不配置这个都可以

因为它把ip地址、端口号、以及服务名字都写上了

所以说几种连接方式大家可以回去试一下

我们正常的生产环境下

一般都用静态注册比较多

因为它稳定一些

相关的知识在以后有机会还会详细去讲

大家听了老师的课以后,在基本上就没问题了

双监听:双IP或者双端口

是什么意思呢

是一个oracle数据库可以启俩监听

比如说我这个oracle数据库服务器

有两个网卡

每个网卡有ip

在其中一个网卡上我启了一个监听

在另一个网卡上又启了一个监听

这个时候

有一部分客户端通过一个监听进来

一部分通过另一个监听进来

我们可以达到负载均衡,网络的负载均衡

虽然说这样的话可以实现负载均衡

但是这个实现负载均衡其实它是有一些局限性的

这个是我们后面RAC里面的内容

这就是

oracle网络里面的相关的一些知识

注意这个排错流程

排错流程里面主要是那一堆名字的对应关系

网络我们就讲到这个地方。

十七)oracle内容回顾

讲到这节课

oracle的体系结构我们大概的就可以梳理出来了

尽管如此

要说明oracle的每个部分和他们之间的关系仍然是件很困难的事

要说的清楚也就是再把整个课程重复一遍

所以这里只简单的把概要的说明一下

Oracle是一个基于B/S模式的关系型数据库管理系统(RDBMS)

在它运行时在主机服务器以及网络上分为几个部分

在磁盘中的数据库数据

内存中的实例

在可以连接的用户机上的客户端

和生产方式中的以oracle为基础为用户服务的各种应用程序

这次的这一系列课程主要讲的是在oracle服务器的部分

而又以实例相关的进程、内存结构和数据的存储为主

对具体的数据Oracle有物理存储结构和逻辑存储结构

物理结构是系统管理员能看到的,逻辑结构则是用户所能感知到的

逻辑结构: 表空间 段 区 块

物理结构: 数据文件(数据文件、日志文件、控制文件) 操作系统块

逻辑存储结构是oracle内部的组织和管理数据的方式。

物理存储结构是oracle外部(操作系统)组织和管理数据的方式

块:Oracle用来管理存储的最小单元,也是最小的逻辑存储结构

区:比块高一级的逻辑存储结构,由连续的块组成

段:由多个区组成,这些区可以是连续的,也可以是不连续的

当用户在数据库中创建各种具有实际存储结构的对象时,比如表、索引等,Oracle将为这些对象创建“段”

不同类型的数据库对象拥有不同类型的段

数据段:保存表中的记录

索引段:索引中的索引条目

临时段:在执行查询等操作时,Oracle可能会需要使用到一些临时存储空间

用于临时保存解析过的查询语句以及在排序过程中产生的临时数据

回滚段:保存回滚数据

表空间:最高级的逻辑存储结构,数据库是由多个表空间组成的

如默认就建立的SYSTEM表空间,SYSAUX表空间

表空间类型可分为:数据表空间、系统表空间、回滚表空间、临时表空间

Oracle数据库逻辑上由一个或多个表空间组成,

每个表空间在物理上由一个或多个数据文件组成,

而每个数据文件是由数据块构成的。

构成数据库的物理文件主要有三种:

数据文件、控制文件、重做日志文件

数据文件:数据文件用于存储数据库数据,如表、索引数据等

数据文件存储着实际的数据,DBWn会将数据库缓冲区中的内容写入到这类文件中去,数据文件的大小和数量是不受限制的

控制文件:控制文件是记录数据库物理结构的二进制文件

控制文件虽小,但作用重大

它包含指向数据库其余部分的指针(包括重做日志文件,数据文件,归档日志文件等的位置),

存储重要的序列号和时间戳,存储RMAN备份的详细信息

对数据库的成功启动和正常运行是很重要的

重做日志文件:记录对数据库的所有修改信息,用于故障恢复

重做日志按时间顺序存储应用于数据库的一连串的变更向量

非主要物理文件包括:

参数文件、密码文件、告警和跟踪文件、归档日志文件、备份文件

如:

实例参数文件

这个文件存储了数据库所需的一些参数设置,是实例启动时首先要加载的文件

口令文件

一般称为外部口令文件。一般的用户名和口令是存放在数据字典中

归档日志文件

ARCn将联机重做日志文件备份归档到这类文件中去,归档日志文件保留了数据更改的完整历史信息

oracle实例内存结构由两部分SGA(系统全局区)和PGA(用户全局区)组成

当启动实例的时候分配SGA

当服务器进程建立时分配PGA

Sga包括share pool、db buffer cache、redo log buffer、large pool、java pool等部分

share pool共享池:

用于存放最近执行的SQL语句和数据字典信息

Database Buffer cache数据高速缓存:

用于存放最近访问的数据块信息

Redo log buffer重做日志缓存区

用于记载实例的变化,由很多重做记录(Redo record)组成

Large pool大池

是一个可选内存区,致力于支持SQL大型命令、大的后台进程操作

java pool Java池

为了java应用而分配的内存空间

这些是SGA的主要部分

会话是用户与 Oracle 服务器的单个连接

当用户与服务器建立连接时创建会话,当用户与服务器断开连接时关闭会话

用户进程是一个需要与oracle服务器进行交互的程序

当用户连接至oracle数据库实例创建会话时,即产生服务器进程

用户进程一旦中止,服务器进程立刻中止

服务器进程用于处理连接到该实例的用户进程的请求

每个用户会话产生的服务器进程server process都具有私有的PGA内存空间

程序全局区(PGA)包含单个服务器进程所需的数据和控制信息

当用户连接到Oracle Server时,Oracle server会为每个服务器进程分配相应的PGA

SGA是所有服务器进程都可共享的一块内存区域

SGA对所有用户共享,PGA不共享

用户进程位于客户端,服务器进程、后台进程位于服务器端

后台进程是Oracle数据库为了保持最佳系统性能和协调多个用户请求而设置的。

Oracle实例启动时即创建一系列后台进程。

由于内存结构和进程结构关系较紧密,进程会作用到对应的内存区域,

数据库的物理结构与内存结构之间的交互要通过后台进程(Backgroung Process)来完成

SMON(System Monitor):

该进程在实例启动时,执行实例恢复,还负责清理不再使用的临时段

PMON(Process Monitor):

进程监视器,主要监视服务器进程

DBWR(Database Writer):

用于将数据高速缓存的脏缓冲区数据写入到数据文件中

LGWR(Log Writer):

用于将重做日志缓冲区所记载的全部内容写入到联机重做日志文件中

CKPT(Checkpoint Process):

负责发起检查点信号,检查点会同步数据库的数据文件和控制文件、重做日志

ARCn(Archiver)

归档进程,用于将重做日志的事务变化复制到归档日志中

PMON SMON DBWR LGWR CKPT 这5个进程为核心进程,不能关闭

这里只列出并说明了最主要的几个后台进程

还有其它的一些进程也有自己的作用

共享服务器调度器(Dnnn)进程

共享服务器(Snnn)进程

恢复进程(RECO)

等等…不再一一列出了

可以使用一个V$视图查看所有可能的Oracle 后台进程,确定你的系统中正在使用哪些后台进程:

select paddr, name, description from v$bgprocess order by paddr desc;

数据库启动时

系统首先在服务器内存中分配系统全局区(SGA),构成了Oracle的内存结构,

然后启动若干个常驻内存的操作系统进程,即组成了Oracle的进程结构,

内存区域和后台进程合称为一个Oracle实例

用户会话对数据库建立连接后

oracle会给这个连接分配一个server process就是服务器进程

再给每个服务器进程分配一个PGA空间

加上数据库数据的各种实体文件

整个oracle数据库服务器就开始正常运行了

www.htsjk.Com true http://www.htsjk.com/oracle/24319.html NewsArticle oracle网络原理及配置教程,oracle原理教程 oracle网络原理及配置教程 一)监听的体系结构 先看oralce网络的一个拓扑结构 首先来讲 oracle数据库已经启动了 oracle的网络是什么结构呢 oralce整...
评论暂时关闭