查看: 43244|回复: 154

[网络] [讨论话题]监听连接时间过长如何解决

[复制链接]
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
跳转到指定楼层
1#
发表于 2013-4-28 10:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 guoyJoe 于 2013-5-31 20:11 编辑

    当我们用PL/SQL Developer或用SQLlplus (sqlplus user/password@orcl)连接数据库的时候非常缓慢,连接有时需要30秒
左右才能正常登录到数据库,连接之后数据库一切正常。
  为了能更好的解决上面的问题,我们需要有如下的一些Oracle的网络基础知识,我们一起来讨论!
讨论话题:
  
   1.默认的动态监听与非默认的动态监听的本质区别是什么?配置非默认的动态监听需要注意什么?
     2.你真的理解了静态监听中的GLOBAL_DBNAME是什么意思了吗?知道的说说。
    3.什么场合必须要用静态监听,说的越多越多,最好能用一个实验演示一个案例。
  4.静态监听与动态监听的区别?
    5.最后我们真正的核心话题是:如何解决上面的问题,给些思路?
      哪位大师能用实验重现上面连接缓慢的现象那中奖的机会很大哦。OK,今天我们就讨论服务器端监听(listener.ora)相关 的话题,改天我们继续讨论客户端的tnsnames.ora,sqlnet.ora相关的话题。我们讨论目的是为了大家能更好的理解网络的原理。讨论的越彻底越好。以后碰到这样类似的问题就不会一抹两眼黑了。


讨论时间:2013.4.28--2013.5.8

讨论奖励:活动结束后将会抽取5位会员赠送《Oracle Fusion Middleware 11g架构与管理》图书一本。


非常感谢大家的讨论,获奖名单:kkaaron,MyDBNews,leonarding,vage,phoenixtcyuan 。
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
2#
 楼主| 发表于 2013-4-28 10:03 | 只看该作者
本帖最后由 guoyJoe 于 2013-4-28 20:32 编辑

1.默认的动态监听与非默认的动态监听的本质区别是什么?配置非默认的动态监听需要注意什么?
(1)什么叫默认动态监听呢?满虽以下条件: 
  a.协议必须为TCP
  b.端口必须为1521
  c.对于监听的名称无要求
 
(2)我们再来看如何配置默认的动态监听,实际不须任何配置,Oracle软件安装完成后就天生了默认的动态监听,有些人说我的$ORACLE_HOME/network/admiin/listener.ora被删除了,怎么还能客户端与服务器端还能连接,那只能说明现在用的就是天生的默认的动态监听(即无须listener.ora配置)。
(3)非默认动态监听,即端口非1521,这从里可以了解到默认的动态监听与非默认的动态监听的本质区别就是端口是不是1521.
(4)如何配置非默认的动态监听呢?
  a.配置listener.ora
 
vi listener.ora
[oracle@ocm admin]$ more listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/network/admin/listener.ora
# Generated by Oracle configuration tools.

ADR_BASE_LSNR2 = /u01/app/oracle
LSNR2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ocm)(PORT = 1522))
    )
  )

   
b.alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.132)(PORT = 1522))';


c.alter system register;
    --或着在tnsnames.ora中添加如下内容
    --LISTENERS_ORADB =
    --(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.132)(PORT = 1522))
    --alter system set local_listener='LISTENERS_ORADB' 
 

  这里我要提醒的是:同时开启两个动态监听也只能用一个,另一个动态监听是不能被注册服务的,注册服务主要是由后台进程pmon由做,它以每60秒j时间间隔去观察参数service_names的值,如果有新的服务就把它注册到监听local_listener的参数对应的监听,如果此值为空,说明用的是默认的动态监听。

2.你真的理解了静态监听中的GLOBAL_DBNAME是什么意思了吗?知道的说说。

  如果说看完这幅图还不清楚GLOBAL_DBNAME是什么意思,那我也无语了,有些人说GLOBAL_DBNAME是我们在dbca时让我们输入的GLOBAL DABASE NAME,那完全是不对的,这里的GLOBAL_DBNAME只是一个服务名而已,说到这里我想大家都明白了,还不明白可以给我回贴,我用实验演示给给你看。


3.什么场合必须要用静态监听,说的越多越多,最好能用一个实验演示一个案例。

 
 

 
  有很多场合是必须要用到静态监听的,这里我举一个例子,比如通过远程客户端(只提供sys用户,而不提供os用户)开启数据库服务器:
 
 
 
 
  实验步验如下:
 
