linux、oracle启动的全过程
时间:2011-01-23 来源:suangtooral
linux、oracle启动的全过程
一、oracle安装在linux上,作为linux上的一个软件。先从linux启动过程说。
其实,linux也是一个软件,oracle也是,其启动的过程都有共同性。
以下简单说明linux启动过程:
1、 BIOS自检
2、 运行系统内核并检测硬件
3、 运行系统的第一个进程init
4、 init读取系统引导配置文件/etc/inittab中的信息进行初始化
/etc/rc.d/rc.sysinit------系统初始化脚本
/etc/rc.d/rcX.d/[KS]*------根据运行级别配置服务
/etc/rc.d/rc.local---------执行本地特殊配置
其它---------不同运行级别的特殊服务
二、重点说明oracle的启动过程:以下通过三个启动步骤做例。
1、当启动oracle的时候:oracle首先通过spfile定义的参数进行创建实例的过程。(nomount启动)
1)、当执行startup命令时,操作系统与oracle软件进行交互,linux系统首先从oracle的环境变量(所谓环境变量,我认为就是一个寻址过程。)配置中读取一些环境变量参数,找到oracle的各个地址(即ORACLE_HOME,ORACLE_SID等),然后再返回给oracle软件。
此处,linux找到环境变量后,根据 tom的官方解释是:
通过环境变量,ORACLE_SID(此处原文是SID,但观看小布视频,他解释是ORACLE_SID,经过分析,此处应该是指ORACLE_SID)与ORACLE_HOME,在linux操作系统上hash成一个unique key,作为连接sga的标识。如果ORACLE_SID,ORACLE_HOME 设置错误,则无法启动实例。
2)、oracle软件根据ORACLE_HOME,ORACLE_SID找到spfile,开始启动,分配内存。
此处的spfile文件名,即为spfile+oracle_sid.ora,所以此处就是通过ORACLE_SID找到启动参数文件的。
[oracle@mylinux dbs]$ ls
hc_uangle.dat initdw.ora init.ora lkUANGLE orapwuangle spfileuangle.ora
SQL> startup nomount;
ORACLE instance started.
创建实例的过程即是分配内存的过程。
Total System Global Area 507510784 bytes
Fixed Size 1220264 bytes
Variable Size 159383896 bytes
Database Buffers 343932928 bytes
Redo Buffers 2973696 bytes
本机的oracle环境变量为:
SQL> !env |grep ORA
ORACLE_SID=uangle-----指定ORACLE_SID
ORACLE_BASE=/u01------指定ORACLE软件基目录
ORACLE_HOME=/u01/oracle----指定oracle数据库的安装目录
此时,后台进程也已启动。
[oracle@mylinux ~]$ ps -ef|grep oracle
oracle 24863 1 0 16:39 ? 00:00:00 ora_pmon_uangle
oracle 24865 1 0 16:39 ? 00:00:00 ora_psp0_uangle
oracle 24867 1 0 16:39 ? 00:00:00 ora_mman_uangle
oracle 24869 1 0 16:39 ? 00:00:00 ora_dbw0_uangle
oracle 24871 1 0 16:39 ? 00:00:00 ora_lgwr_uangle
oracle 24873 1 0 16:39 ? 00:00:00 ora_ckpt_uangle
oracle 24875 1 0 16:39 ? 00:00:00 ora_smon_uangle
oracle 24877 1 0 16:39 ? 00:00:00 ora_reco_uangle
oracle 24879 1 0 16:39 ? 00:00:00 ora_cjq0_uangle
oracle 24881 1 0 16:39 ? 00:00:00 ora_mmon_uangle
oracle 24883 1 0 16:39 ? 00:00:00 ora_mmnl_uangle
oracle 24885 1 0 16:39 ? 00:00:00 ora_d000_uangle
oracle 24887 1 0 16:39 ? 00:00:00 ora_s000_uangle
3)、这里要讨论的一个问题是:SID与ORACLE_SID的区别;
(1)、其实很简单,SID(system identifier)是操作系统(即linux层面)的标识符;ORACLE_SID是oracle软件层面的标识符。
(2)、当oracle实例启动时,linux操作系统就是通过ORACLE_SID来创建操作系统的进程。(即sid fork from oracle_sid)。
那么,如何去证明sid fork from oracle_sid呢?
我们从上startup nomount的过程来说。
instance启动,分配内存以及创建后台进程,而后台进程的工作就是oracle与操作系统之间的通信。由此可见,实例化后,通过backgroud process与OS通信,系统层面的SID即生成了。
关于SID与ORACLE_SID,请阅读eygle的理解,我很欣赏盖国强先生,还有些崇拜,哈哈:http://www.eygle.com/archives/2007/08/stepbs_oracle_chp1_04.html
(3)、此时,又衍生出一个新话题:linux与windows的进程,线程
linux:多进程
windows:单进程,多线程
先从linux上分析,因为是多进程,所以一个实例即一个进程,多个实例(例如:RAC)就是多个进程,一个进程对应着一块内存sga,多个进程就是多块了。
从操作系统上查看
[oracle@mylinux ~]$ ps -ef|grep oracle
root 24921 24889 0 16:41 pts/1 00:00:00 su - oracle
oracle 24922 24921 0 16:41 pts/1 00:00:00 -bash
oracle 24955 24954 0 16:42 ? 00:00:00 oracleuangle (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
是否可以想象,如果是多实例情况下,我ps后有多个进程。即oracleuangle,oracleuangleXXX
再从windows下分析。我本机未安装oracle,但我记忆中,从任务管理器中,只有一个oracle.exe进程,即使此时你在windows下安装的是rac。也就是说在windows下没有“共享内存”的概念,因为本来就是共享内存。
第一个过程之后,就没linux什么事了。
2、启动到mount状态:
SQL> alter database mount;
Database altered.
这时候的几个过程是:
1)、在参数文件中找到控制文件control file
2)、然后在确认数据文件的存在
3、启动到open状态
最后数据库open
SQL> alter database open;
Database altered.
参考:
1、小布视频
2、eygle书籍---深入解析一书
3、网络
这个总结足足写了四个小时,反复看视频,反复查找资料,因为知识面不广,所以写了改,改了些,最后不知道自己写了什么。
我试图用自己的话,全面地在脑子里过了N遍。
最后总结如上。
希望能与你沟通,感谢提出我的问题所在。