ORACLE啟動過程簡析

bitifi發表於2015-09-22
ORACLE資料庫啟動時,經歷了三個過程:(用命名如下)
startup  nomount;
alter database mount; alter database open;
當然資料庫關閉時也是經歷了三個相反的過程:
alter database  close;
alter  database   dismount;
shutdown;(shutdown  後面跟了四個引數:normal;immediate;transactional;abort)
四種方式關閉資料庫的比較:
(NO   YES)

關閉方式 A I T N
允許新的連線
N N N N
等待活動會話終止 N N N Y
等待活動事務終止 N N
  • Y
Y
強制進行checkpoint,關閉所有檔案 N Y Y Y

分析第一個過程startup  nomount:
這個過程資料庫首先到引數檔案(pfile/spfile)中讀取資料庫的設定,建立例項.
資料庫所在的作業系統版本:
[oracle@localhost ~]$ lsb_release -a 
LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: EnterpriseEnterpriseServer
Description:    Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)
Release:        5.5
Codename:       Carthage
資料庫版本:
SQL> SELECT * FROM v$version where rownum=1;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

因為spfile是二進位制檔案,不能直接讀取,在linux中,可以用命令String轉儲出來:
[oracle@localhost dbs]$ strings spfileorcl3939.ora
orcl3939.__db_cache_size=54525952
orcl3939.__java_pool_size=4194304
orcl3939.__large_pool_size=4194304
orcl3939.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orcl3939.__pga_aggregate_target=171966464
orcl3939.__sga_target=251658240
orcl3939.__shared_io_pool_size=0
orcl3939.__shared_pool_size=176160768
orcl3939.__streams_pool_size=4194304
*.audit_file_dest='/u01/app/oracle/admin/orcl3939/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/o
racle/oradata/orcl3939/control01.ctl','/u01/app/oracle/flash_recovery_area/orcl3939/control02.ctl','/u01/app/oracle/oradata/orcl3939/control03.ctl'
*.db_block_size=8192
*.db_domain='localdomain'
*.db_name='orcl3939'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4039114752
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orcl3939XDB)'
*.instance_name='ORCL3939'
*.local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST = local
host.localdomain)(PORT = 1521))'
*.memory_target=423624704
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.service_names='a,b,c,d'
*.trace_enabled=TRUE
*.undo_tablespace='UNDOTBS1'

spfile檔案中你可以看到資料庫在nomount時做了些什麼,根據引數檔案的內容,建立了instance,分配了相應的記憶體區域,啟動了相應的後臺程式。
我們再看告警日誌檔案(alert_.log):讀取了引數檔案,啟動了例項

Starting up:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options.
Using parameter settings in server-side spfile /u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl3939.ora
System parameters with non-default values:
  processes                = 150
  memory_target            = 404M
  control_files            = "/u01/app/oracle/oradata/orcl3939/control01.ctl"
  control_files            = "/u01/app/oracle/flash_recovery_area/orcl3939/control02.ctl"
  control_files            = "/u01/app/oracle/oradata/orcl3939/control03.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= 3852M
  undo_tablespace          = "UNDOTBS1"
  remote_login_passwordfile= "EXCLUSIVE"
  db_domain                = "localdomain"
  instance_name            = "ORCL3939"
  service_names            = "a,b,c,d"
  dispatchers              = "(PROTOCOL=TCP) (SERVICE=orcl3939XDB)"
  local_listener           = "(ADDRESS=(PROTOCOL=TCP)(HOST = localhost.localdomain)(PORT = 1521))"
  audit_file_dest          = "/u01/app/oracle/admin/orcl3939/adump"
  audit_trail              = "DB"
  db_name                  = "orcl3939"
  open_cursors             = 300
  diagnostic_dest          = "/u01/app/oracle"
  trace_enabled            = TRUE
Thu Apr 02 14:59:41 2015
PMON started with pid=2, OS id=5989 
Thu Apr 02 14:59:41 2015
VKTM started with pid=3, OS id=5991 at elevated priority
VKTM running at (10)millisec precision with DBRM quantum (100)ms
Thu Apr 02 14:59:41 2015
GEN0 started with pid=4, OS id=5995 
Thu Apr 02 14:59:41 2015
DIAG started with pid=5, OS id=5997 
Thu Apr 02 14:59:41 2015
DBRM started with pid=6, OS id=5999 
Thu Apr 02 14:59:41 2015
PSP0 started with pid=7, OS id=6001 
Thu Apr 02 14:59:41 2015
DIA0 started with pid=8, OS id=6003 
Thu Apr 02 14:59:41 2015
MMAN started with pid=9, OS id=6005 
Thu Apr 02 14:59:41 2015
DBW0 started with pid=10, OS id=6007 
Thu Apr 02 14:59:41 2015
LGWR started with pid=11, OS id=6009 
Thu Apr 02 14:59:41 2015
CKPT started with pid=12, OS id=6011 
Thu Apr 02 14:59:41 2015
SMON started with pid=13, OS id=6013 
Thu Apr 02 14:59:41 2015
RECO started with pid=14, OS id=6015 
Thu Apr 02 14:59:41 2015
MMON started with pid=15, OS id=6017 
Thu Apr 02 14:59:41 2015
MMNL started with pid=16, OS id=6019 
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
starting up 1 shared server(s) ...
ORACLE_BASE from environment = /u01/app/oracle