(1)先在服务器端配置一个静态监听
vi listener.ora
LSNR3=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST= ocm)(PORT=1523))
      (ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))
SID_LIST_LSNR3=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME= jt)
      (ORACLE_HOME=/u01/app/oracle/product/11.2.0)
      (SID_NAME=ocm)))


(2)启动静态监听
 [oracle@ocm admin]$ lsnrctl start lsnr3
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 28-APR-2013 19:44:36
Copyright (c) 1991, 2009, Oracle.  All rights reserved.
Starting /u01/app/oracle/product/11.2.0/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/11.2.0/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/ocm/lsnr3/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm)(PORT=1523)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=extproc)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm)(PORT=1523)))
STATUS of the LISTENER
------------------------
Alias                     lsnr3
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                28-APR-2013 19:44:38
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/11.2.0/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/ocm/lsnr3/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm)(PORT=1523)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=extproc)))
Services Summary...
Service "jt" has 1 instance(s).
  Instance "ocm", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


(3)我在客户端配置tnsnames.ora
gyj130 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.217.130)(PORT = 1523))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = jt)
    )
  )


注意这里的:端口号1523,服务名jt,这些要以监听状态提供的信息为准。

(4)在服务器端用命令关闭数据库服务器
sys@OCM> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


(5)最后用客户端连接数据库,并启动数据库

 
从客户端连接数据库: 


从客户端启动数据库:


4.静态监听与动态监听的区别?
 (1)动态注册的为readly,静态注册的状态为unknow
   (2)动态是由PMON进程将服务注册到监听中:service_names/instance_name,静态注册是将服务写入listener.ora文件中 global_dbname/sid_name
  (3)动态修改不需要重启,静态每次修改都要重启监听
  (4)动态重启不能马上注册服务,静态重启马上注册服务
  (5)动态有相关的视图v$service_event/v$service_stats可以查等待事件及物理读逻辑读,而静态监听不能
   
 既然有动态监听为什么还要静态监听呢?原因如下:
   ①监听器不是最早启动,oracle实例先启动
   ②监听器重启
   ③oracle实例没有open


使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
3#
 楼主| 发表于 2013-4-28 10:04 | 只看该作者
本帖最后由 guoyJoe 于 2013-4-29 22:00 编辑

5.最后我们真正的核心话题是:如何解决上面的问题,给些思路?
 某日,接到客户电话,反映plsql连接数据库时特别缓慢,大约要30s左右才能连到数据库,但连到数据库后可以正常使用数据库,而且查询数据一点也不慢,这就奇怪了。对于这样的疑难杂症我们如何下手呢?
  数据库缓慢,常常是一个让dba困扰的运维问题。如果没能掌握处理此类问题的思路,面对此类问题时往往会“雾里看花,水中望月”。我们可以确定的是,业务处理的缓慢导致最终用户连连抱怨;dba难以确定的是,数据库究竟哪里缓慢,因为什么缓慢。因此,诊断数据库哪里缓慢,因为什么缓慢的思路,就显得尤为重要。
  碰到这样的问题先尝试在listener.logsqlnet.log中寻找问题的原因(两个日志均存放在$ORACLE_HOME/network/log下),日志中无任何报错信息。根据经验,监听器日志文件过大(超过2G)也会引起监听器运行异常,于是校验了监听器文件大小,只有数百兆。为了减轻监听器运行的负担,关闭了监听器日志功能,问题依旧。
 
 
  
  对于这样的疑难杂症有时我们只能出绝招,用跟踪工具一步步跟踪,呵呵跟踪测试也是一名艺术,对于上面的9步网络连接借助于strace工具进行跟踪,strace命令,是linux提供的用于跟踪程序执行细节的命令

 解决任何问题都要有一定的相关理论知识,基础越扎实越有思路,我们先来看看网络连接的整个过程:
 
 
  
 


