Oracle启动数据库过程中实例与线程思考

发布时间:2020-07-25 18:01:23 作者:长路慢
来源:网络 阅读:831

    早期用Linux的时候,看Oracle监听状态和端口只是浏览一下,没有认真看过内容也是英文提示,时隔数载重新捡起Oracle,Windos下CMD查看监听状态发现很多有意思的问题,Oracle实例和线程很多不懂之处请高手指点


    首先Oracle启动阶段nomount,mount,open(其余不作啰嗦)每一个阶段都做了测试和总结

    1、数据库关闭阶段(实例状态)

        服务 "CLRExtProc" 包含 1 个实例。

          实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序.

      已连接到空闲例程。

      登录之后已连接空闲进程,而且状态未知的,后期查阅资料才知道UNKNOWN状态非自动注册,通过搜索Listener.org里面内容,匹配services之后才进行的注册,在这个文件中不需要配置SID,PMON会自动检测,因为数据库没有启动,所以空闲进程。

           2、nomount阶段             

            SQL> startup nomount;

                ORACLE 例程已经启动。

                Total System Global Area 1686925312 bytes

                Fixed Size                  2176368 bytes

                Variable Size            1090521744 bytes

                Database Buffers          587202560 bytes

                Redo Buffers                7024640 bytes


          可见数据库大小,变量缓冲区等资源已经启动。我们测试查询一下v$datafile,v$controlfile,v$database. 


            SQL> select file#,name from v$datafile;

                 select file#,name from v$datafile

                       *

                第 1 行出现错误:ORA-01507: ??????

            

            SQL> select name from v$controlfile;

                未选定行


      查询看到nomount阶段没有加载数据文件,可以检测SGA相关。 

       

      监听状态查看(实例)

            服务 "soujiusubdb" 包含 1 个实例。

              实例 "soujiusubdb", 状态 BLOCKED, 包含此服务的 1 个处理程序...


        引用:这时候实例已经启动,BLOCKED阻塞的状态,那么Oracle实例应该是操作系统中线程运行,OS阻塞用pritive调用原子操作,由于某事件无法运行,受阻塞。但是nomount阶段多数讲解:只会创建实例,并不加载数据库,Oracle仅为实例创建各种内存结构和服务进程,不会打开任何数据文件。在NoMount模式下,只能访问那些与SGA区相关的数据字典视图,包括V$PARAMETER、V$SGA、V$PROCESS 和 V$SESSION等,这些视图中的信息都是从SGA区中获取的,与数据库无关,系统分配内存、开启后台进程,同时更新alter日志文件。


      那么在操作系统的层面是否能这样理解,通过Oracle的nomount命令来创建实例,这时候操作系统会给分配进程或线程去响应请求,Oracle为实例创建内存结构和服务进程,也就是实例具备了必要资源分配,那么此时的线程的状态应该为就绪状态(除了得到CUP之外的资源,获得处理机即可运行),插入就绪队列,但是监听状态为阻塞,也就意味着nomount状态下,实例线程在就绪队列被挂起,不释放CUP(实例当前应该没有获取CPU),调用suspend原子操作,静止就绪(不接受调度)nomount是主动而非被动去阻塞。


      3、mount阶段

                       我们这时候去查看数据文件,日志文件,控制文件都是正常,查看监听实例,这时候实例状态变成了Ready(就绪状态),也就是Oracle在执行mount时候时候调用原语active来唤醒实例线程,变成活动就绪状态。  

                服务 "CLRExtProc" 包含 1 个实例。

                  实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

                服务 "soujiusubdb" 包含 1 个实例。

                  实例 "soujiusubdb", 状态 READY, 包含此服务的 1 个处理程序...


         引用这种启动模式将为实例加载数据库,但保持数据库为关闭状态。因为加载数据库时需要打开数据库控制文件,但数据文件和重做日志文件都都无法进行读写,所以用户还无法对数据库进行操作。 在Mount模式下,只能访问那些与控制文件相关的数据字典视图,包括V$THREAD、V$CONTROLFILE、V$DATABASE、V$DATAFILE 和 V$LOGFILE等,这些视图都是从控制文件中获取的。 启动条件是需要有控制文件,如果控制文件丢失或者损坏,启动将会报错。此时系统会打开控制文件、检查数据文件、日志文件的名称和位置,但此时不检查文件到底是否存在不存在。


       4、open阶段

         引用:open阶段,该阶段主要是打开数据文件、日志文件,在打开的过程中对数据文件和日志文件进行一致性检查,如果不一致,则SMON进程继续实例恢复,如果文件丢失,打开失败。

         我本以为在此阶段实例状态会就绪变成执行状态,变更open阶段之后,查看监听后发现多出一个服务,但是实例名一样,状态也一样,仍然为就绪状态,Oracle实例线程一直处于就绪状态这一点还没有搞清楚,希望老师们给予解答,解析迷惑。

     

                服务摘要..

                    服务 "CLRExtProc" 包含 1 个实例。

                      实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

                    服务 "SOUJIUSUBDBXDB" 包含 1 个实例。

                      实例 "soujiusubdb", 状态 READY, 包含此服务的 1 个处理程序...

                    服务 "soujiusubdb" 包含 1 个实例。

                      实例 "soujiusubdb", 状态 READY, 包含此服务的 1 个处理程序...


        数据库关闭,卸载实例,终止实例,几种参数关闭方式需求不同,应用场合不同,但是最后整体一个关闭过程大同小异,希望也能学习到关于关闭数据库时候线程的动作。

        

               

                


推荐阅读:
  1. Oracle数据库如何启动与关闭
  2. 关于ORACLE实例启动报错的问题

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

线程进程 oracle 基础

上一篇:STL中空间配置器(allocator)的简单实现

下一篇:C# Winform TreeView CheckBox 部分显示(代码)

相关阅读

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

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