資料庫根據引數建立例項之後,後臺程式依次啟動,注意上面輸出中包含了PID資訊以及OS ID兩個資訊,PID代表該程式在資料庫內部的識別符號編號,而OS ID則代表該程式在作業系統上的程式編號。
我們可以透過oracle中的動態檢視v$process,可以把後臺程式和作業系統的程式想關聯起來:
SQL> select addr,pid,spid,username,program from v$process;
ADDR PID SPID USERNAME PROGRAM
ADDR            PID SPID                                                            USERNAME                                       PROGRAM
-------- ---------- ------------------------------------------------------------------------ --------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------
393B9444          1                                                               PSEUDO
393B9F1C          2 5989                                                            oracle                                         oracle@localhost.localdomain (PMON)
393BA9F4          3 5991                                                            oracle                                         oracle@localhost.localdomain (VKTM)
393BB4CC          4 5995                                                            oracle                                         oracle@localhost.localdomain (GEN0)
393BBFA4          5 5997                                                            oracle                                         oracle@localhost.localdomain (DIAG)
393BCA7C          6 5999                                                            oracle                                         oracle@localhost.localdomain (DBRM)
393BD554          7 6001                                                            oracle                                         oracle@localhost.localdomain (PSP0)
393BE02C          8 6003                                                            oracle                                         oracle@localhost.localdomain (DIA0)
393BEB04          9 6005                                                            oracle                                         oracle@localhost.localdomain (MMAN)
393BF5DC         10 6007                                                            oracle                                         oracle@localhost.localdomain (DBW0)
393C00B4         11 6009                                                            oracle                                         oracle@localhost.localdomain (LGWR)
393C0B8C         12 6011                                                            oracle                                         oracle@localhost.localdomain (CKPT)
393C1664         13 6013                                                            oracle                                         oracle@localhost.localdomain (SMON)
393C213C         14 6015                                                            oracle                                         oracle@localhost.localdomain (RECO)
393C2C14         15 6017                                                            oracle                                         oracle@localhost.localdomain (MMON)
393C36EC         16 6019                                                            oracle                                         oracle@localhost.localdomain (MMNL)
393C41C4         17 6021                                                            oracle                                         oracle@localhost.localdomain (D000)
393C4C9C         18 6023                                                            oracle                                         oracle@localhost.localdomain (S000)
393C5774         19 6757                                                            oracle                                         oracle@localhost.localdomain (TNS V1-V3)


已選擇19行。

分析第二個過程mount:

告警日誌中:

alter database mount
Thu Apr 02 15:33:03 2015
Successful mount of redo thread 1, with mount id 3864558315
Database mounted in Exclusive Mode
Lost write protection disabled
Completed: alter database mount

有引數檔案中,找到了control_file的位置並鎖定控制檔案:
SQL> show parameter control_files;


NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
control_files                        string                            /u01/app/oracle/oradata/orcl39
                                                                       39/control01.ctl, /u01/app/ora
                                                                       cle/flash_recovery_area/orcl39
                                                                       39/control02.ctl, /u01/app/ora
                                                                       cle/oradata/orcl3939/control03
                                                                       .ctl

這三個控制檔案的大小一樣,3個控制檔案最好放在不同的物理磁碟上,往控制檔案中寫資訊的時候併發同時寫,所以3個控制檔案的內容是相同的,但是讀取的時候,只讀取第一個,如果3個控制檔案有一個出錯了,oracle就不能啟動了。在實際的生產工程中,不建議放在同一磁碟上,這樣不利於資料庫遇到磁碟介質損壞的恢復。
控制檔案中包含了聯機重做日誌檔案和資料檔案的位置。
分析第三個過程open:
由於控制檔案中記錄了資料檔案,日誌檔案的位置,檢查點資訊等重要的資訊,在open階段時,資料庫根據控制檔案中記錄的這些資訊找到這些檔案,然後進行檢查點及完整性檢查。如果沒有問題可以啟動資料庫,如果存在不一致或者檔案丟失則需要恢復資料庫。關於資料庫的一致性性檢查在這裡不做闡述。



在這三個過程中,每個過程可以查些什麼動態效能檢視(動態效能檢視是在資料庫啟動時自動建立):
nomount:
只是啟動了例項,啟動例項的資訊主要來自引數檔案,引數檔案中記錄的資訊可以查詢,可以查:v$parameter,v$spparameter,v$sga,v$sgastat,v$bh,v$instance,v$option,v$version,v$process,v$session
mount:
此時控制檔案被讀取,和控制檔案相關的檢視可以查詢,這要有:v$thread,v$controlfile,v$database,v$datafile,v$logfile,v$datafile_header
open:
open之後,所有的動態效能檢視都可以查詢。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1806105/,如需轉載,請註明出處,否則將追究法律責任。

相關文章