(1)客户端SQL Plus请求连接,监听接受客户端的TCP连接,并获取客户端发过来的TNS数据包。
(2)监听进程打开用于与子进程通信的管道,同时fork一个子进程,称为“监听子进程1”的子进程,然后监听进程一直等待,直到这个“监听子进程1”结束。
(3)监听子进程1 Fork出子进程2。
(4)完成上面一步,子进程1马上退出并结束子进程1。
(5)子进程2收集本进程所在的主机名、IP地址及进程号等信息,并把子进程2重名成server process(这里我们也把server process叫前台进程或叫服务器进程),申请占用一小块PGA内存。
(6)前台进程把主机名、IP地址及进程号发送给监听进程。
(7)监听进程收到前台进程的信息,并返回客户端的信息(比如用户密码环境变量等)给前台进程。
(8)前台进程查询USER$、PROFILE$等数据字典,校验用户名密码是否合法,如果用户密码错误就报错用户名密码无效,否则就与客户端进行交互。
(9)客户端收到前台进程的信息与之交互,整个连接创建完成。

[oracle@ocm dbs]$ ps -ef |grep tnslsnr
oracle    4913     1  0 13:56 ?        00:00:00 /u01/app/oracle/product/11.2.0/bin/tnslsnr LISTENER -inherit
 
 
 
 strace -rf -o /gyj/lsnr.log -p 4913



