To prove what you have said when you were young! ——Alexy Young

Follow Your Heart

PM/ACP/PRINCE2……

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、ORACLE结构
在前一篇BLOG中已经说明了ORACLE的基本结构和组成,这一篇来说明ORACLE的启动过程情况。

这一张图很经典。这张图完整的介绍了数据库启动的过程。
Oracle数据库实例的启动,基本分为ORACLE INSTANCE启动+ORACLE DATABASE LOAD.ORACLE的启动可以划分为如上图的几种模式

二、ORACLE的启动过程说明
启动命令:starup [force][restrict] [pfile=...] [nomount] [mount] [open]
启动过程:nomount ---> mount ---> open
2.1、实例启动到nomount阶段

startup nomount;

SQL> show user
USER is "SYS"
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  218103808 bytes
Fixed Size            1218604 bytes
Variable Size           71305172 bytes
Database Buffers      142606336 bytes
Redo Buffers            2973696 bytes
SQL> select status from v$instance;
STATUS
------------
STARTED
SQL> 

启动过程中,告警日志记录的启动信息如下:

[oracle@ocmserver bdump]$ more alert_ocm.log 
Mon Jul  1 22:26:27 2013
Starting ORACLE instance (normal)        -----启动为normal,说明是startup normal;如果是force启动,则会在这条信息之前加入如下信息

Mon Jul 1 22:28:47 2013
Shutting down instance (abort)
License high water mark = 2
Instance terminated by USER, pid = 6058
Mon Jul 1 22:28:49 2013

-------------------------------------------------------------------
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Picked latch-free SCN scheme 2
Using LOG_ARCHIVE_DEST_10 parameter default value as USE_DB_RECOVERY_FILE_DEST
Autotune of undo retention is turned on. 
IMODE=BR
ILAT =18
LICENSE_MAX_USERS = 0
SYS auditing is disabled
ksdpec: called for event 13740 prior to event group initialization
Starting up ORACLE RDBMS Version: 10.2.0.1.0.
System parameters with non-default values:
  processes                = 150
  __shared_pool_size       = 62914560
  __large_pool_size        = 4194304
  __java_pool_size         = 4194304
  __streams_pool_size      = 0
  sga_target               = 218103808
  control_files            = /opt/oracle/oradata/ocm/control01.ctl, /opt/oracle/oradata/ocm/control02.ctl, /opt/oracle/oradata/ocm/control03.ctl
  db_block_size            = 8192
  __db_cache_size          = 142606336
  compatible               = 10.2.0.1.0
  db_file_multiblock_read_count= 16
  db_recovery_file_dest    = /opt/oracle/flash_recovery_area
  db_recovery_file_dest_size= 2147483648
  undo_management          = AUTO
  undo_tablespace          = UNDOTBS1
  remote_login_passwordfile= EXCLUSIVE
  db_domain                = 
  dispatchers              = (PROTOCOL=TCP) (SERVICE=ocmXDB)
  job_queue_processes      = 10
  background_dump_dest     = /opt/oracle/admin/ocm/bdump
  user_dump_dest           = /opt/oracle/admin/ocm/udump
  core_dump_dest           = /opt/oracle/admin/ocm/cdump
  audit_file_dest          = /opt/oracle/admin/ocm/adump
  db_name                  = ocm
  open_cursors             = 300
  pga_aggregate_target     = 71303168
PMON started with pid=2, OS id=5983
PSP0 started with pid=3, OS id=5985
MMAN started with pid=4, OS id=5987
DBW0 started with pid=5, OS id=5989
LGWR started with pid=6, OS id=5991
CKPT started with pid=7, OS id=5993
SMON started with pid=8, OS id=5995
CJQ0 started with pid=10, OS id=5999
RECO started with pid=9, OS id=5997
MMON started with pid=11, OS id=6001
Mon Jul  1 22:26:28 2013
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
MMNL started with pid=12, OS id=6003
Mon Jul  1 22:26:28 2013
starting up 1 shared server(s) ...

2.2、ORACLE的幕后工作
实例启动的时候,我们发现没有做太多的选择和事情。但实际上ORACLE按照如下逻辑做了很多幕后工作:

1)搜寻参数文件,一般顺序为spfile<sid>.ora -->spfile.ora -->init<sid>.ora
2)分配SGA大小,见上例
3)启动后台日志
4)开启告警追踪日志等信息

小实验:如果init<sid>.ora不存在(手动删除initmydb.ora)

SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/oracle/product/dbs/initocm.ora'
SQL> startup nomount spfile='/opt/oracle/product/dbs/spfilemydb.ora';
SP2-0714: invalid combination of STARTUP options
SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/oracle/product/dbs/initocm.ora'
SQL> startup nomount pfile='/opt/oracle/product/dbs/initmydb.ora';
ORACLE instance started.

Total System Global Area  218103808 bytes
Fixed Size            1218604 bytes
Variable Size           71305172 bytes
Database Buffers      142606336 bytes
Redo Buffers            2973696 bytes
SQL> alter database mount;
Database altered.

SQL> alter database open;
Database altered.
SQL> 
SQL> ! more /opt/oracle/product/dbs/initmydb.ora
*.spfile='/opt/oracle/product/dbs/spfilemydb.ora'

SQL> create spfile from pfile='/opt/oracle/product/dbs/initmydb.ora';
File created.

SQL> show parameter spfile;
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
spfile                     string     /opt/oracle/product/dbs/spfile
                         mydb.ora
SQL> 

通过上面例子我们发现无法通过startup nomount spfile='/opt/oracle/product/dbs/spfilemydb.ora'启动。
但是却可以通过startup nomount pfile='/opt/oracle/product/dbs/initmydb.ora'启动起来。这是一个必须理解和记住的地方。其中initmydb.ora只相当于做了一个连接而已。

2.3、启动到mount阶段
alter database mount;
由上图可以指导mount过程主要做如下事项:
1)启动实例并打开控制文件,将数据库与实例关联起来
2)利用参数文件中的说明,打开并锁定控制文件
3)读取控制文件以获取数据文件和重做日志文件的名字和状态信息,但不检查数据日志文件是否存在
这一部主要是和控制文件相关,如果控制文件不存在,或者控制文件信息和之前不一致,则需要回复或者取舍(丢失数据,还是启动数据库)。在控制文件实验一节已经说明。
在这一个mount阶段,无法将数据退回到nomount状态

SQL> alter database mount;
Database altered.
SQL> alter database nomount;
alter database nomount
                     *
ERROR at line 1:
ORA-02231: missing or invalid option to ALTER DATABASE

SQL> alter database nomount;
alter database nomount
                     *
ERROR at line 1:
ORA-02231: missing or invalid option to ALTER DATABASE
SQL> 

可以用dismount参数,但是dismount后却无法再mount数据了

SQL> STARTUP MOUNT;
ORACLE instance started.

Total System Global Area  218103808 bytes
Fixed Size            1218604 bytes
Variable Size           71305172 bytes
Database Buffers      142606336 bytes
Redo Buffers            2973696 bytes
Database mounted.
SQL> ALTER DATABASE DISMOUNT;

Database altered.

SQL> ALTER DATABASE MOUNT;
ALTER DATABASE MOUNT
*
ERROR at line 1:
ORA-00750: database has been previously mounted and dismounted


SQL> 

4)可以直接启动到mount状态

SQL> startup mount;
ORACLE instance started.

Total System Global Area 218103808 bytes
Fixed Size     1218604 bytes
Variable Size     71305172 bytes
Database Buffers     142606336 bytes
Redo Buffers     2973696 bytes
Database mounted.
SQL>

3、open阶段
alter database open;
由上图可以看出来,这个阶段主要是oracle database的工作,而这个工作信息是从controlfile里面读取出来的。打开数据库文件,REDO LOG文件及Archive Log文件等。在这个过程中会做如下信息检查来维持RDBMS所必须遵从的ACID属性:

  • Oracle服务器将校验所偶的数据文件和联机日志文件能否打开并对数据库作一致性检查
  • 如出现一致性错误,SMON进程将启动实例恢复
  • 如任一数据文件或联机日志文件丢失,Oracle服务器将报错

在这个过程也无法回到nomount阶段

SQL> alter database nomount;
alter database nomount
                     *
ERROR at line 1:
ORA-02231: missing or invalid option to ALTER DATABASE
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01100: database already mounted
SQL>

但是缺可以close,甚至是dismount;

SQL> alter database close;
Database altered.
SQL> alter database dismount;
Database altered.
SQL> 
这样的过程无法反复,即:
变成close后,无法再open;
变成dismount后,无法再mount;

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-16196: database has been previously opened and closed

SQL>

alter database close的日志信息如下:

alter database close
Mon Jul  1 22:47:16 2013
Stopping background process CJQ0
Mon Jul  1 22:47:16 2013
SMON: disabling tx recovery
Mon Jul  1 22:47:16 2013
Stopping background process QMNC
Mon Jul  1 22:47:21 2013
Stopping Job queue slave processes
Mon Jul  1 22:47:24 2013
Waiting for Job queue slaves to complete
Mon Jul  1 22:48:03 2013
Job queue slave processes stopped
Mon Jul  1 22:48:03 2013
SMON: disabling cache recovery
Mon Jul  1 22:48:03 2013
Shutting down archive processes
Archiving is disabled
Archive process shutdown avoided: 0 active
Thread 1 closed at log sequence 3
Successful close of redo thread 1
Mon Jul  1 22:48:03 2013
Completed: alter database close

4、其他方式打开数据库

4.1 Read only模式打开数据库

startup open read only;
or
alter database open read only;

SQL> alter database open read only;
Database altered.
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL>
SQL> create table t1(name char(20));
create table t1(name char(20))
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access

SQL> 

4.2 restrict模式

SQL> startup restrict;
ORACLE instance started.

Total System Global Area 218103808 bytes
Fixed Size     1218604 bytes
Variable Size     71305172 bytes
Database Buffers     142606336 bytes
Redo Buffers     2973696 bytes
Database mounted.
Database opened.
SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> 

5、oracle正常启动的日志简单分析


SQL> show parameter background_dump

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /opt/oracle/admin/ocm/bdump
SQL>

[oracle@ocmserver bdump]$ more alert_ocm.log 
Mon Jul  1 22:23:18 2013
Starting ORACLE instance (normal)          -----可以看出来是正常启动,normal一般是没有带参数。
LICENSE_MAX_SESSION = 0                    ----如下开始读参数文件,控制文件内的相关信息
LICENSE_SESSIONS_WARNING = 0
Picked latch-free SCN scheme 2
Using LOG_ARCHIVE_DEST_10 parameter default value as USE_DB_RECOVERY_FILE_DEST
Autotune of undo retention is turned on. 
IMODE=BR
ILAT =18
LICENSE_MAX_USERS = 0
SYS auditing is disabled
ksdpec: called for event 13740 prior to event group initialization
Starting up ORACLE RDBMS Version: 10.2.0.1.0.
System parameters with non-default values:
  processes                = 150
  __shared_pool_size       = 62914560
  __large_pool_size        = 4194304
  __java_pool_size         = 4194304
  __streams_pool_size      = 0
  sga_target               = 218103808
  control_files            = /opt/oracle/oradata/ocm/control01.ctl, /opt/oracle/oradata/ocm/control02.ctl, /opt/oracle/oradata/ocm/control03.ctl
  db_block_size            = 8192
  __db_cache_size          = 142606336
  compatible               = 10.2.0.1.0
  db_file_multiblock_read_count= 16
  db_recovery_file_dest    = /opt/oracle/flash_recovery_area
  db_recovery_file_dest_size= 2147483648
  undo_management          = AUTO
  undo_tablespace          = UNDOTBS1
  remote_login_passwordfile= EXCLUSIVE
  db_domain                = 
  dispatchers              = (PROTOCOL=TCP) (SERVICE=ocmXDB)
  job_queue_processes      = 10
  background_dump_dest     = /opt/oracle/admin/ocm/bdump
  user_dump_dest           = /opt/oracle/admin/ocm/udump
  core_dump_dest           = /opt/oracle/admin/ocm/cdump
  audit_file_dest          = /opt/oracle/admin/ocm/adump
  db_name                  = ocm
  open_cursors             = 300
  pga_aggregate_target     = 71303168
PMON started with pid=2, OS id=5838             -----开始启动后台进程。
PSP0 started with pid=3, OS id=5840
MMAN started with pid=4, OS id=5842
DBW0 started with pid=5, OS id=5844
LGWR started with pid=6, OS id=5846
CKPT started with pid=7, OS id=5848
SMON started with pid=8, OS id=5850
RECO started with pid=9, OS id=5852
CJQ0 started with pid=10, OS id=5854
MMON started with pid=11, OS id=5856
Mon Jul  1 22:23:19 2013
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
MMNL started with pid=12, OS id=5858
Mon Jul  1 22:23:19 2013
starting up 1 shared server(s) ...
Mon Jul  1 22:23:19 2013
ALTER DATABASE   MOUNT                               -----启动到mount状态;
Mon Jul  1 22:23:23 2013
Setting recovery target incarnation to 2
Mon Jul  1 22:23:23 2013
Successful mount of redo thread 1, with mount id 2202287127          ----挂载redo成功;
Mon Jul  1 22:23:23 2013
Database mounted in Exclusive Mode                      -----数据库挂载为排他模式;
Completed: ALTER DATABASE   MOUNT
Mon Jul  1 22:23:24 2013 
ALTER DATABASE OPEN                                      -----打开数据库
Mon Jul  1 22:23:24 2013
Thread 1 opened at log sequence 2
  Current log# 1 seq# 2 mem# 0: /opt/oracle/oradata/ocm/redo01.log
