28. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
29. Chapter 2 – Oracle 伺服器
Oracle Database Management Best Practice
2.6 開啟或關閉執行處理
在 Oracle 伺服器架構中,所有儲存在資料庫內的資料,都必須透過執行處理才能被操作。如
果執行處理尚未開啟資料庫,此時資料庫使用者只能望資料庫興嘆,而不能存取、操作資料
庫的資料。
2.6.1 開啟執行處理
資料庫的所有資料都存放在資料檔內,資料庫使用者不能直接讀寫該資料檔的內容,必須使
用 SQL 敘述句,由伺服器處理作業透過執行處理才能存取或操作這些資料。而執行處理開啓
資料庫的過程可以分成三個階段:未掛載(NOMOUNT)、掛載(MOUNT)、開啟(OPEN),這三
種階段分別代表著執行處理與資料庫間的三種關係。
啓動啟動執行處理的指令為 STARTUP {NOMOUNT|MOUNT|OPEN}。 如果 STARTUP 指令
後面沒有加上其他參數,或是加上 OPEN 這個參數,都表示希望執行處理能夠開啟資料庫。
[ora11g@Elinux ~]$ echo $ORACLE_SID --設定所要連線的執行處理名字
orcl
[ora11g@Elinux ~]$ sqlplus / AS SYSDBA --需要sysdba權限,才能啓動或關閉Instance
Connected to an idle instance. --代表Instance(ora11g)尚未啓動
SQL> STARTUP --若沒有加上任何參數,表示為STARTUP OPEN
ORACLE instance started. --此時Instance已經啓動,但尚未開啟Database
Total System Global Area 318054400 bytes
Fixed Size 1299624 bytes
Variable Size 138414936 bytes
Database Buffers 171966464 bytes
Redo Buffers 6373376 bytes
Database mounted. /*此時Instance已經掛載(mount)Database中的所有controlfile*/
Database opened. /*此時Instance已經開啓(open)Database中的所有datafile與logfile*/
SQL> SELECT status FROM v$instance;
STATUS
------------
OPEN
30. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
未掛載(NOMOUNT)
當執行處理的狀態試圖由關閉(SHUTDOWN)轉到未掛載(NOMOUNT)時,也就是使用
STARTUP 指令將執行處理啟動。必須先取得 SYSDBA 或 SYSOPER 權限,之後依據參數
檔的設定,配置系統整體區域(System Global Area)與啓動背景處理作業(Background
Process)。這時執行處理會將相關訊息記錄到警示日誌檔,並可能會產生一些背景處理作業
追蹤檔。不過當執行處理狀況為未掛載時,執行處理並未與資料庫有任何關連。
在未掛載的狀態下,資料庫管理者只能做以下兩件事:
• 建立資料庫。
• 重建控制檔。
掛載(MOUNT)
當執行處理試圖掛載資料庫時,執行處理根據 control_files 的參數值,開啓所指定的所有控
制檔(controlfile)。當所有控制檔都能被開啟後,執行處理將繼續比對控制檔所記錄的資料庫
名字是否與參數檔的 DB_NAME 參數所指定的資料庫名字相同。如果兩者相同,執行處理便
31. Chapter 2 – Oracle 伺服器
Oracle Database Management Best Practice
成功地掛載資料庫,這個階段稱為掛載(MOUNT)。不過若有任何一個控制檔無法成功地開啓,
這時會有錯誤訊息出現以及執行處理繼續保持在未掛載狀態。
在掛載階段資料庫管理者能做的工作有以下幾種:
• 復原資料庫。
• 更改資料檔或線上重做日誌檔的名字。
• 變更資料庫日誌模式,可以在無存檔日誌(noarchive log)與存檔日誌(archive log)模式
間轉換。
• 開啓或關閉資料庫回溯(Flashback Database)功能。
開啓(Open)
當試圖將執行處理的狀態轉換為開啟時,執行處理依照控制檔所記載的資料庫實體結構(資料
檔與線上重做日誌檔的位置),開啓所有狀態為線上(Online)資料檔與所有的線上重做日誌檔。
執行處理開啟資料檔與線上重做日誌檔後,將比對控制檔的最後檢查點號碼(Last
Checkpoint Number)與每個線上、讀寫狀態的資料檔標頭(Datafile Header)的最後檢查點是
否一致。兩者相同則表示上一次的執行處理是被正常關閉,因此可以開啟資料庫中的所有檔
案。若不一致則 SMON 進行執行處理復原(Instance Recovery)。
只有執行處理的狀態為開啟(OPEN)時,使用者才能登入資料庫 。
[oracle@Elinux ~]$ echo $ORACLE_SID
orcl
[oracle@Elinux ~]$ sqlplus / AS SYSDBA /*需要sysdba權限,才能啓動或關閉Instance*/
Connected to an idle instance. /*代表Instance(orcl)尚未啓動*/
--如果無有特別的目的,請使用STARTUP OPEN將執行處理啟動,並開啟資料庫
SQL> STARTUP NOMOUNT /*將Instance啟動,但不掛載資料庫。*/
SQL> SELECT status FROM v$instance;
STATUS
------------
STARTED
SQL> ALTER DATABASE OPEN; /*目前的狀態為NOMOUNT,不能直接提升到OPEN*/
32. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01507: database not mounted
SQL> ALTER DATABASE MOUNT;
/*NOMOUNT之後,只能繼續向上MOUNT或向下SHUTDOWN*/
SQL> SELECT status FROM v$instance;
STATUS
------------
MOUNTED
SQL> ALTER DATABASE OPEN; /*MOUNT之後,只能繼續向上OPEN或SHUTDOWN*/
SQL> SELECT status FROM v$instance;
STATUS
------------
OPEN
33. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
2.6.2 關閉執行處理
關閉執行處理將導致使用者無法繼續操作資料庫,所以在關閉執行處理之前,請先確定是否
非要關閉執行處理不可。如同執行處理開啓資料庫的步驟分成:NOMOUNT、MOUNT、
OPEN 三種,執行處理關閉的步驟也可以分成三個階段: 關閉(CLOSE)資料庫、卸載
(DISMOUNT)資料庫、關閉(SHUTDOWN)執行處理。
關閉執行處理的指令為 SHUTDOWN {NORMAL|TRANSACTIONAL|IMMEDIATE|ABORT}
[oracle@Elinux ~]$ echo $ORACLE_SID
orcl
[oracle@Elinux ~]$ sqlplus / AS SYSDBA /*需要sysdba權限,才能啓動或關閉Instance*/
Connected. /*代表Instance(orcl)已經啓動*/
SQL> SELECT status FROM v$instance;
STATUS
------------
OPEN
SQL> SHUTDOWN IMMEDIATE
--進行髒緩衝與重做項目寫回資料檔與線上重做日誌檔的操作
Database closed. /*此時datafile與logfile被關閉*/
Database dismounted. /*此時controlfile被關閉*/
ORACLE instance shut down. /*Instance被關閉*/
35. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
• TRANSACTIONAL:當使用這個參數時,從執行關閉指令之後,不允許建立新的階段
作業。但是現有的階段作業,可以繼續正在進行的交易。不過交易完成後,就強迫結
束該階段作業。等到所有的階段作業都結束後,才開始進行關閉資料庫的動作。
• IMMEDIATE: 當使用這個參數時, 從執行關閉指令之後,除不允許建立新的階段作
業外,而且所有進行中的交易,立刻開始退回。當交易退回完成後,就強迫結束現有
階段作業。等到所有的階段作業都結束後,才開始進行關閉資料庫的動作。
卸載資料庫(Dismount)
執行處理關閉所有的控制檔,加上關閉資料庫階段所關閉的資料檔與線上重做日誌檔,執行
處理已經完全與資料庫不存在任何關連。執行處理關閉控制檔後,表示控制檔的內容不會再
被改變。
關閉執行處理(Shutdown)
系統整體區域(System Global Area)的記憶體空間將被作業系統收回,而且所有的背景處理作
業也將被終止,所以現在的執行處理將不復存在。若執行 SHUTDOWN ABORT 指令,則會
直接跳到關閉執行處理這一個階段,而沒有經過關閉資料庫與卸載資料庫的過程。因此在緩
衝區快取的髒緩衝都還未寫回資料檔,而進行中的交易也沒有結束。所以當下一次啓動新的
執行處理時,必須先進行執行處理復原來修復資料庫不一致的狀況。
[oracle@Elinux ~]$ echo $ORACLE_SID
orcl
[oracle@Elinux ~]$ sqlplus / AS SYSDBA /*需要sysdba權限,才能啓動或關閉Instance*/
Connected. /*代表Instance(orcl)已經啓動*/
SQL> SELECT status FROM v$instance;
STATUS
------------
OPEN
/*要求正常地關閉datafile與online redo logfile,此指令僅用在示範關閉資料庫的動作。平
常請使用SHUTSOWN指令來關閉資料庫*/
SQL> ALTER DATABASE CLOSE;
36. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
SQL> SELECT status FROM v$instance;
STATUS
------------
MOUNTED
SQL> ALTER DATABASE OPEN; /*不能使用現在的Instance再次開啓datafile與logfile*/
alter database open
*
ERROR at line 1:
ORA-16196: database has been previously opened and closed
SQL> ALTER DATABASE DISMOUNT; /*關閉controfile*/
SQL> SELECT status FROM v$instance;
STATUS
------------
STARTED
SQL> ALTER DATABASE MOUNT; /*不能使用現在的Instance再次掛載controlfile*/
alter database mount
*
ERROR at line 1:
ORA-00750: database has been previously mounted and dismounted
SQL> SHUTDOWN IMMEDIATE
ORA-01507: database not mounted
ORACLE instance shut down.
40. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
是這個位置表示值。因此使用這個雜湊值讀取共用集區該位置的內容,如果該位置真的有資
料,但也不代表所存放執行計畫可以直接使用,還要進一步比對 SQL 本文(SQL Text)是否一
致,因為可能會有一個以上的 SQL 敘述句的雜湊值恰巧相同。
SQL> select last_name from employees where employee_id=100;
SQL> select last_name from employees where employee_id=200;
SQL> SELECT hash_value,address,executions,sql_text
2> FROM v$sql
3> WHERE sql_text LIKE 'select last_name from employees where employee_id=
%';
HASH_VALUE ADDRESS EXECUTIONS
------------------- --------------- -------------------
SQL_TEXT
--------------------------------------------------------------------------------
2627784799 329AEEF4 1
select last_name from hr.employees where employee_id=200
280342537 2EBE0FA4 1
select last_name from hr.employees where employee_id=100
以上圖為例,這兩個 SQL 敘述句看似相同,只有文字(Literal)不一樣(一個為 100、另一個為
200),但是 100 與 200 的 ASCII Code 值就不相同了,所以整個雜湊後的結果自然也不相
同。所以這兩個 SQL 敘述句都將被解析,但解析的動作相當耗 CPU 的運算資源,所此硬解
析的次數越多,則 Oracle 伺服器的效能越差。
SQL> variable empid number;
SQL> execute :empid := 100;
SQL> select last_name from hr.employees where employee_id=:empid;
SQL> execute :empid := 200;
SQL> select last_name from hr.employees where employee_id=:empid
SQL> SELECT hash_value,address,executions,sql_text
2> FROM v$sql
3> WHERE sql_text LIKE 'select last_name from employees where employee_id=
%';
HASH_VALUE ADDRESS EXECUTIONS
------------------- --------------- -------------------
SQL_TEXT
--------------------------------------------------------------------------------
476476418 3290C280 2
41. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
select last_name from hr.employees where employee_id=:empid
/*雖然SQL敘述句被執行2次,卻只解析一次.因為這2個的SQL敘述句完全相同.所以Execute階
段時,才會將:empid以100或200的值取代*/
2.檢查 SQL 敘述句的語法是否有錯誤。
SQL> SELECT * FORM employees;
SELECT * FORM employees --FROM打字錯誤為FORM
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
3.檢查 SQL 敘述句的語義是否有錯誤以及是否擁有足夠的權限。
SQL> SELECT ename FROM employees;
SELECT ename FROM employees --employees表格中沒有叫做ename的欄位
*
ERROR at line 1:
ORA-00904: "ENAME": invalid identifier
SQL> SELECT prod_id FROM sh.products;
SELECT prod_id FROM sh.products --使用者沒有SELECT該表格的權限
*
ERROR at line 1:
ORA-00942: table or view does not exist
4.決定最佳的執行計畫(Execution Plan)。最佳化處理程式(Optimizer)會先產生多個執行計畫,
再將統計值(Statistics)帶入,找出執行成本最低的執行計畫,為執行此 SQL 敘述句的執行計
畫。
5.將 SQL 本文(SQL Text)、解析樹(Parse Tree)、執行計畫(Execution Plan)儲存在程式庫
快取,存放位置以 SQL 敘述句所計算出的雜湊值為起始位置。
2.7.2 繫結(Bind)
若 SQL 敘述句有使用繫結變數(Bind Variable),將在此時將變數值帶入執行計畫。
42. Chapter 1 – Oracle Server 基本介紹
Oracle Database Management Best Practice
2.7.3 執行(Execute)
此階段為依據執行計畫進行的操作。不同型態的 SQL 敘述句,執行過程當然不同。
查詢(SELECT)
1.檢查所需的資料區塊(Data Block)是否已經存在於緩衝區快取(Buffer Cache)。如果已經存
在於緩衝區快取中,則直接讀取其內容即可。這種讀取方式,稱為邏輯讀取(Logical Read)。
2.若所需的資料區塊並不存在於緩衝區快取中,則伺服器處理作業(Server Process)將資料區
塊由資料檔讀到緩衝區快取。首先伺服器處理作業必須先找到足夠的可使用緩衝後,才能由
資料檔讀入所需的資料區塊。這種讀取方式,稱為實體讀取(Physical Read),相較於邏輯讀
取,所耗費的系統資源較多,所花費的時間也較長。資料庫管理者應該盡量減少此種讀取的
次數與數量。