整个监听过程的处理流程如下几步:
.监听接受客户端的TCP连接,并获取客户端发过来的TNS数据包
4926       0.000053 getsockname(8, {sa_family=AF_INET6, sin6_port=htons(1521), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [9169787475114065948]) = 0
4926       0.000226 getpeername(8, 0x7fff2c68e5f8, [9169787475114065948]) = -1 ENOTCONN (Transport endpoint is not connected)
4926       0.000055 accept(8, {sa_family=AF_INET6, sin6_port=htons(42055), inet_pton(AF_INET6, "::ffff:192.168.0.103", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [120259084316]) = 12
4926       0.000063 getsockname(12, {sa_family=AF_INET6, sin6_port=htons(1521), inet_pton(AF_INET6, "::ffff:192.168.0.103", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [120259084316]) = 0
4926       0.000051 fcntl(12, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
4926       0.000034 getsockopt(12, SOL_SOCKET, SO_SNDBUF, [3200064202492396996], [4]) = 0
4926       0.000033 getsockopt(12, SOL_SOCKET, SO_RCVBUF, [3200064202492433792], [4]) = 0
4926       0.000036 setsockopt(12, SOL_TCP, TCP_NODELAY, [1], 4) = 0
4926       0.000087 fcntl(12, F_SETFD, FD_CLOEXEC) = 0
.监听进程打开用于与子进程通信的管道,同时fork一个子进程,也就是前面我们称为“监听子进程1”的子进程,这里进程号为10209。然后监听进程一直等待,直到这个子进程10209结束
4926       0.000053 pipe([13, 14])      = 0
4926       0.000037 pipe([15, 16])      = 0
4926       0.000042 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b3d814b1320) = 10209
4926       0.000765 wait4(10209,  <unfinished ...>
.在监听进程等待子进程10209结束的同时,子进程10209完成的工作相对比较简单,仅仅是fork一个子程,也就是前面称为“子进程2”的子进程,新的子进程号为10210。子进程10209完成fork子进程10210之后,就立即退出:
10209      0.000116 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b3d814b1320) = 10210
10209      0.001169 exit_group(0)       = ?
.回到监听主进程,监听进程在子进程10209退出后,在管道上读取数据,这就是一个会阻塞的操作,只有在管理上读到期数据后,才会返回:
4926       0.000567 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 10209
4926       0.000046 --- SIGCHLD (Child exited) @ 0 (0) ---
4926       0.000040 close(13)           = 0
4926       0.000055 close(16)           = 0
4926       0.000063 fcntl(15, F_SETFD, FD_CLOEXEC) = 0
4926       0.000056 fcntl(14, F_SETFD, FD_CLOEXEC) = 0
4926       0.000127 fcntl(12, F_SETFD, FD_CLOEXEC) = 0
4926       0.000270 poll([{fd=8, events=POLLIN|POLLRDNORM}, {fd=11, events=POLLIN|POLLRDNORM}, {fd=15, events=POLLIN|POLLRDNORM}, {fd=14, events=0}], 4, -1 <unfinished ...>
10210      0.000197 close(14)           = 0
10210      0.000073 close(15)           = 0
.监听进程被阻塞的同时,“子进程2”,也就是进程号为10210的进程,通过exec调用,转而成为Oracle Sever Process:
10210      0.000319 setsid()            = 10210
10210      0.000088 geteuid()           = 500
10210      0.000112 setsid()            = -1 EPERM (Operation not permitted)
10210      0.000169 execve("/u01/app/oracle/product/11g/bin/oracle", ["oracleocp", "(LOCAL=NO)"], [/* 29 vars */]) = 0
6.erver Process执行初始化动作,然后向管道中写入数据:
10210      0.000041 fstat(3, {st_mode=S_IFREG|0644, st_size=12755, ...}) = 0
10210      0.000043 mmap(NULL, 1053208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2b9880bc3000
10210      0.000031 mprotect(0x2b9880bc5000, 1044480, PROT_NONE) = 0
10210      0.000030 mmap(0x2b9880cc4000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x2b9880cc4000
10210      0.000036 close(3)            = 0
10210      0.000054 open("/u01/app/oracle/product/11g/lib/libocr11.so", O_RDONLY) = 3
10210      0.000040 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\302\0\0\0\0\0\0"..., 832) = 832
10210      0.000039 fstat(3, {st_mode=S_IFREG|0644, st_size=1590995, ...}) = 0
10210      0.000043 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b9880cc5000
10210      0.000046 mmap(NULL, 1743432, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2b9880cc6000
10210      0.000031 mprotect(0x2b9880d6d000, 1048576, PROT_NONE) = 0
10210      0.000031 mmap(0x2b9880e6d000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa7000) = 0x2b9880e6d000
10210      0.000044 close(3)            = 0
10210      0.000032 open("/u01/app/oracle/product/11g/lib/libocrb11.so", O_RDONLY) = 3
10210      0.000039 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340{\0\0\0\0\0\0"..., 832) = 832

.一直到期现在为止,我们还没有看到任何异常的地方。但接下来我们往下看,哇,情况已很明显了:
10210  0.000042 uname({sys-“Linux”,node=”localhost.localdomain”, ….})=0
10210  0.000112 open(“/etc/resolv.conf”,O_RDONLY)=9
10210  0.000047 read(9,”search  localdomain\nnameserver 10” …, 4096)=43
这段调用的含义是子进程10210尝试取得node名字localhost.localdomain,接着打开/etc/resolv.conf文件,这个是域名解析的配置文件,接下来d(9,”search  localdomain\nnameserver 10” …, 4096)=43,这个地方后面省略的10开头的应该是域名服务器IP地址。表明通过这个服务器解析域名。
接下来是:
10210 0.0000057  connect(9,{sa_family=AF_INET,sin_port=host(53)},sin_addr=inet_addr(“10.54.170.70”) }),28)=0
10210  0.0000056  poll([{fd=9,events=POLLIN}],1,5000 <unfinished ……>
这段调用含义是子进程10210尝试向10.54.170.70这个IP地址,UDP协议端口53,也就是DNS协议端口请求解析域名localhost.localdomain.
  Poll是子进程10210在检查返回的数据,5000ms,也就是5s.注意这里的结果是unfinished,表明是在解析域名localhost.localdomain的时候出了问题,等待了5000ms,也就是5s.
接着是:
10210  4.055269 <…poll resumed>;) =0 (Timeout)
10210  0.000119 poll([{fd=9,events=POLLIN}],1,5000<unfinished…>
这说明子进程10210在执行poll的时候超时,然后继续poll.

看完上面的跟踪日志已基本可以定位问题了:OK先来模拟上面连接缓慢的现象,只有重现现象才才知道问题原来是这么简单啊。
这只修改/etc/resolv.conf,估计写错DNS服务器的IP地址,其它什么都不变。
vi /etc/resolv.conf
; generated by /sbin/dhclient-script
search localdomain
nameserver 192.168.217.130

#注这里192.168.217.130这个IP不是对应真正的DNS服务器,而是随便写了一个IP.

好马上用sqlplus来做连接:
[oracle@ocm ~]$ sqlplus gyj/gyj@ocm
连接非常缓慢,大约等待10S左右,请耐心等待,OK终于连接正去了。。。。后面操作正常的!!!!!!!!!!!!!!
[oracle@ocm ~]$ date;sqlplus gyj/gyj@ocm <<EOF;date
> exit
> EOF
Mon Apr 29 21:54:45 CST 2013
SQL*Plus: Release 11.2.0.1.0 Production on Mon Apr 29 21:54:45 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
gyj@OCM> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Mon Apr 29 21:54:56 CST 2013


对比下面的时间:相差11s
Mon Apr 29 21:54:45 CST 2013
Mon Apr 29 21:54:56 CST 2013


解决:在resolv.conf中配置正确的DNS IP.如果数据库服务器不接外网,干掉就去掉nameserver 192.168.217.131这行。
把resolve那个里面的条目写成8.8.8.8连接时间就会变成30秒,比原来的时间稍微长一点(这个8.8.8.8 本机必须ping不同,想尽办法将外网断掉)
****************************************************************************************************
好,如果出现的结果是另一个错误,怎么办???????????????????

报错如下:
[oracle@ocm ~]$ sqlplus gyj/gyj@ocm
SQL*Plus: Release 11.2.0.1.0 Production on Mon Apr 29 20:14:30 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
ERROR:
ORA-12545: Connect failed because target host or object does not exist

Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied

Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied

SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus


对下面的配置做一系列的检查:
1.查/etc/nsswitch.conf 配置
[root@ocm ~]# more /etc/nsswitch.conf
hosts:      files dns

2.查/etc/hosts
root@ocm ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
192.168.217.130 ocm.example.com ocm

3.查/etc/resolv.conf
[root@ocm ~]# more /etc/resolv.conf
; generated by /sbin/dhclient-script
search localdomain
nameserver 192.168.217.131

4.查DSN
[root@ocm named]# more /var/named/chroot/var/named/example.file
$TTL    86400
@               IN SOA  server1.example.com. root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
                IN NS   server1.example.com.
server1         IN A    192.168.217.130
ocm             IN A    192.168.217.130
ocp             IN A    172.34.45.57


/etc/nsswitch.conf 这个文件 定义了查找域名解析的顺序 但不是每个应用都会按照这个生面的顺序去走的
/etc/hosts  默认系统的第一解析文件
/etc/resolv.conf 默认系统定义dnsserver的ip地址
最后一个example.file  区域解析文件,负责整个example.com的解析

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
论坛徽章:
6402
娜美
日期:2021-10-12 20:11:36技术图书徽章
日期:2021-09-30 12:11:1120周年集字徽章-年	
日期:2021-09-30 12:12:5820周年集字徽章-20	
日期:2021-09-30 12:43:0619周年集字徽章-周
日期:2021-09-30 13:18:3120周年集字徽章-20	
日期:2021-09-30 16:44:1219周年集字徽章-周
日期:2021-09-30 17:01:04技术图书徽章
日期:2021-09-30 17:59:14技术图书徽章
日期:2021-10-06 10:36:4019周年集字徽章-19
日期:2021-10-06 14:43:24
4#
发表于 2013-4-28 10:11 | 只看该作者
本帖最后由 2009532140 于 2013-5-2 12:17 编辑

在学习郭老的这个课题的时候,遇到了一个很长时间没弄明白的问题,在郭老的指导下终于知道错误的所在。
就从数据库的启动开始吧:

SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'LISTENER_ORCL'

看见这个问题的第一个感觉就是listener.ora中没有默认的 监听:【LISTENER_ORCL】
我之后就将文件中的:
LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = P201108041261)(PORT = 1521))
  )
改成:
LISTENER_ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = P201108041261)(PORT = 1521))
  )

对于这种错误,明显是因为自身对数据库的系统参数:【LOCAL_LISTENER】的不理解!
其实解决这个问题很简单
【1】将【LISTENER_ORCL】置空,使她使用默认的数据库监听。
【2】在tnsname.ora中 添加如下的解释:【注:最好从以前的文件中复制一份出来,这玩意多一个空格都不好使..】
          LISTENER_ORCL =
            (ADDRESS_LIST =
                  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.195.253)(PORT = 1521))
            )
【3】创建pfile 文件,添加如下【*.local_listener='(ADDRESS = (PROTOCOL=TCP)(HOST=192.168.195.253)(PORT=1521))'】,之后用这个pfile 启动,再次创建spfile文件并关闭、启动数据库即可..

===============================分割一下=================================================================================

上面的问题倒是解决了,但是疑问又来了,在这里我提一下并且着手看看能否搞清原因:
listener.ora中的
LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = P201108041261)(PORT = 1521))
  )