Successful open of redo thread 1
Mon Jul  1 22:23:24 2013
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Mon Jul  1 22:23:24 2013
SMON: enabling cache recovery
Mon Jul  1 22:23:24 2013
Successfully onlined Undo Tablespace 1.                 -----undo表空间online成功;
Mon Jul  1 22:23:24 2013
SMON: enabling tx recovery
Mon Jul  1 22:23:24 2013
Database Characterset is AL32UTF8
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
QMNC started with pid=16, OS id=5866
Mon Jul  1 22:23:25 2013
db_recovery_file_dest_size of 2048 MB is 0.00% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
Mon Jul  1 22:23:27 2013
Completed: ALTER DATABASE OPEN                                  -----启动完成;
[oracle@ocmserver bdump]$ 

三、ORACLE的关闭

1、关闭命令

shutdowm abort | immediate | transactional | normal (缺省)

2、关闭命令解释

normal            --->不准许新的连接,等待当前的session 结束,等待当前的事务结束,强制检查点并关闭文件
transactional    --->不准许新的连接,不等待当前的session结束,等待当前的事务结束,强制检查点并关闭文件。
immediate        --->不准许新的连接,不等待当前的session结束,不等待当前的事务结束,强制检查点并关闭文件。
abort               --->不准许新的连接,不等待当前的session结束,不等待当前的事务结束,不作强制检查点。

3、ORACLE关闭过程见如下log日志信息

[oracle@ocmserver bdump]$ more alert_ocm.log 
Mon Jul  1 22:18:00 2013
Starting background process EMN0
EMN0 started with pid=21, OS id=5659
Mon Jul  1 22:18:00 2013
Shutting down instance: further logons disabled         ----正常关闭,后续登陆被禁止;
Mon Jul  1 22:18:01 2013
Stopping background process CJQ0                  ------停止CJQ0进程;
Mon Jul  1 22:18:01 2013
Stopping background process QMNC
Mon Jul  1 22:18:02 2013
Stopping background process MMNL
Mon Jul  1 22:18:02 2013
Stopping background process MMON
Mon Jul  1 22:18:02 2013
Shutting down instance (immediate)
License high water mark = 6
Mon Jul  1 22:18:02 2013
Stopping Job queue slave processes       
Mon Jul  1 22:18:02 2013
Job queue slave processes stopped
All dispatchers and shared servers shutdown
Mon Jul  1 22:18:04 2013
ALTER DATABASE CLOSE NORMAL                    -------数据库正常关闭;
Mon Jul  1 22:18:04 2013
SMON: disabling tx recovery
SMON: disabling cache recovery
Mon Jul  1 22:18:05 2013
Shutting down archive processes                ----关闭归档
Archiving is disabled
Archive process shutdown avoided: 0 active
Thread 1 closed at log sequence 2
Successful close of redo thread 1
Mon Jul  1 22:18:05 2013
Completed: ALTER DATABASE CLOSE NORMAL              -----DATABASE关闭完成;
Mon Jul  1 22:18:05 2013
ALTER DATABASE DISMOUNT                             -----卸载
Completed: ALTER DATABASE DISMOUNT
ARCH: Archival disabled due to shutdown: 1089
Shutting down archive processes                      ----停止归档进程;
Archiving is disabled
Archive process shutdown avoided: 0 active
ARCH: Archival disabled due to shutdown: 1089
Shutting down archive processes
Archiving is disabled
Archive process shutdown avoided: 0 active
[oracle@ocmserver bdump]$ 

四、小结

  以上为正常的启动和关闭ORACLE的一些简单分析,从官网上找了个图片。深入理解这些启动过程有助于对问题的深入分析和理解,在遇到问题的时能迅速定位并解决问题。

  我们常用的查看日志,跟踪文件及转储文件等。后续继续努力学习转储文件,跟踪文件的使用。如下为启动、关闭过程中常用视图,留存后查;

v$datafile;
v$controlfile;
v$logfile;
v$log;
v$sql
v$session
v$lock
v$insance;
show parameter background_dump_dest
select FILE#,STATUS,ENABLED,CHECKPOINT_CHANGE#,CHECKPOINT_TIME,ONLINE_TIME,NAME from v$datafile;
posted on 2013-07-01 22:40  Alexy Young  阅读(1482)  评论(0编辑  收藏  举报

Alexy Young CHASEDREAM