Oracle启动数据库过程中实例与线程思考
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle启动数据库过程中实例与线程思考相关的知识,希望对你有一定的参考价值。
早期用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 个处理程序...
数据库关闭,卸载实例,终止实例,几种参数关闭方式需求不同,应用场合不同,但是最后整体一个关闭过程大同小异,希望也能学习到关于关闭数据库时候线程的动作。
以上是关于Oracle启动数据库过程中实例与线程思考的主要内容,如果未能解决你的问题,请参考以下文章