作用是啥?默认监听就是监听1521端口,是不是没有必要在【listener.ora】添加上面的一段?

########################################################################################
问题二:我将数据库重新换了个监听,并在listener.ora中添加了静态监听,代码如下::
LISTENER1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = P201108041261)(PORT = 1522))
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (SID_NAME = ORCL)
    )
  )
接下来我将默认的监听改为【LISTENER1】并成功启动数据库。
【结果】:
动态监听确实已经切换到了LISTENER1中。
【执行结果】:
LSNRCTL> status LISTENER1
服务 "ORCL1" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ORCL2" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orclXDB" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl_XPT" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...

【其中没有对orcl的静态监听】
LSNRCTL> status LISTENER

========服务 "orcl" 包含 1 个例程。
  例程 "ORCL", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
【orcl的静态监听居然在这里..】

问题:为什么这个静态监听在listener中.

也就是说:静态监听会在哪里出现,其原因是什么?
更蛋疼的是:我用远程的客户端连接到数据库【此时数据库使用的是LISTENER1 ,这里面没看见有静态监听本数据库】,居然能启动数据库。难道不是只有静态监听才能远程启动数据库么?

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (SID_NAME = ORCL)
    )
  )
改为
SID_LIST_LISTENER1 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (SID_NAME = ORCL)
    )
  )
