符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
因刚好遇到12c 监听注册的问题,现将以前关于oracle 12c lreg进程的一些学习文章分享下:
创新互联是专业的台前网站建设公司,台前接单;提供网站设计制作、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行台前网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!在 oracle 数据库中 pmon 进程一直承担着较多的工作,例如清理进程以及监听注册等 , 这相当于一个人需要同时做好几件工作, 而当其中一件让他应接不暇时,也许这会影响它负责的其他工作,曾经在 11g r2 版本的数据库遇到过 pmon 进程因忙于清理异常中断的会话而导致服务更新 和服 务 注册出现异常的情况。
在 oracle12c 以前的版本中服务注册一直都是由 PMON 进程负责 , 从 12c 起 oracle 引入了 LREG (listener registration) 后台进程接管了这部分工作从而减轻 PMON 的工作。
一. Oracle 监听及服务注册:
在 Oracle 中,监听器是一个监测连入客户端连接请求并建立和管理会话的服务器端进程。这在当数据库实例启动后不同时间里,数据库实例与监听器联系并建立了一条到该实例的通信路径。
服务注册让监听器能够确定数据库服务及其 service handlers (服务处理程序)是否可用。在注册期间,服务注册进程向 listener 提供实例名称,数据库服务名称以及 service handlers 的类型 ( 专用或共享 ) 和地址。
在 oracle 12c 以前,负责服务注册的是 pmon 进程:
而在 12c 以后,负责服务注册的换成了 LREG 进程:
监听没有启动 LREG 进程不能注册服务 , 但是 LREG 进程会定时尝试注册 , 如果 local_listener 没有配置 ,LREG 会尝试连接默认的 1521 端口 , 直到监听进程启动 , 在监听启动后 LREG 进行周期注册前 , 同样也可以使用 ”alter system register” 立即注册服务 .litener 的注册信息。实际这个过程是动态注册的过程。
另一个需要注意的是如果 LREG 进程死了,会同样和 pmon 一样,数据库实例也会 crash 。 12c 直接报出的 ora-500,ora-500 则是监听注册进程死掉。
二.动态注册的工作过程研究:
1. 使用 oradebug Event 10257 trace name context forever, level 1 6 来将 lreg dump 出来。可以初步看出 lreg 的工作过程:
从 dump 出来的信息可以看出, lreg 进程每 3 秒更新一次状态,而到约每 60 秒时便会实例信息进行注册。以下在监听没有启动的情况下, LREG woken up to process network events after 0 cs 之后成功的数量依然为 0 ,说明此时无法注册成功。
而当将监听启动后,在 60 秒后的下一个注册是便可以成功注册。
2. 使用 strace 追踪 lreg 进程的工作过程
当数据库运作时其背后发生了很多事,数据库也是一个应用软件,其背后的这一切都可以追溯到操作系统的工作原理。 在对 lreg 进程进行追踪可能需要先了解 orcle 监听动态注册中的两个概念:文件描述符和 Sockets 文件 。
当监听进程启动时,它会在 /var/tmp/.oracle 下创建两个套接字文件。
这些文件均是 socket 文件, 且 s#12214.1 中的 12214 为进程号,则应为监听的进程号,这些 socket 文被用作本地客户端使用进程间通信协议( ipc )和不同的 oracle 的进程通信,而这些进程包括: tns 监听, css , crs , evm 守护进程;甚至数据库和 asm 实例。这些 socket 由 ‘ 主动监听 ’ 的进程创建。在这里 oracle 监听创建这些 socket 文件主要使用用作 lreg 和 tnslsnr 通信。
同时,会在 /proc 目录下相应进程号文件下创建几个文件描述符,这些文件描述符( file descriptor )是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行 I/O 操作的系统调用都通过文件描述符。
我 们 可以看到有几个文件描述符,因此,确定有 为进 程 创 建的文件描述符和 sockets 。
那么 LREG 过程(以前的版本 PMON ) 进 行的 动态 注册与文件描述符和 sockets 文件相关的 过 程是怎 样 的呢?
这些进程通过系统调用来查看监听器是否启动,如果没有发现监听进程,则等待,并且在 3000 毫秒之后重新 尝试 。直到 监 听启 动时 ,文件描述符被 监 听打开,并被 进 程 绑 定以建立彼此之 间 的 连 接。
要找到 LREG 进 程正在做什么,我使用 STRACE OS 实 用程序来跟踪它的工作。 11g 中的 PMON 进 程的 输 出不是完全相同的,因 为 它不是一个 专门 用于在 监 听器中注册 实 例的 过 程。另一方面, LREG 的唯一目的就是 动态 注册, 这样 可以解 释 两个 进 程之 间 使用的系 统调 用之 间 的差异。
以下是 STRACE LREG 进程的日志:
从以上 strace 日志可以看到主要调用 epoll_wait() 函数 , 该 函数表示通 过 文件描述符来等待某个 I/O 事件发生的 时间 。 实际 上 这 就是一个持 续 等待某个 IO 事件的 发 生,而表 现 到数据 库层 面, 应该 就可以理解 为监视监听进程是否启动的过程,在 epoll_wait(7, {}, 1024, 3000) 的最后一个 参数 显 示的 时间 以毫秒 3000 毫秒 为单 位(也就是 3 秒)。
关于epoll_wait的解释:
接下来的两行 getrusage ()函数表示 资 源使用消耗,而后面 times() 为 时间 函数返回 时间 ,在前面的 时间 打印很明 显 可以看出是每 3 秒 执 行一次函数。
再继续往下看是 socket 函数其后面的值为 10 ,表示使用一个 socket 函数来处理文件描述符 10 。猜测这是用来与监听器进程建立连接的文件描述符。这里使用的套接字是 NETLINK ,用于创建内核和网络层之间的连接。
进一步查看下面的函数, 是对前面函数返回的文件描述符 10 进行尝试绑定。
在接下来的几行中,这个文件描述符将被用于与 PID 2582 的连接,而这个 PID 2582 是 LREG 进程的 PID 。
正在尝试与 IP 地址 127.0.0.1 建立 连 接,端口号是 1521 。
由于没有启动监听进程,并且还没有文件描述符 10 与进程 LREG 相关联,因此连接被拒绝,即也没有建立的连接。
而在启动监听之后, 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秒一次的尝试注册等,都可以清楚的看到。