oracle学习笔记 网络原理及配置

本文深入讲解Oracle数据库网络配置的关键概念,包括监听器的工作原理、监听器配置文件listener.ora和tnsnames.ora的设置方法,以及如何通过动态注册和静态注册确保数据库服务的稳定性。此外,还介绍了监听器状态查询、常见连接问题排查步骤等内容。
摘要由CSDN通过智能技术生成

oracle学习笔记 网络原理及配置

这节课把oracle的网络讲一下

oracle的网络应该是说现在比较简单
我们在RAC里面在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数据库服务器就开始正常运行了

每一种软件都有它适应的使用群
oracle体系结构较复杂,体积较大,管理困难
操作起来不容易
适合有一定技术能力的大公司使用

一些小的软件使用它作为存储显然是不合适的
我们可以选择适合小型工作的小型数据库

选择软件是为了完成你的目的
如果你适合用oracle
另一个非常重要的事是你会使用它
这又是一件复杂和困难的事

这个选择只有努力的学习不断了奋斗来完成

如果你选择了它,那我们来努力吧!

2018年2月11日
文字:韵筝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值