监听总结之3.监听命令:lsnrctl工具的三个命令start、stop和status都是分步执行的

来源:互联网 发布:淘宝篮球鞋正品店推荐 编辑:程序博客网 时间:2024/06/06 03:36

首先,我们需要知道两个事情:

1、lsnrctl工具下的三个命令,分别是status、stop、start。

我们从三个命令执行后在屏幕上显示的结果来看,可以发现一个共性,就是都有“正在连接到”这句话 。

2、每次进入lsnrctl工具的环境时,lsnrctl工具都会自动读取一次listener.ora文件里的全部内容(当然包括SID_LIST_监听名这个部分的内容)存到内存上。此后,在未退lsnrctl工具的环境前,status、stop、start这三命令在执行到“正在连接到”这一步时,都是使用上述的内容,无论进入lsnrctl工具的环境后,listener.ora文件里的内容是否有变化,都不影响。虽然start命令执行启动监听程序这一步时,是要重新读取一次listener.ora文件的(“监听:”这部分的内容就是证明)。但是,

“正在连接”后跟着的内容又还是进入lsnrctl工具环境时读取listener.ora的内容。

 

为什么说三个命令是分步执行的?

lsnrctl工具下的三个命令,分别是status、stop、start。

我们从三个命令执行后在屏幕上显示的结果来看,可以发现一个共性,就是都有“正在连接到”这句话 。

而且status和start两个命令在“正在连接到”这句话 之后的要显示的内容(基本)是一样的。

还有start执行后在屏幕上显示的结果的开头部分有“启动tnsctl。。。。。监听:”的字样,说明它先是(如果该监听程序原先不存在的话,就会先创建再)启动一个监听程序。

由此,可以看出三个命令里都是分步执行的。

 

三个命令分步执行的具体步骤的说明:

start 监听名A(共有四步)

1、首先,start命令会检查是否有与监听名A同名的监听程序已经启动了,或是虽然与监听名A不同名但是监听配置和它一样的监听程序已经启动了。

    如果这两种情况有一个发生,就会提示“某某监听程序已经启动”。

2、接着,若是没有上述的情况发生,则进入第二步,即执行启动监听程序操作,具体如下:

   在Linux下,

     (start命令) 重新读取一次listener.ora文件里的名为监听名A的监听配置(“监听:”这部分的内容就是证明)。不过,应该没有读取SID_LIST_监听名这个部分的内容,这个未证实过。

      (或是start命令) tnslsnr.exe先复制出自己的一个进程,之后并根据读取来的listener.ora文件里的相关监听配置后初始化该进程。这样,就启动了一个监听程序的过程完成了。

  在window下,

   start 监听名A  时,会先去启动对应的监听服务(在操作系统的服务管理器里)。如果没有对应的监听服务(名),就会自己去创建一个监听服务,且会在start命令执行后显示的结果里有一个提示:failed to open service,error 1060.

    例如,我们启动一个名为OracleOraHome11TNSListener的监听服务时,该监听服务就会根据[控制面板]=[服务]=OracleOraHome11TNSListener 的属性里“可执行文件的路径项”(为"F:/oracle/ora11/bin/TNSLSNR.EXE)的信息来启动TNSLSNR.EXE(如果还未启动的话)。TNSLSNR.EXE则会根据监听服务OracleOraHome11TNSListener提取其里面的监听名部分,即这里的Listener。再根据这个监听名Listener,TNSLSNR.EXE就会从listener.ora文件里读取相关的监听配置,这样TNSLSNR.EXE就会去监听监听配置所说的监听点了。这个就是window下所谓的启动监听程序的过程。

  附加:

例如,在未退出lsnrctl环境前,且名为Listener的监听程序还在运行时,用sc命令删除了对应的监听服务,命令如下:sc delete OracleOraHome11TNSListener,则此时输入stopListener或是statusListener命令,就会提示:failed to start service,error 1058。这是因为在进入lsnrctl环境后,监听服务已经启动或是startListener时创建了监听服务,则会标记该服务名已经存在。标记有该服务,不代表真实该服务是否存在的。        stop或是status命令不直接作用于TNSLSNR.EXE,而是直接作用于监听服务,再通过监听服务作用于TNSLSNR.EXE,所以stop或是status命令发现监听服务没有启动,就试图启动它,但是它已经被删除不存在的了,故而提示:failed to start service。

3、  最后,连接到“正在连接到”后面跟着的监听配置所对应的监听程序上。若该监听程序未启动,则提示“无监听程序”;

4、若该监听程序已经启动,则显示(status)该监听程序的状态信息。

注释:

1、执行Start A时,若是提示“B已经启动”,则A就真的未启动。若是提示“无监听程序”,则A还是会启动了的。

通过退出lsnrctl工具环境再进入后status A即可查看是否已经启动。 或者Tnsping   包含A所有配置条目的网络服务名 看是否每条 配置条目都通。不过这个还一定,因为启动每条配置条目对应的监听点可能是别的好几个监听程序。

2、start时虽然会重新读取listener.ora文件里的相关内容,但是它不会去更新先前进入lsnrctl工具环境时从listener.ora文件读取到内存上的内容。因此,进入lsnrctl工具环境后,若A此时还未启动且又修改了A的监听配置的话,则此时执行start A到它的第三步,即“正在连接到”这一步,会提示“无监听程序”,虽然实际上此时监听程序A已经启动了。

详见《监听总结之start正在连接也是用旧的内容 故start时有读取但未更新内存上从listener文件来的内容

3、  oracle系统在执行”start A“时,会根据监听名A去查找到listener.ora文件里对应的监听配置,进而创建(并启动)一个同名的监听程序的。



status 监听名A(共有两步)

1、直接连接到“正在连接到”后面跟着的监听配置所对应的监听程序上。若该监听程序未启动,则提示“无监听程序”;

2、若该监听程序已经启动,则之后再显示(status)该监听程序的状态信息。


stop  监听名A(共有两步)

1、也是直接连接到“正在连接到”后面的监听配置所对应的监听程序上。若该监听程序未启动,则提示“无监听程序”;

2、若该监听程序已经启动,则之后再停止(stop)该监听程序。


提示:

0、“正在连接到”后显示的内容是在进入lsnrctl工具环境时从listener.ora文件读取的。

      假设一个监听程序对应的监听配置里有包含多条监听配置条目,则“正在连接到”后一般显示的只有其中的第一条监听配置条目,但是实际还是会连接到这多条监听配置条目各自对应的监听点上的

      我们知道,“正在连接到”后一般显示的是“lsnrctl命令   监听名A”所指的名为监听名A的监听配置里的第一条监听配置条目。只要目前已经启动的这些监听程序们中有哪一个的监听配置条目这个第一条监听配置条目是一样的,即会连接到该启动监听程序如果没有存在和这个第一条监听配置条目是一样的,则oracle系统(的某进程)还要看该名为监听名A的监听配置里的第二条监听配置条目。以此类推。如果该名为监听名A的监听配置里的有一条监听配置条目存在于目前已经启动的这些监听程序们中那些监听配置条目中的,则oracle系统就不会再往下看该名为监听名A的监听配置里监听配置条目。或者就一直查看到该名为监听名A的监听配置里的最后一条监听配置条目。

     详见:《监听总结之不同名同配置实验(说明“正在连接到”操作的特点)

1、“ '正在连接到'后面跟着的监听配置所对应的监听程序”,这句话的意思是只要目前已经启动的这些监听程序们中有哪一个的监听配置条目(所谓监听配置条目,就是“协议+IP地址+端口号”这个信息)和“正在连接到”后面跟着的监听配置条目是一样的,即可连接成功。“正在连接到”这一步是不看目前已经启动的监听程序的监听名是否和“正在连接到”后面跟着的监听配置(条目所对应的监听(指的是如start监听名A里的监听名A)是一样的。

2、三个命令里共有的一步 是 “ '正在连接到'后面跟着的监听配置所对应的监听程序。如果所连接的监听程序未启动,则这三个命令的执行结果就都会提示“无监听程序”。


===================================================================================================================================

另一种叙述版本:

status 监听名A(指的是程序 ,这里)   :是先连接到“正在连接到”后面的监听配置所对应的监听程序上,之后再显示(status)该监听程序的状态信息。


stop  监听名B   :是先连接到“正在连接到”后面的监听配置所对应的监听程序上,之后再停止(stop)该监听程序。

提示:如果所连接的监听程序未启动,则这两个命令的执行结果就会提示“无监听程序”。


start 监听名C   :是先检查是否已经有叫“监听名C”的监听程序启动了,启动了,该命令就不会再往下执行,并提示“已有监听名C的监听程序启动”。如果未启动,则再检查是否有虽然与监听名C不同名但是监听配置和它一样的监听程序已经启动了。若是没有,则启动监听名C的监听程序。最后,在连接到该监听名C的监听程序(也就是“正在连接到”后面的监听配置所对应的监听程序)上,执行和status最后一步一样的步骤,即显示该监听程序的状态信息。

在进入lsnrctl工具环境时,lsnrctl工具会一次性读取listener.ora文件上的所有内容到内存上,在未退出lsnrctl工具环境前,执行任何命令(start命令除外),都不会再次读取listener.ora文件上的内容,所以在未退出lsnrctl工具环境前,无论listener.ora文件上的内容是否有改变或是干脆将listener.ora文件删除或是移走,都不会影响lsnrctl工具里命令的执行结果。

除非,例如在进入lsnrctl工具环境后,start监听名A,再status监听名A。之后,退出lsnrctl工具环境。然后,修改监听名为A的监听配置。之后,再重新进入lsnrctl工具环境,status监听名A,则提示“无监听程序”,因为此时执行status时连接到的修改配置后的监听程序,而该程序未启动。未修改前的配置的监听程序仍是处于启动状态的。这样,就会影响lsnrctl工具里命令的执行结果。会影响命令执行结果。

status和stop


start区别于status与stop的地方:

status和stop执行时,都不会重新读取listener.ora文件的内容。但是start则会重新读取listener.ora的内容。执行时,都不会重新读取listener.ora文件的内容

执行时,都不会重新读取listener.ora文件的内容listener.ora文件上的内容listener.ora文件上的内容会影响lsnrctl工具里命令的执行结果。会影响lsnrctl工具里命令的执行结果。会影响lsnrctl工具里命令的执行结果。会影响lsnrctl工具里命令的执行结果。会影响lsnrctl工具里命令的执行结果。


 

原创粉丝点击