Oracle Server主要由兩部分組成:Instance 和Database 。Instance 是指一組后臺進程/線程和一塊共享內存區域,而 Database是指存儲在磁盤上的一組物理文件。本文由數據庫 如何啟動入手。
數據庫的啟動
首先來分析一下數據庫的啟動過程,Oracle 數據庫的啟動主要包含 3 個步驟:
(1)啟動數據庫到 nomount 狀態;
(2)啟動數據庫到 mount 狀態;
(3)啟動數據庫到 open 狀態。
下面逐個來看看各個步驟的具體過程以其含義。
1. 啟動數據庫到nomount 狀態
在啟動的第一步驟,Oracle 首先尋找參數文件(pfile/spfile ),然后根據參數文件中 的設置,創建實例,分配內存,啟動后臺進程。
在這里可以看到,只要擁有了一個參數文件,就可以憑之啟動實例(Instance), 這一步 驟并不需要任何控制文件或數據文件的參與。
在創建數據庫時,如果在這一步驟就出現問題,那么通常可能是系統配置(內核參數等)存在問題,用戶需要檢查是否分配了足夠的系統資源等。 來看一下啟動到 nomount 狀態的過程:
[oracle/9016.html">oracle@dbtest dbs]$ cd $ORACLE_HOME/dbs[oracle@dbtest dbs]$ lshc_orcl.dat init.ora initorcl.ora lkORCL orapworcl spfileorcl.ora[oracle@dbtest dbs]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Wed May 4 10:36:45 2016Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to an idle instance.SQL> startup nomount;ORACLE instance started.Total System Global Area 1152450560 bytesFixed Size 2212696 bytesVariable Size 922750120 bytesDatabase Buffers 218103808 bytesRedo Buffers 9383936 bytesSQL>
注意這里,Oracle 根據參數文件的內容,創建了 instance ,分配了相應的內存區域,啟 動了相應的后臺進程。 此時觀察警報日志文件(alert_<sid>.log ; show parameter dump查看路徑),可以看到這一階段的啟動過程,讀取參數 文件,應用參數啟動實例,所有在參數文件中定義的非缺省參數都會記錄在警報日志文件中:
Starting up:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options.Using parameter settings in server-side spfile /u01/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.oraSystem parameters with non-default values: 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"
然后后臺進程依次啟動:
Wed May 04 10:36:55 2016PMON started with pid=2, OS id=3128 Wed May 04 10:36:55 2016VKTM started with pid=3, OS id=3132 at elevated priorityVKTM running at (10)millisec precision with DBRM quantum (100)msWed May 04 10:36:55 2016GEN0 started with pid=4, OS id=3138 Wed May 04 10:36:55 2016DIAG started with pid=5, OS id=3142 Wed May 04 10:36:55 2016DBRM started with pid=6, OS id=3146 Wed May 04 10:36:55 2016PSP0 started with pid=7, OS id=3150 Wed May 04 10:36:55 2016DIA0 started with pid=8, OS id=3158 Wed May 04 10:36:55 2016MMAN started with pid=9, OS id=3162 Wed May 04 10:36:55 2016DBW0 started with pid=10, OS id=3166 Wed May 04 10:36:55 2016LGWR started with pid=11, OS id=3170 Wed May 04 10:36:55 2016CKPT started with pid=12, OS id=3175 Wed May 04 10:36:55 2016SMON started with pid=13, OS id=3179 Wed May 04 10:36:55 2016RECO started with pid=14, OS id=3184 Wed May 04 10:36:55 2016MMON started with pid=15, OS id=3189 starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...Wed May 04 10:36:55 2016MMNL started with pid=16, OS id=3193 starting up 5 shared server(s) ...ORACLE_BASE from environment = /u01/app/oracle
這里注意一下 Oracle選擇參數文件的順序:
Oracle 首選spfile<sid>.ora文件作為啟動參數文件;如果該文件不 存在,Oracle選擇spfile.ora 文件;如果前兩者都不存在,Oracle將會選擇 init<sid>.ora文件;如果以上 3 個文件都不存在,Oracle 將無法創建和啟動 instance ,Oracle將無法啟動。
用戶可以在SQL*PLUS 中通過show parameter spfile 命令來檢查數據庫是否使用了 spfile文件,如果 value 不為Null,則數據庫使用了 spfile文件:
SQL> show parameter spfileNAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile string /u01/app/oracle/product/11.2.0 /db_1/dbs/spfileorcl.oraSQL>
這時候也可以從操作系統查看啟動了的后臺進:
[root@dbtest trace]# ps -ef|grep ora_ oracle 3128 1 0 10:36 ? 00:00:00 ora_pmon_orcloracle 3132 1 0 10:36 ? 00:00:00 ora_vktm_orcloracle 3138 1 0 10:36 ? 00:00:00 ora_gen0_orcloracle 3142 1 0 10:36 ? 00:00:00 ora_diag_orcloracle 3146 1 0 10:36 ? 00:00:00 ora_dbrm_orcloracle 3150 1 0 10:36 ? 00:00:00 ora_psp0_orcloracle 3158 1 0 10:36 ? 00:00:00 ora_dia0_orcloracle 3162 1 0 10:36 ? 00:00:00 ora_mman_orcloracle 3166 1 0 10:36 ? 00:00:00 ora_dbw0_orcloracle 3170 1 0 10:36 ? 00:00:00 ora_lgwr_orcloracle 3175 1 0 10:36 ? 00:00:00 ora_ckpt_orcloracle 3179 1 0 10:36 ? 00:00:00 ora_smon_orcloracle 3184 1 0 10:36 ? 00:00:00 ora_reco_orcloracle 3189 1 0 10:36 ? 00:00:00 ora_mmon_orcloracle 3193 1 0 10:36 ? 00:00:00 ora_mmnl_orcloracle 3197 1 0 10:36 ? 00:00:00 ora_d000_orcloracle 3201 1 0 10:36 ? 00:00:00 ora_s000_orcloracle 3205 1 0 10:36 ? 00:00:00 ora_s001_orcloracle 3209 1 0 10:36 ? 00:00:00 ora_s002_orcloracle 3213 1 0 10:36 ? 00:00:00 ora_s003_orcloracle 3217 1 0 10:36 ? 00:00:00 ora_s004_orclroot 3358 3253 0 10:50 pts/3 00:00:00 grep ora_
如果這3 個文件都不存在,Oracle 將無法啟動:
[oracle@dbtest dbs]$ mv init.ora init.ora.bak[oracle@dbtest dbs]$ mv initorcl.ora initorcl.ora.bak[oracle@dbtest dbs]$ mv spfileorcl.ora spfileorcl.ora.bak[oracle@dbtest dbs]$ lshc_orcl.dat init.ora.bak initorcl.ora.bak lkORCL orapworcl spfileorcl.ora.bak[oracle@dbtest dbs]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Wed May 4 10:55:42 2016Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to an idle instance.SQL> startup nomount;ORA-01078: failure in processing system parametersLRM-00109: could not open parameter file '/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora'
在Oracle整個啟動過程中,參數文件是寫在應用程序中的硬代碼,按照如上順序進行查 找,不能改變Oracle的搜索路徑及行為,但是如果參數文件不在相應的位置,在Linux/UNIX 系統上,可以通過符號鏈接來進行重定位。
在參數文件中,通常需要最少的參數是 db_name,設置了這個參數之后,數據庫實例就可以啟動,來看一個簡單的測試:
SQL> ! echo "db_name=julia" > initorcl.oraSQL> startup nomount;ORACLE instance started.Total System Global Area 217157632 bytesFixed Size 2211928 bytesVariable Size 159387560 bytesDatabase Buffers 50331648 bytesRedo Buffers 5226496 bytes
這樣,就通過了最少的參數需求啟動了 Oracle實例。
2. 啟動數據庫到mount 狀態
啟動到nomount 狀態以后,Oracle就可以從參數文件中獲得控制文件的位置信息, 這一部分信息在參數文件中的記錄類似如下所示(Oracle缺省會創建3 個控制文件,這 3 個控制文件的內容完全一致,是Oracle為了安全而采用的鏡像手段,在生產環境中,通 常應該將3 個控制文件存放在不同的物理硬盤上,避免因為介質故障而同時損壞3 個控制 文件):
SQL> show parameter control_filesNAME TYPE VALUE------------------------------------ ----------- ------------------------------control_files string /u01/app/oracle/product/11.2.0 /db_1/dbs/cntrlorcl.dbf
在nomount 狀態,可以查詢v$parameter視圖,獲得控制文件信息,這部分信息來自啟 動的參數文件;當數據庫 mount 之后,可以查詢 v$controlfile視圖獲得關于控制文件的信 息,此時,這部分信息來自控制文件:
[oracle@dbtest dbs]$ mv init.ora.bak init.ora[oracle@dbtest dbs]$ mv initorcl.ora.bak initorcl.ora[oracle@dbtest dbs]$ mv spfileorcl.ora.bak spfileorcl.ora[oracle@dbtest dbs]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Wed May 4 11:07:07 2016Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to an idle instance.SQL> startup nomount;ORACLE instance started.Total System Global Area 1152450560 bytesFixed Size 2212696 bytesVariable Size 922750120 bytesDatabase Buffers 218103808 bytesRedo Buffers 9383936 bytesSQL> alter database mount; Database altered.SQL> select * from v$controlfile; STATUS-------NAME--------------------------------------------------------------------------------IS_ BLOCK_SIZE FILE_SIZE_BLKS--- ---------- --------------/u01/app/oracle/oradata/orcl/control01.ctlNO 16384 594/u01/app/oracle/flash_recovery_area/orcl/control02.ctlNO 16384 594STATUS-------NAME--------------------------------------------------------------------------------IS_ BLOCK_SIZE FILE_SIZE_BLKS--- ---------- --------------
在mount 數據庫的過程中,Oracle需要找到控制文件并鎖定控制文件。如果控制文件全 部丟失此時就會報出如下錯誤:
SQL> alter database mount; alter database mount*ERROR at line 1:ORA-00205: error in identifying control file, check alert log for more info
這時候alert.log 文件中通常會記錄更為詳細的信息。
因為Oracle的3 個(缺省的)控制文件內容完全相同,如果只是損失了其中 1~2 個, 可以復制完好的控制文件,更改為相應的名稱,就可以啟動數據庫;如果丟失了所有的控制 文件,那么就需要恢復或重建控制文件來打開數據庫。
在正常Mount 數據庫的過程中,數據庫的警報日志文件僅記錄如下信息:
alter database mountWed May 04 11:07:44 2016Successful mount of redo thread 1, with mount id 1438756220Database mounted in Exclusive ModeLost write protection disabledCompleted: alter database mount
在這一步驟中,數據庫需要計算Mount id 并將其記錄在控制文件中,然后開始啟動 Heartbeat(心跳),每3 秒更新一次控制文件。
啟動到Mount 狀態,數據庫必須具備的另外一個重要文件是口令文件,該文件位于 $ORACLE_HOME/dbs 目錄下,缺省的名稱為 orapw 。 口令文件中存放 sysdba/sysoper 用戶的用戶名及口令:
[oracle@dbtest dbs]$ strings orapworcl ]/[ZORACLE Remote Password fileINTERNAL769C0CD849F9B8B25638228DAF52805F[oracle@dbtest dbs]$
在數據庫沒有啟動之前,數據庫內建用戶是無法通過數據庫本身來驗證身份的,通過口 令文件,Oracle 可以實現對用戶的身份認證,在數據庫未啟動之前登錄,進而啟動數據庫。 對于口令文件,Oracle 缺省查找 orapw 文件,如果該文件不存在,則繼續查找orapw 文件,如果兩者都不存在,則數據庫將會出現錯誤。
如果口令文件丟失,通過 orapw 工具即可重建,所以在通常的備份策略中可以不必包含 口令文件:
[oracle@dbtest dbs]$ orapwdUsage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n> where file - name of password file (required), password - password for SYS will be prompted if not specified at command line, entries - maximum number of distinct DBA (optional), force - whether to overwrite existing file (optional), ignorecase - passwords are case-insensitive (optional), nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only). There must be no spaces around the equal-to (=) character.[oracle@dbtest dbs]$
通常在Linux/UNIX 平臺下,在$ORACLE_HOME/dbs 目錄下,還會存在另外一個文件,該文件命名規則為 lk<SID>,lk指lock ,該文件在數據庫啟動時創建,用于操作系統對數據庫的鎖定。當數據庫啟動時獲得鎖定,數據庫關閉時釋放。該文件內容通常只有一行,提示不要刪除,該文件僅僅用于鎖定.
3. 啟動數據庫open階段
由于控制文件中記錄了數據庫中數據文件、日志文件的位置信息、檢查點信息等重要信 息,所以在數據庫的 open階段,Oracle可以根據控制文件中記錄的這些信息找到這些文件, 然后進行檢查點及完整性檢查。
如果不存在問題就可以啟動數據庫,如果存在不一致或文件丟失則需要進行恢復。
進一步地說,實際上在數據庫 open的過程中,Oracle 進行的檢查中包括以下兩項:
第一次檢查數據文件頭中的檢查點計數(Checkpoint cnt )是否和控制文件中的檢查點 計數(Checkpoint cnt )一致。此步驟檢查用以確認數據文件是來自同一版本,而不是從備 份中恢復而來(因為 Checkpoint Cnt 不會被凍結,會一直被修改)。 下面通過一個簡單的測試來說明一下 Checkpoint Cnt的作用。
如果檢查點計數檢查通過,則數據庫進行第二次檢查。第二次檢查數據文件頭的開始SCN 和控制文件中記錄的該文件的結束 SCN 是否一致,如果控制文件中記錄的結束 SCN 等于數據 文件頭的開始 SCN,則不需要對那個文件進行恢復。
總結
以上就是本文關于oracle 數據庫啟動階段分析的全部內容,希望對大家有所幫助。感謝大家對本站的支持。有什么問題可以隨時留言,小編會竭盡所能給您想要的答案。
新聞熱點
疑難解答