温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

oracle 12c 新增的LREG进程及其动态注册的过程

发布时间:2020-08-07 18:30:43 来源:ITPUB博客 阅读:294 作者:darren__chan 栏目:关系型数据库

因刚好遇到12c 监听注册的问题,现将以前关于oracle 12c lreg进程的一些学习文章分享下:

oracle 数据库中 pmon  进程一直承担着较多的工作,例如清理进程以及监听注册等 , 这相当于一个人需要同时做好几件工作, 而当其中一件让他应接不暇时,也许这会影响它负责的其他工作,曾经在 11g r2 版本的数据库遇到过 pmon  进程因忙于清理异常中断的会话而导致服务更新 和服 注册出现异常的情况。

oracle12c 以前的版本中服务注册一直都是由 PMON 进程负责 , 12c oracle 引入了 LREG (listener registration) 后台进程接管了这部分工作从而减轻 PMON 的工作。

一. Oracle 监听及服务注册:

Oracle 中,监听器是一个监测连入客户端连接请求并建立和管理会话的服务器端进程。这在当数据库实例启动后不同时间里,数据库实例与监听器联系并建立了一条到该实例的通信路径。

服务注册让监听器能够确定数据库服务及其 service handlers (服务处理程序)是否可用。在注册期间,服务注册进程向 listener 提供实例名称,数据库服务名称以及 service handlers 的类型 ( 专用或共享 ) 和地址。

oracle 12c 以前,负责服务注册的是 pmon 进程:

oracle 12c 新增的LREG进程及其动态注册的过程

而在 12c 以后,负责服务注册的换成了 LREG 进程:

oracle 12c 新增的LREG进程及其动态注册的过程

监听没有启动 LREG 进程不能注册服务 , 但是 LREG 进程会定时尝试注册 , 如果 local_listener 没有配置 ,LREG 会尝试连接默认的 1521 端口 , 直到监听进程启动 在监听启动后 LREG 进行周期注册前 , 同样也可以使用 ”alter system register” 立即注册服务 .litener 的注册信息。实际这个过程是动态注册的过程。

另一个需要注意的是如果 LREG  进程死了,会同样和 pmon  一样,数据库实例也会 crash 12c  直接报出的 ora-500,ora-500 则是监听注册进程死掉。

oracle 12c 新增的LREG进程及其动态注册的过程

二.动态注册的工作过程研究:

1. 使用 oradebug Event 10257 trace name context forever, level 1 6   来将 lreg dump 出来。可以初步看出 lreg 的工作过程:

oracle 12c 新增的LREG进程及其动态注册的过程

dump  出来的信息可以看出, lreg 进程每 3 秒更新一次状态,而到约每 60 秒时便会实例信息进行注册。以下在监听没有启动的情况下, LREG woken up to process network events after 0 cs 之后成功的数量依然为 0 ,说明此时无法注册成功。

oracle 12c 新增的LREG进程及其动态注册的过程

   而当将监听启动后,在 60 秒后的下一个注册是便可以成功注册。

oracle 12c 新增的LREG进程及其动态注册的过程

2. 使用 strace  追踪 lreg 进程的工作过程

当数据库运作时其背后发生了很多事,数据库也是一个应用软件,其背后的这一切都可以追溯到操作系统的工作原理。 在对 lreg 进程进行追踪可能需要先了解 orcle 监听动态注册中的两个概念:文件描述符和   Sockets 文件

当监听进程启动时,它会在 /var/tmp/.oracle 下创建两个套接字文件。  

oracle 12c 新增的LREG进程及其动态注册的过程

这些文件均是  socket  文件, 且 s#12214.1  中的 12214  为进程号,则应为监听的进程号,这些 socket  文被用作本地客户端使用进程间通信协议( ipc )和不同的 oracle 的进程通信,而这些进程包括: tns  监听, css  crs evm  守护进程;甚至数据库和 asm  实例。这些 socket  主动监听 的进程创建。在这里 oracle  监听创建这些 socket  文件主要使用用作 lreg 和  tnslsnr   通信。

   同时,会在 /proc 目录下相应进程号文件下创建几个文件描述符,这些文件描述符( file descriptor )是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行 I/O 操作的系统调用都通过文件描述符。

oracle 12c 新增的LREG进程及其动态注册的过程

可以看到有几个文件描述符,因此,确定有 为进 建的文件描述符和 sockets

