Oracle啟動三階段(一)

realkid4發表於2011-01-23

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章