oracle 数据库启动阶段分析
OracleServer主要由两部分组成:Instance和Database。Instance是指一组后台进程/线程和一块共享内存区域,而Database是指存储在磁盘上的一组物理文件。本文由数据库如何启动入手。
数据库的启动
首先来分析一下数据库的启动过程,Oracle数据库的启动主要包含3个步骤:
(1)启动数据库到nomount状态;
(2)启动数据库到mount状态;
(3)启动数据库到open状态。
下面逐个来看看各个步骤的具体过程以其含义。
1.启动数据库到nomount状态
在启动的第一步骤,Oracle首先寻找参数文件(pfile/spfile),然后根据参数文件中的设置,创建实例,分配内存,启动后台进程。
在这里可以看到,只要拥有了一个参数文件,就可以凭之启动实例(Instance),这一步骤并不需要任何控制文件或数据文件的参与。
在创建数据库时,如果在这一步骤就出现问题,那么通常可能是系统配置(内核参数等)存在问题,用户需要检查是否分配了足够的系统资源等。来看一下启动到nomount状态的过程:
[oracle@dbtestdbs]$cd$ORACLE_HOME/dbs [oracle@dbtestdbs]$ls hc_orcl.datinit.orainitorcl.oralkORCLorapworclspfileorcl.ora [oracle@dbtestdbs]$sqlplus/assysdba SQL*Plus:Release11.2.0.1.0ProductiononWedMay410:36:452016 Copyright(c)1982,2009,Oracle.Allrightsreserved. Connectedtoanidleinstance. SQL>startupnomount; ORACLEinstancestarted. TotalSystemGlobalArea1152450560bytes FixedSize2212696bytes VariableSize922750120bytes DatabaseBuffers218103808bytes RedoBuffers9383936bytes SQL>
注意这里,Oracle根据参数文件的内容,创建了instance,分配了相应的内存区域,启动了相应的后台进程。此时观察警报日志文件(alert_
Startingup: OracleDatabase11gEnterpriseEditionRelease11.2.0.1.0-64bitProduction WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions. Usingparametersettingsinserver-sidespfile/u01/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora Systemparameterswithnon-defaultvalues: processes=150 sga_target=176M memory_target=1104M memory_max_target=1104M control_files="/u01/app/oracle/oradata/orcl/control01.ctl" control_files="/u01/app/oracle/flash_recovery_area/orcl/control02.ctl" db_block_size=8192 compatible="11.2.0.0.0" db_recovery_file_dest="/u01/app/oracle/flash_recovery_area" db_recovery_file_dest_size=3882M undo_tablespace="UNDOTBS1" remote_login_passwordfile="EXCLUSIVE" db_domain="oracle.com" global_names=FALSE dispatchers="(PROTOCOL=TCP)(SERVICE=orclXDB)" shared_servers=5 audit_file_dest="/u01/app/oracle/admin/orcl/adump" audit_trail="DB" db_name="orcl" open_cursors=300 diagnostic_dest="/u01/app/oracle"
然后后台进程依次启动:
WedMay0410:36:552016 PMONstartedwithpid=2,OSid=3128 WedMay0410:36:552016 VKTMstartedwithpid=3,OSid=3132atelevatedpriority VKTMrunningat(10)millisecprecisionwithDBRMquantum(100)ms WedMay0410:36:552016 GEN0startedwithpid=4,OSid=3138 WedMay0410:36:552016 DIAGstartedwithpid=5,OSid=3142 WedMay0410:36:552016 DBRMstartedwithpid=6,OSid=3146 WedMay0410:36:552016 PSP0startedwithpid=7,OSid=3150 WedMay0410:36:552016 DIA0startedwithpid=8,OSid=3158 WedMay0410:36:552016 MMANstartedwithpid=9,OSid=3162 WedMay0410:36:552016 DBW0startedwithpid=10,OSid=3166 WedMay0410:36:552016 LGWRstartedwithpid=11,OSid=3170 WedMay0410:36:552016 CKPTstartedwithpid=12,OSid=3175 WedMay0410:36:552016 SMONstartedwithpid=13,OSid=3179 WedMay0410:36:552016 RECOstartedwithpid=14,OSid=3184 WedMay0410:36:552016 MMONstartedwithpid=15,OSid=3189 startingup1dispatcher(s)fornetworkaddress'(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'... WedMay0410:36:552016 MMNLstartedwithpid=16,OSid=3193 startingup5sharedserver(s)... ORACLE_BASEfromenvironment=/u01/app/oracle
这里注意一下Oracle选择参数文件的顺序:
Oracle首选spfile
用户可以在SQL*PLUS中通过showparameterspfile命令来检查数据库是否使用了spfile文件,如果value不为Null,则数据库使用了spfile文件:
SQL>showparameterspfile NAMETYPEVALUE ----------------------------------------------------------------------------- spfilestring/u01/app/oracle/product/11.2.0 /db_1/dbs/spfileorcl.ora SQL>
这时候也可以从操作系统查看启动了的后台进:
[root@dbtesttrace]#ps-ef|grepora_ oracle31281010:36?00:00:00ora_pmon_orcl oracle31321010:36?00:00:00ora_vktm_orcl oracle31381010:36?00:00:00ora_gen0_orcl oracle31421010:36?00:00:00ora_diag_orcl oracle31461010:36?00:00:00ora_dbrm_orcl oracle31501010:36?00:00:00ora_psp0_orcl oracle31581010:36?00:00:00ora_dia0_orcl oracle31621010:36?00:00:00ora_mman_orcl oracle31661010:36?00:00:00ora_dbw0_orcl oracle31701010:36?00:00:00ora_lgwr_orcl oracle31751010:36?00:00:00ora_ckpt_orcl oracle31791010:36?00:00:00ora_smon_orcl oracle31841010:36?00:00:00ora_reco_orcl oracle31891010:36?00:00:00ora_mmon_orcl oracle31931010:36?00:00:00ora_mmnl_orcl oracle31971010:36?00:00:00ora_d000_orcl oracle32011010:36?00:00:00ora_s000_orcl oracle32051010:36?00:00:00ora_s001_orcl oracle32091010:36?00:00:00ora_s002_orcl oracle32131010:36?00:00:00ora_s003_orcl oracle32171010:36?00:00:00ora_s004_orcl root33583253010:50pts/300:00:00grepora_
如果这3个文件都不存在,Oracle将无法启动:
[oracle@dbtestdbs]$mvinit.orainit.ora.bak [oracle@dbtestdbs]$mvinitorcl.orainitorcl.ora.bak [oracle@dbtestdbs]$mvspfileorcl.oraspfileorcl.ora.bak [oracle@dbtestdbs]$ls hc_orcl.datinit.ora.bakinitorcl.ora.baklkORCLorapworclspfileorcl.ora.bak [oracle@dbtestdbs]$sqlplus/assysdba SQL*Plus:Release11.2.0.1.0ProductiononWedMay410:55:422016 Copyright(c)1982,2009,Oracle.Allrightsreserved. Connectedtoanidleinstance. SQL>startupnomount; ORA-01078:failureinprocessingsystemparameters LRM-00109:couldnotopenparameterfile'/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora'
在Oracle整个启动过程中,参数文件是写在应用程序中的硬代码,按照如上顺序进行查找,不能改变Oracle的搜索路径及行为,但是如果参数文件不在相应的位置,在Linux/UNIX系统上,可以通过符号链接来进行重定位。
在参数文件中,通常需要最少的参数是db_name,设置了这个参数之后,数据库实例就可以启动,来看一个简单的测试:
SQL>!echo"db_name=julia">initorcl.ora SQL>startupnomount; ORACLEinstancestarted. TotalSystemGlobalArea217157632bytes FixedSize2211928bytes VariableSize159387560bytes DatabaseBuffers50331648bytes RedoBuffers5226496bytes
这样,就通过了最少的参数需求启动了Oracle实例。
2.启动数据库到mount状态
启动到nomount状态以后,Oracle就可以从参数文件中获得控制文件的位置信息,这一部分信息在参数文件中的记录类似如下所示(Oracle缺省会创建3个控制文件,这3个控制文件的内容完全一致,是Oracle为了安全而采用的镜像手段,在生产环境中,通常应该将3个控制文件存放在不同的物理硬盘上,避免因为介质故障而同时损坏3个控制文件):
SQL>showparametercontrol_files NAMETYPEVALUE ----------------------------------------------------------------------------- control_filesstring/u01/app/oracle/product/11.2.0 /db_1/dbs/cntrlorcl.dbf
在nomount状态,可以查询v$parameter视图,获得控制文件信息,这部分信息来自启动的参数文件;当数据库mount之后,可以查询v$controlfile视图获得关于控制文件的信息,此时,这部分信息来自控制文件:
[oracle@dbtestdbs]$mvinit.ora.bakinit.ora [oracle@dbtestdbs]$mvinitorcl.ora.bakinitorcl.ora [oracle@dbtestdbs]$mvspfileorcl.ora.bakspfileorcl.ora [oracle@dbtestdbs]$sqlplus/assysdba SQL*Plus:Release11.2.0.1.0ProductiononWedMay411:07:072016 Copyright(c)1982,2009,Oracle.Allrightsreserved. Connectedtoanidleinstance. SQL>startupnomount; ORACLEinstancestarted. TotalSystemGlobalArea1152450560bytes FixedSize2212696bytes VariableSize922750120bytes DatabaseBuffers218103808bytes RedoBuffers9383936bytes SQL>alterdatabasemount; Databasealtered. SQL>select*fromv$controlfile; STATUS ------- NAME -------------------------------------------------------------------------------- IS_BLOCK_SIZEFILE_SIZE_BLKS --------------------------- /u01/app/oracle/oradata/orcl/control01.ctl NO16384594 /u01/app/oracle/flash_recovery_area/orcl/control02.ctl NO16384594 STATUS ------- NAME -------------------------------------------------------------------------------- IS_BLOCK_SIZEFILE_SIZE_BLKS ---------------------------
在mount数据库的过程中,Oracle需要找到控制文件并锁定控制文件。如果控制文件全部丢失此时就会报出如下错误:
SQL>alterdatabasemount; alterdatabasemount * ERRORatline1: ORA-00205:errorinidentifyingcontrolfile,checkalertlogformoreinfo
这时候alert.log文件中通常会记录更为详细的信息。
因为Oracle的3个(缺省的)控制文件内容完全相同,如果只是损失了其中1~2个,可以复制完好的控制文件,更改为相应的名称,就可以启动数据库;如果丢失了所有的控制文件,那么就需要恢复或重建控制文件来打开数据库。
在正常Mount数据库的过程中,数据库的警报日志文件仅记录如下信息:
alterdatabasemount WedMay0411:07:442016 Successfulmountofredothread1,withmountid1438756220 DatabasemountedinExclusiveMode Lostwriteprotectiondisabled Completed:alterdatabasemount
在这一步骤中,数据库需要计算Mountid并将其记录在控制文件中,然后开始启动Heartbeat(心跳),每3秒更新一次控制文件。
启动到Mount状态,数据库必须具备的另外一个重要文件是口令文件,该文件位于$ORACLE_HOME/dbs目录下,缺省的名称为orapw。口令文件中存放sysdba/sysoper用户的用户名及口令:
[oracle@dbtestdbs]$stringsorapworcl ]\[Z ORACLERemotePasswordfile INTERNAL 769C0CD849F9B8B2 5638228DAF52805F [oracle@dbtestdbs]$
在数据库没有启动之前,数据库内建用户是无法通过数据库本身来验证身份的,通过口令文件,Oracle可以实现对用户的身份认证,在数据库未启动之前登录,进而启动数据库。对于口令文件,Oracle缺省查找orapw文件,如果该文件不存在,则继续查找orapw文件,如果两者都不存在,则数据库将会出现错误。
如果口令文件丢失,通过orapw工具即可重建,所以在通常的备份策略中可以不必包含口令文件:
[oracle@dbtestdbs]$orapwd Usage:orapwdfile=entries= force= ignorecase= nosysdba= where file-nameofpasswordfile(required), password-passwordforSYSwillbepromptedifnotspecifiedatcommandline, entries-maximumnumberofdistinctDBA(optional), force-whethertooverwriteexistingfile(optional), ignorecase-passwordsarecase-insensitive(optional), nosysdba-whethertoshutouttheSYSDBAlogon(optionalDatabaseVaultonly). Theremustbenospacesaroundtheequal-to(=)character. [oracle@dbtestdbs]$
通常在Linux/UNIX平台下,在$ORACLE_HOME/dbs目录下,还会存在另外一个文件,该文件命名规则为lk
3.启动数据库open阶段
由于控制文件中记录了数据库中数据文件、日志文件的位置信息、检查点信息等重要信息,所以在数据库的open阶段,Oracle可以根据控制文件中记录的这些信息找到这些文件,然后进行检查点及完整性检查。
如果不存在问题就可以启动数据库,如果存在不一致或文件丢失则需要进行恢复。
进一步地说,实际上在数据库open的过程中,Oracle进行的检查中包括以下两项:
第一次检查数据文件头中的检查点计数(Checkpointcnt)是否和控制文件中的检查点计数(Checkpointcnt)一致。此步骤检查用以确认数据文件是来自同一版本,而不是从备份中恢复而来(因为CheckpointCnt不会被冻结,会一直被修改)。下面通过一个简单的测试来说明一下CheckpointCnt的作用。
如果检查点计数检查通过,则数据库进行第二次检查。第二次检查数据文件头的开始SCN和控制文件中记录的该文件的结束SCN是否一致,如果控制文件中记录的结束SCN等于数据文件头的开始SCN,则不需要对那个文件进行恢复。
总结
以上就是本文关于oracle数据库启动阶段分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:Oracle创建带有参数的视图代码介绍 、Oracle分页查询性能优化代码详解 、oracle虚拟专用数据库详细介绍等,感谢大家对本站的支持。有什么问题可以随时留言,小编会竭尽所能给您想要的答案。