那么 LREG 过程(以前的版本 PMON 行的 动态 注册与文件描述符和 sockets 文件相关的 程是怎 的呢?

这些进程通过系统调用来查看监听器是否启动,如果没有发现监听进程,则等待,并且在 3000 毫秒之后重新 尝试 。直到 听启 动时 ,文件描述符被 听打开,并被 定以建立彼此之 接。

要找到 LREG 程正在做什么,我使用 STRACE OS 用程序来跟踪它的工作。  11g 中的 PMON 程的 出不是完全相同的,因 它不是一个 专门 用于在 听器中注册 例的 程。另一方面, LREG 的唯一目的就是 动态 注册, 这样 可以解 两个 程之 使用的系 统调 用之 的差异。

以下是 STRACE LREG 进程的日志:  

oracle 12c 新增的LREG进程及其动态注册的过程

  从以上 strace 日志可以看到主要调用 epoll_wait()  函数 函数表示通 文件描述符来等待某个 I/O 事件发生的 时间 实际 就是一个持 等待某个 IO 事件的 生,而表 到数据 库层 面, 应该 就可以理解 为监视监听进程是否启动的过程,在 epoll_wait(7, {}, 1024, 3000) 的最后一个 参数 示的 时间 以毫秒 3000 毫秒 为单 位(也就是 3 秒)。

关于epoll_wait的解释:

oracle 12c 新增的LREG进程及其动态注册的过程

接下来的两行 getrusage ()函数表示 源使用消耗,而后面 times() 时间 函数返回 时间 ,在前面的 时间 打印很明 可以看出是每 3 行一次函数。

 再继续往下看是 socket 函数其后面的值为 10 ,表示使用一个 socket 函数来处理文件描述符 10 。猜测这是用来与监听器进程建立连接的文件描述符。这里使用的套接字是 NETLINK ,用于创建内核和网络层之间的连接。

oracle 12c 新增的LREG进程及其动态注册的过程

进一步查看下面的函数, 是对前面函数返回的文件描述符 10 进行尝试绑定。

oracle 12c 新增的LREG进程及其动态注册的过程

在接下来的几行中,这个文件描述符将被用于与 PID 2582 的连接,而这个 PID 2582 LREG 进程的 PID

oracle 12c 新增的LREG进程及其动态注册的过程

正在尝试与 IP 地址 127.0.0.1 建立 接,端口号是 1521

oracle 12c 新增的LREG进程及其动态注册的过程

由于没有启动监听进程,并且还没有文件描述符 10 与进程 LREG 相关联,因此连接被拒绝,即也没有建立的连接。

oracle 12c 新增的LREG进程及其动态注册的过程

而在启动监听之后, lreg 发现监听,并可以正常建立连接后则没有没有报出被拒绝的错误 

oracle 12c 新增的LREG进程及其动态注册的过程

oracle 12c 新增的LREG进程及其动态注册的过程

oracle 12c 新增的LREG进程及其动态注册的过程

在以上lreg进程活动的日志可以看出 较多的 epoll_ctl与 epoll_wait函数调用,epoll在这里epoll貌似一种不断来触发监听并操作某些文件描述的过程,lreg调用 epoll_wait  每3秒来监测监听进程是否启动,当发生注册时使用 epoll_ctl去添加删除某个文件描述符。具体的确实一时 无法 了解清楚。

   

    在监听程序启动后,可以使用 lsof –i TCP:1521 命令 来看 lreg 进程与tnslsnr进程的连接。

     ESTABLISHED的意思是建立连接。表示两个进程正在通信。    ncube-lm是  nCube License Manager (即ncube管理的一个许可证明),意思是被允许,被认证开放的意思,这是tnslnr开启的并处于LISTEN状态。

三.总结:

      oracle 12c  除了服务注册方面,其网络服务架构在数据库并没有变化。在以前的版本中,服务注册是通过PMON进程来完成。现在 由LREG(listener registration)来处理。LREG 是一个实例级别的后台进程并且是非常重要, 一旦该进程被杀掉,将导致数据库实例崩,它会 做一切 PMON 过去在实例注册的方面执行的,例如:在监听日志 listener.log 里 service_update, service_register, service_died 。

      由于工作被专属化,这里我们可以更清晰的了解其工作的过程,例如每3秒一次的监测,每60秒一次的尝试注册等,都可以清楚的看到。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI