Oracle啟動三階段(一)
Oracle啟動是可以分為三個階段的,分別為:nomount、mount和open。在這三個階段中,Oracle分別實現了不同的職責和目標,將資料庫伺服器相關的資訊和資料進行載入。
下面就一起來看一下三個階段的現象和作用。
基礎知識——關於Oracle例項相關的三個組成
在談到Oracle啟動關閉的時候,我們需要提一下三個主要元件:Oracle監聽器、Oracle例項和OEM管理工具。
在筆者之前的Blog中,已經談到不少關於監聽器的知識。總的來說,Oracle監聽器就是駐留在Oracle主機上的一個程式服務。它留守在一個網路埠(預設是1521),接受客戶端透過網路Oracle Net Service提出的連線請求。接收到請求之後,根據先前的註冊資訊(動態註冊或者靜態註冊)與例項進行溝通,獲取到Server Process資訊。監聽程式Server Process資訊告知客戶端之後,客戶端重定向,與Server Process建立聯絡。所以說,沒有監聽器,就沒有Oracle Net Service客戶端連線。監聽器程式是一個獨立的程式,啟動執行不受其他程式影響。
資料庫例項就是對資料庫進行操作的一系列程式和記憶體共享區的綜合。客戶端任何操作都是透過Server Process的代理方式,對資料庫例項和資料檔案進行操作。後臺程式的作用就是維護整個資料庫的完整性(包括資料、程式)。
OEM管理工具是Oracle提供的管理資料庫例項的工具。藉助該工具,可以方便的以GUI的方式對資料庫例項進行管理。從Oracle10g開始,廣泛使用的網路Web版OEM就已經比較普遍了。整合了各種管理和效能工具,以及GUI直觀介面,便於管理人員的日常管理工作。Web版OEM本質上就是一個Web應用,有對應的應用伺服器,對指定的資料庫例項進行管理。
這三個元件是我們最常使用的資料庫元件。一般我們手工啟動的順序,是先啟動監聽器程式,之後啟動資料庫例項,最後在有選擇性的啟動OEM。在Oracle官方的指導意見中,建議是先啟動OEM,透過OEM的圖形化工具啟動監聽器和資料庫例項。
總之,筆者比較傾向於前者。一般是監聽程式啟動在例項之前比較好,否則在進行動態註冊的時候會有一些問題。
環境說明
為了比較清楚的說明現象,筆者選擇了Linux(CentOS 4)進行說明。
首先我們檢視系統程式情況。
//沒有對應的oracle資料庫例項等資訊
[oracle@oracle11g ~]$ ps -ef | grep oracle
root 5529 5497 0 15:39 pts/0 00:00:00 su oracle
oracle 5530 5529 0 15:39 pts/0 00:00:00 bash
oracle 5547 5530 0 15:39 pts/0 00:00:00 ps -ef
oracle 5548 5530 0 15:39 pts/0 00:00:00 grep oracle
我們要啟動的資料庫名稱為wilson。使用tnsping檢查一下本地命名服務。
[oracle@oracle11g ~]$ tnsping wilson;
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 22-JAN-2011 15:45:43
Copyright (c) 1997, 2009, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle11g)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = wilson)))
TNS-12541: TNS:no listener //意思是,有連線名稱,但是沒有監聽器相對應;
此時如果想要透過服務名連線,也是不允許的。
SQL> conn as sysdba;
ERROR:
ORA-12541: TNS: 無監聽程式 //沒能找到監聽器程式
總結:在監聽器、例項均沒有啟動的情況下。是沒有辦法透過本地命名服務進行連線的。
啟動監聽器
Oracle中,使用lsnrctl命令提示符進行監聽器程式管理。
[oracle@oracle11g ~]$ lsnrctl start //啟動監聽器
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 22-JAN-2011 15:46:51
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Starting /u01/oracle/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /u01/oracle/network/admin/listener.ora
Log messages written to /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 22-JAN-2011 15:46:51
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/network/admin/listener.ora //監聽器宣告檔案;
Listener Log File /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))
The listener supports no services //當前沒有註冊的任何服務;
The command completed successfully
啟動了監聽程式,我們再使用本地連線進行連線。
SQL> conn sys/sys@wilson as sysdba;
ERROR:
ORA-12514: TNS: 監聽程式當前無法識別連線描述符中請求的服務
報錯資訊有所不同了。下面是一個配置片段:
wilson④ =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.39.41①)(PORT = 1521②))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = wilson③)
)
)
本地命名服務本質上就是一個命名縮寫。含義指定一個資料庫服務在10.1.39.41的主機上,監聽器埠是1521,資料庫服務的名稱(資料庫伺服器上的)是wilson。這些資訊在進行連線的時候使用wilson這個名字。
啟動nomount狀態
啟動的第一個階段也是nomount。在命令列視窗,使用sqlplus命令。
[oracle@oracle11g ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sat Jan 22 15:49:48 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn / as sysdba //本地登入,借用作業系統驗證;
Connected to an idle instance.
SQL> startup nomount //使用nomount引數
ORACLE instance started.
Total System Global Area 414298112 bytes
Fixed Size 1336904 bytes
Variable Size 310380984 bytes
Database Buffers 96468992 bytes
Redo Buffers 6111232 bytes
輸出資訊中,包括“ORACLE instance started.”和其他一些記憶體區域分配資訊。此時我們檢視系統程式資訊:
[oracle@oracle11g ~]$ ps -ef | grep oracle
root 5529 5497 0 15:39 pts/0 00:00:00 su oracle
oracle 5530 5529 0 15:39 pts/0 00:00:00 bash
oracle 5559 1 0 15:46 ? 00:00:00 /u01/oracle/bin/tnslsnr LISTENER -inherit
oracle 5615 1 0 15:50 ? 00:00:00 ora_pmon_wilson
(篇幅原因,省略部分結果)
oracle 5649 1 0 15:50 ? 00:00:00 ora_s000_wilson
oracle 5651 1 0 15:50 ? 00:00:00 ora_s001_wilson
注意:此處的tnslsnr程式為監聽器程式。其他ora_開頭進行為Oracle例項的後臺程式。
系統共享記憶體資訊,共享記憶體已經分配(SGA):
[oracle@oracle11g ~]$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0xd4d89218 32768 oracle 660 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
0x89c98dc4 98304 oracle 660 154
------ Message Queues --------
key msqid owner perms used-bytes messages
監聽器狀態:
[oracle@oracle11g ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 22-JAN-2011 15:53:38
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 22-JAN-2011 15:46:51
Uptime 0 days 0 hr. 6 min. 47 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/network/admin/listener.ora
Listener Log File /u01/diag/tnslsnr/oracle11g/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=1521)))
Services Summary...
Service "wilson" has 1 instance(s).
Instance "wilson", status BLOCKED, has 1 handler(s) for this service...
The command completed successfully
監聽器方面,在資料庫伺服器處在nomount狀態下的時候,動態註冊已經發生,註冊商wilson服務。但是,狀態是BLOCKED,表示現在服務狀態還沒有準備好。
此時,處在nomunt狀態的資料庫伺服器,能使用什麼命令方式呢?重新回到sqlplus視窗。
SQL> show sga
Total System Global Area 414298112 bytes
Fixed Size 1336904 bytes
Variable Size 310380984 bytes
Database Buffers 96468992 bytes
Redo Buffers 6111232 bytes
SQL> show parameter control
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/oradata/WILSON/controlfil
e/o1_mf_6bcsqm50_.ctl, /u01/fl
ash_recovery_area/WILSON/contr
olfile/o1_mf_6bcsqmd8_.ctl
control_management_pack_access string DIAGNOSTIC+TUNING
SQL> select * from v$datafile;
select * from v$datafile
*
ERROR at line 1:
ORA-01507: database not mounted
SQL> select * from v$controlfile;
no rows selected
發現,一些基礎的引數資訊已經載入進入例項。而大部分的基礎檢視和動態檢視也因為nomount狀態而不能進行查詢。
結論:nomount狀態是資料庫啟動的第一個階段。Oracle在這個階段主要完成例項構建和基礎引數資訊載入。例項程式和記憶體在這個階段已經建立。透過讀取引數檔案(spfile或者pfile),確定基礎引數資訊。這個階段下,一部分引數資訊已經可以讀取。但是,此時並沒有載入任何資料庫資料檔案,同時也不能對大部分檢視進行操作查詢。這個階段可以進行的就是建立資料庫和建立控制檔案的工作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-684503/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle啟動三階段(二)Oracle
- 從Alert_Log看Oracle資料庫啟動三階段Oracle資料庫
- 專案啟動階段有哪些管理技巧?
- 專案啟動階段有學問(轉)
- mtk相機冷啟動階段劃分
- 統一過程(UP)定義了初啟階段、精化階段、構建階段、移交階段和產生階段,每個階段以達到某個里程碑時結束,其中()的里程碑是生命週期架構。 A.初啟階段 B.精化階段 C.構建階段 D.移交階段架構
- 透過alert日誌看Oracle Startup的三個階段Oracle
- oracle各個啟動階段_nomount_mount_open_dump_trace命令的可執行性Oracle
- 分散式:分散式事務(CAP、兩階段提交、三階段提交)分散式
- 一致性協議之三階段提交協議
- 最新拓薪Java高階階段及ERP實戰專案(階段三)Java
- 第三階段專案總結
- OOP課第三階段總結OOP
- 基礎設施自動化的三個必經階段
- Oracle啟動的三個過程Oracle
- oracle啟動的三個步驟Oracle
- Oracle 啟動的三個步驟Oracle
- 第一階段複習
- 第三章、c語言高階階段C語言
- Android 系統開發_啟動階段篇 — 深入鑽研 SystemServerAndroidServer
- Android 系統開發_啟動階段篇 — 深入鑽研 initAndroid
- mysql階段04 連線工具, 連線方式, 啟動關閉mysqlMySql
- java第三階段作業總結Java
- 三階段提交(Three-phase commit)MIT
- oracle啟動案例一則Oracle
- 無線多作業系統啟動之uInitrd階段NFS掛載篇作業系統UINFS
- Java學習第一階段Java
- 分散式事務(二)之三階段提交分散式
- 客服系統的三個發展階段
- 比特幣的三個經濟階段比特幣
- 關於2PC(二階段提交)和3PC(三階段提交)的理解
- 面試每日一題011:從新手階段到流失階段,遊戲的階段性目標是什麼?面試每日一題遊戲
- Oracle學習系列—資料庫結構—Mount階段動態檢視Oracle資料庫
- 資料驅動最佳化調優 遊戲軟啟動階段的5項A/B Test遊戲
- 【軟考第一階段總結】
- java第一階段知識點Java
- 下一階段的Node.JSNode.js
- 第一階段衝刺總結