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

Posted 新站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle学习笔记 网络原理及配置相关的知识,希望对你有一定的参考价值。

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&

以上是关于oracle学习笔记 网络原理及配置的主要内容,如果未能解决你的问题,请参考以下文章

Oracle学习笔记之第六节网络介绍及配置,会话

Oracle学习笔记之第五节网络介绍

Oracle学习笔记之第七节共享专用服务器配置及案例

HCNA学习笔记1

oracle学习笔记02

linux学习笔记-nagios监控的简单配置