问题就能解决!
==================================================================================================================
 静态注册时,listener.ora中的GLOBAL_DBNAME向外提供服务名,listener.ora中的SID_NAME提供注册的实例名。
 采取静态注册方法时,listener.ora中的内容如下:SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME =orcl)
(ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
(SID_NAME =orcl)
)
(SID_DESC =
(GLOBAL_DBNAME =orcl1)
(ORACLE_HOME = D:/oracle/product/10.2.0/db_1)
(SID_NAME =orcl)
)
)
该文件表明数据库是单实例的,实例名为orcl,向外提供了两个服务:orcl和orcl1

【在这里,我觉得在静态监听里面叫{GLOBAL_DBNAME},在动态监听里面叫{service_name}】


先留个标记,继续研究一下

使用道具 举报

回复
论坛徽章:
20
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44itpub13周年纪念徽章
日期:2014-09-28 10:55:54马上有钱
日期:2014-12-14 22:33:02美羊羊
日期:2015-02-28 17:32:28沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:18慢羊羊
日期:2015-05-01 17:38:23美羊羊
日期:2015-06-29 21:06:54秀才
日期:2015-08-28 09:17:412014年世界杯参赛球队: 瑞士
日期:2014-06-13 11:23:53
5#
发表于 2013-4-28 10:14 | 只看该作者
我是来学习的!

使用道具 举报

回复
论坛徽章:
0
6#
发表于 2013-4-28 10:15 | 只看该作者
错误的DNS有可能会造成这个现象

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
7#
发表于 2013-4-28 10:16 | 只看该作者
看了这些提问后,才发现我对监听一知半解,查查资料,好好补一课

使用道具 举报

回复
论坛徽章:
0
8#
发表于 2013-4-28 10:16 | 只看该作者
本帖最后由 kkaaron 于 2013-5-11 21:50 编辑

   1.默认的动态监听与非默认的动态监听的本质区别是什么?配置非默认的动态监听需要注意什么?
     答:使用默认的1521端口,local_listener不需要设置
        使用非默认1521端口,需要设置local_listerner参数,如alter system set local_listener  = 'lsnr2'
    2.你真的理解了静态监听中的GLOBAL_DBNAME是什么意思了吗?知道的说说。
     答:静态监听中GLOBAL_DBNAME表示向外提供的服务名,SID_NAME是提供注册的实例。
   3.什么场合必须要用静态监听,说的越多越多,最好能用一个实验演示一个案例。   
     答:监听器首先启动时,就必须配置静态监听,由于动态监听是先启动实例才动态注册
  4.静态监听与动态监听的区别?
     答:静态注册实例启动时读取listener.ora配置文件,将实例和服务注册到监听程序;
     动态注册不需要listener.ora文件,实例启动的时,PMON进程根据instance_name,service_name参数将实例和服务动态注册到listerer中。
   5.最后我们真正的核心话题是:如何解决上面的问题,给些思路?
     答:这个个人感觉可以根据不同的应用分配监听端口,同事减少大批量并发的短连接,等等。。

使用道具 举报

回复
论坛徽章:
5
咸鸭蛋
日期:2012-12-09 22:25:322013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-03-05 15:00:38马自达
日期:2013-07-31 10:31:17问答徽章
日期:2013-11-20 09:59:28
9#
发表于 2013-4-28 10:16 | 只看该作者

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
10#
发表于 2013-4-28 10:16 | 只看该作者
坐等大神

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表