OCP課程23:管理Ⅰ之資料庫體系結構

stonebox1122發表於2016-01-05

課程目標:

  • 資料庫的主要元件
  • 記憶體結構
  • 後臺程式
  • 邏輯和物理儲存結構
  • ASM儲存元件



1、Oracle資料庫伺服器的體系結構

Oracle資料庫伺服器包含2部分:

  • 例項,包含記憶體和後臺程式
  • 資料庫,就是物理儲存

我們經常說的Oracle資料庫,廣義的說,就是包括例項部分和物理儲存部分,狹義的說,就只是物理儲存部分。但是對於Oracle來說,他的物理儲存部分就叫資料庫,管理部分叫例項,2個合起來叫資料庫伺服器(Database Server)。

那麼客戶端如何去訪問資料庫伺服器呢,是透過客戶端的使用者程式把請求交給資料庫伺服器的伺服器程式,由伺服器程式來負責處理請求,也就是說客戶端無法直接去修改資料庫的東西,真正修改是透過資料庫伺服器上面的伺服器程式來進行處理的。

clipboard

Oracle把資料庫和例項分開,就形成了以下2種的組合。

  • 第一種是非叢集的環境,在一臺伺服器上面建立多個例項和多個資料庫,但是一個例項只能對應一個資料庫。
  • 第二種是叢集的環境,將例項放在多個伺服器上面,而將資料庫放在共享儲存上面,多個例項對應一個資料庫,任何一個例項所在的伺服器(稱之為節點)當機,都不影響整個系統,而且任何例項對共享儲存的修改,在其他例項都可以看得到,提供了一個高可用的解決方案。叢集系統一般有2種實現方式,一種是Oracle的RAC(Real Application Cluster),一種是第三方的HA(High Availability),在Oracle的RAC出現之後,第三方的HA用得越來越少了。目前一般都是使用Oracle的RAC部署叢集。

資料庫建立好後,客戶端要去訪問資料庫,這裡就涉及到2個概念。

  • 連線(connection),就是客戶端的使用者程式和伺服器端的例項之間的通訊路徑。如果使用者程式和例項在同一主機上面,使用內部程式來建立連線,如果使用者程式和例項在不同主機上面,則使用網路來建立連線。
  • 會話(session),就是使用者登入到資料庫例項的一種狀態,或者說是通訊雙方從開始通訊到通訊結束期間的一個上下文(Context)。這個上下文是一段位於伺服器端的記憶體:記錄了本次連線的客戶端機器、透過哪個應用程式、哪個使用者登入等資訊。例如使用使用者名稱和密碼透過SQLPLUS登入到資料庫例項,就是建立了一個會話。是專屬於某一個使用者的特定的連線。

clipboard[1]

會話是和連線是同時建立的,兩者是對同一件事情不同層次的描述。簡單講,連線是物理上的客戶端同服務

器的通訊鏈路,會話是邏輯上的使用者同伺服器的通訊互動。在一條連線上可以建立0個、一個或多個會話。各個會話是單獨而且獨立的,即使它們共享同一條資料庫物理連線也是如此。一個會話中的提交不會影響該連線上的任何其他會話。

一個連線對應一個會話的示意圖如下:

clipboard[2]

一個連線對應兩個會話的示意圖如下:

clipboard[3]

可以透過動態效能檢視v$session去查詢會話的資訊。

例子:透過設定autotrace,在同一個連線下新增加一個會話

SQL> select sid,serial#,paddr from v$session where username='SYS';

       SID    SERIAL# PADDR

---------- ---------- ----------------

        39       1021 00000000917A8D40

SQL> set autotrace on statistics;

SQL> select sid,serial#,paddr from v$session where username='SYS';

       SID    SERIAL# PADDR

---------- ---------- ----------------

        29        921 00000000917A8D40

        39       1021 00000000917A8D40

例子:結束所有會話但是不斷開連線

SQL> disconnect

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

例子:檢視會話詳細資訊

SQL> conn / as sysdba

Connected.

SQL> desc v$session;

SQL> select sid,serial#,username,program from v$session;

       SID    SERIAL# USERNAME   PROGRAM

---------- ---------- ---------- ----------------------------------------

21        403 SYS        (TNS V1-V3)

其中:

SID為Session identifier,會話識別符號

Serial#為Session serial number,會話序列號

Oracle內部程式的USERNAME為空
需要使用SID和Serial#共同確定唯一的session,例如我們在會話裡面再使用conn / as sysdba發起新的session,此時session的sid不變,但是serial#會改變。

SQL> conn / as sysdba

Connected.

SQL> select sid,serial#,username,program from v$session;

       SID    SERIAL# USERNAME   PROGRAM

---------- ---------- ---------- ----------------------------------------

21        405 SYS        (TNS V1-V3)

可以看到session被應用於Oracle層次而非作業系統層次。同時sessions也是Oracle中一個引數,在不考慮透過專用伺服器或共享伺服器進行登入的情況下,這個引數限制了對指定例項的併發登陸數。

例子:檢視引數sessions的值

SQL> show parameter sessions

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sessions                             integer     247

我們在建立資料庫的時候會指定一個伺服器程式Processes引數,這個引數限制了連線到例項的作業系統程式數量。

clipboard[4]

例子:檢視引數processes的值

SQL> show parameter processes;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

processes                            integer     150

那麼這個引數和session有什麼關係呢?如果資料庫執行在專用伺服器模式(Dedicated),一個會話對應一個伺服器程式,如果資料庫執行在共享伺服器模式(Shared),一個伺服器程式可以為多個會話服務。

例子:查詢資料庫執行在哪種伺服器方式

SQL> select distinct server from v$session;

SERVER

---------

DEDICATED

可以透過動態效能檢視v$process去查詢程式的資訊

例子:透過v$session和v$process檢視看會話和程式的關係

SQL> select s.sid,s.username,p.spid,p.username from v$session s join v$process p on s.paddr=p.addr where s.username is not null;

       SID USERNAME   SPID       USERNAME

---------- ---------- ---------- ----------

        46 SYS        10844      oracle

        38 SYS        11445      oracle

        37 HR         11495      oracle

        45 SYS        11178      oracle

Oracle的sessions和processes的數量關係是:

  • Oracle 11g R1以及之前版本

             sessions=(1.1 * processes) + 5

  • Oracle 11g R2

sessions=(1.5 * processes) + 22

例子:檢視當前資料庫版本

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0      Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 - Production

可以看到當前版本為11g R2,前面查詢到的sessions數量為247,processes數量為150,則剛好滿足公式:

247=(1.5*150)+22。

如果你碰到了ORA-12516錯誤,一般都是超過了Oracle的會話數限制,但是Oracle的最大會話數是由初始化引數processes控制的,並不是由引數sessions控制的,設定processes後系統透過上面的公式自動計算sessions的值。

例子:檢視系統曾經最大會話數量,如果接近最大值,則增大processes

SQL> select * from v$resource_limit where resource_name = 'sessions';

RESOURCE_NAME        CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION   LIMIT_VALUE

-------------------- ------------------- --------------- -------------------- --------------------

sessions                              45              69        247                  247

所有會話曾經達到的最大值為69,包含內部程式的會話。

如果要這個最大值接近247,則增加processes。

例子:增大processes為300

SQL> alter system set processes=300 scope=spfile;

System altered.

需要重啟資料庫

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  835104768 bytes

Fixed Size                  2257840 bytes

Variable Size             549456976 bytes

Database Buffers          281018368 bytes

Redo Buffers                2371584 bytes

Database mounted.

Database opened.

檢視確認,已經更改了。

SQL> show parameter processes

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

processes                            integer     300

SQL> show parameter sessions

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sessions                             integer     472

v$session檢視的status欄位表示會話的狀態,會話有ACTIVE、INACTIVE、KILLED、CACHED、SNIPED五個狀態,一般比較常見的是ACTIVE、INACTIVE、KILLED這三個狀態。

  • ACTIVE:處於此狀態的會話,表示正在執行,處於活動狀態。
  • INACTIVE:處於此狀態的會話表示不是正在執行的
  • KILLED:處於此狀態的會話,表示出現了錯誤或程式被殺掉,正在回滾,也佔用系統資源
  • CACHED: Session temporarily cached for use by Oracle*XA
  • SNIPED: Session inactive, waiting on the client,標記為SNIPED的程式被釋放有兩種條件:

         (1)相關的terminal再一次試圖登入及執行sql

         (2)手動的在作業系統後臺kill掉相應的spid

例子:檢視會話的狀態

SQL> select sid,serial#,username,program,status from v$session;

       SID    SERIAL# USERNAME   PROGRAM                                  STATUS

---------- ---------- ---------- ---------------------------------------- --------

         1          5 SYS        (TNS V1-V3)          INACTIVE

         2          1            (PMON)                ACTIVE

如果某個使用者的會話無響應,可以手工結束他

例子:結束某個使用者的會話

SQL> select sid,serial#,username,program,status from v$session where username is not null;

       SID    SERIAL# USERNAME   PROGRAM                                  STATUS

---------- ---------- ---------- ---------------------------------------- --------

         1          5 SYS        (TNS V1-V3)          INACTIVE

45         51 HR (TNS V1-V3)          INACTIVE

        46         65 SYS        (TNS V1-V3)          ACTIVE

SQL> alter system kill session '45,51' immediate;

System altered.

SQL> select sid,serial#,username,program,status from v$session where username is not null;

       SID    SERIAL# USERNAME   PROGRAM                                  STATUS

---------- ---------- ---------- ---------------------------------------- --------

         1          5 SYS        (TNS V1-V3)          INACTIVE

        46         65 SYS        (TNS V1-V3)          ACTIVE


2、資料庫記憶體結構

前面說了,Oracle資料庫伺服器包括例項和資料庫。客戶端發出的SQL命令由伺服器程式響應,在記憶體區域內進行語法分析、編譯和執行,將修改資訊寫入日誌檔案,再將修改後的資料寫入資料檔案,最後將SQL執行的結果反饋給使用者。不同的作業系統以及資料庫的配置,會有不同的記憶體結構,這裡我們的資料庫主要執行在Linux下,主要學習Linux下的Oracle的記憶體結構,暫不去討論Windows的記憶體結構。

4c0da0934ac7426e0f435ee7e1e4ee8d__1.jpg

例項又由記憶體和後臺程式組成

clipboard[5]

我們先來看記憶體結構,如下圖:

clipboard[6]

clipboard[7]

記憶體結構又主要分為2個部分:

  • System Global Area (SGA):包含資料和控制資訊的共享記憶體區域。這句話可以說是SGA的定義。雖然簡單,但其中闡述了SGA幾個很重要的特性:1、SGA的構成——資料和控制資訊;2、SGA是共享的,即當有多個使用者同時登入了這個例項,SGA中的資訊可以被它們同時訪問;3、一個SGA只服務於一個例項,也就是說,當一臺機器上有多個例項執行時,每個例項都有一個自己的SGA,儘管SGA來自於OS的共享記憶體區,但例項之間不能相互訪問對方的SGA區。
  • Program Global Areas (PGA):包含一個伺服器程式或者後臺程式的資料和控制資訊的私有記憶體區域。它是Oracle在一個伺服器程式或者後臺程式啟動時建立的非共享記憶體,一個PGA也只能被擁有它的那個伺服器程式所訪問。PGA的總和成為instance PGA。

System Global Area (SGA)主要由以下部分組成:

  • 共享池(Shared Pool)
  • 資料庫緩衝區快取(Buffer Cache)
  • 重做日誌緩衝(Redo Log Buffer)
  • 大池(Large Pool)
  • Java池(Java Pool)
  • 流池(Streams Pool)

(1)共享池(Shared Pool)

clipboard[8]

共享池(Shared Pool)由庫快取(Library Cache)、資料字典快取(Data Dictionary Cache)、SQL查詢結果及PL/SQL函式結果快取、並行執行訊息的緩衝以及控制結構組成。在Oracle 11g中,Shared Pool的大小建議由系統自動管理。

例子:檢視共享池的大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Shared Pool Size';

NAME                             BYTES/1024/1024

-------------------------------- ---------------

Shared Pool Size                             168

庫快取(Library Cache)

Library Cache是用於儲存可執行的SQL和PL/SQL程式碼的共享池記憶體結構,包括共享的SQL和PL/SQL區域以及控制結構(如鎖、庫快取控制程式碼)。用於解析SQL語句,解析和編譯PL/SQL程式,生成SQL執行計劃。如果是共享服務模式,那麼庫快取還包括私有SQL區域。

當執行一個SQL語句,如果該SQL語句的解析已經存在於庫快取且可以被共享,則資料庫直接使用已有的解析,我們稱之為軟解析或者庫快取命中,否則就需要建立一個新的解析,我們稱之為硬解析或者庫快取命中失敗。

共享SQL區和私有SQL區

clipboard[9]

Oracle會為每一條SQL語句執行提供一個共享SQL區(Shared SQL Areas)和私有SQL區(專用模式下Private SQL Areas屬於PGA)。

一個共享SQL區中儲存了一條語句的解析樹和查詢計劃。當發現兩個(或多個)使用者都在執行同一SQL語句時,Oracle會重新組織SQL區,使這些使用者能重用共享SQL區。但還會在私有SQL區中儲存一份這條SQL語句的複製。

就是說執行SQL語句的每一個會話在他的PGA裡面都有一個私有SQL區,執行同一SQL語句的使用者的私有SQL區都指向同一個共享SQL區,因此,在不同PGA裡面的私有SQL區可以關聯同一個共享SQL區。在多使用者系統中,Oracle透過為SQL語句使用同一共享SQL區多次執行來節省記憶體。

當一條新的SQL語句被解析時,Oracle從共享池中分配一塊記憶體作為共享SQL區。這塊記憶體的大小與這條語句的複雜性相關。如果Shared Pool沒有足夠空間分配給共享SQL區,Oracle將釋放從LRU(Least Recently Used)連結串列中查詢到最近最少使用的記憶體塊,直到有足夠空間給新的語句的共享SQL區。如果Oracle釋放的是一個共享SQL區的記憶體,那麼相應的語句在下次執行時需要再次解析並重新分配共享SQL區。而從解析語句到分配共享SQL區是一個比較消耗CPU的工程。這就是為什麼我們提倡使用繫結變數的原因了。在沒有使用繫結變數時,語句中的變數的數值不同,oracle就視為一條新的語句(9i後可以透過cursor_sharing來控制),重複上面的解析、記憶體分配的動作,將大大消耗系統資源,降低系統效能。

資料字典快取(Data Dictionary Cache)

資料字典是有關於資料庫的參考資訊、資料庫的結構資訊和資料庫中的使用者資訊的一組表和檢視的集合,如我們常用到的V$檢視、DBA_檢視都屬於資料字典。在SQL語句解析的過程中,Oracle頻繁的訪問(如果需要的話)這些資料字典,因此記憶體中有兩處地方被專門用於存放資料字典。一個地方就是資料字典快取(Data Dictionary Cache)。資料字典快取也被稱為行快取(Row Cache),因為它是以記錄行為單元儲存資料的,而不像Buffer Cache是以資料塊為單元儲存資料。記憶體中另外一個儲存資料字典的地方是庫快取。所有Oracle的使用者都可以訪問這兩個地方以獲取資料字典資訊。

在SQL Trace中,這種對資料字典的訪問就被統計為回撥(recursive calls)。

例子:檢視SQL語句執行的回撥資訊

SQL> set linesize 150

SQL> set autotrace traceonly

SQL> select * from hr.employees;

107 rows selected.

Execution Plan

----------------------------------------------------------

Plan hash value: 1445457117

-------------------------------------------------------------------------------

| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |

-------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |           |   107 |  7383 |     3   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| EMPLOYEES |   107 |  7383 |     3   (0)| 00:00:01 |

-------------------------------------------------------------------------------

Statistics

----------------------------------------------------------

149  recursive calls

          0  db block gets

        245  consistent gets

         17  physical reads

          0  redo size

      10427  bytes sent via SQL*Net to client

        596  bytes received via SQL*Net from client

          9  SQL*Net roundtrips to/from client

          9  sorts (memory)

          0  sorts (disk)

        107  rows processed

SQL> select * from hr.employees;

107 rows selected.

Execution Plan

----------------------------------------------------------

Plan hash value: 1445457117

-------------------------------------------------------------------------------

| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |

-------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |           |   107 |  7383 |     3   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| EMPLOYEES |   107 |  7383 |     3   (0)| 00:00:01 |

-------------------------------------------------------------------------------

Statistics

----------------------------------------------------------

0  recursive calls

          0  db block gets

         14  consistent gets

          0  physical reads

          0  redo size

      10427  bytes sent via SQL*Net to client

        596  bytes received via SQL*Net from client

          9  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

        107  rows processed

伺服器結果快取(Server Result Cache)

伺服器結果快取是Oracle 11g的新特性,包括SQL查詢結果快取和PL/SQL函式結果快取,當sql執行時,資料庫先去result cache查詢相關結果;當結果相關的物件發生變化,例如相關表的資料被刪除一條,則結果快取失效。

保留池(Reserved Pool)

前面提到,如果Oracle解析一個 PL/SQL程式單元,也需要從共享池中分配記憶體給這些程式單元物件。由於這些物件本一般比較大(如包),所以分配的記憶體空間也相對較大。系統經過長時間執行後,共享池可能存在大量記憶體碎片,導致無法滿足對於大塊記憶體段的分配。

為了使有足夠空間快取大程式塊,Oracle專門從共享池分配一塊記憶體儲存這些大塊。這個保留池的預設大小是共享池的5%。它的大小也可以透過引數SHARED_POOL_RESERVED_SIZE來調整。保留池是從共享池中分配,不是直接從SGA中分配的,它是共享池的保留部分,用於儲存大塊段。

Shared Pool中記憶體大於5000位元組的大段就會被存放在共享池的保留部分。而這個大小限制是透過隱含引數_SHARED_POOL_RESERVED_MIN_ALLOC來設定的(如前面所說,隱含引數不要去修改它)。除了在例項啟動過程中,所有小於這個數的記憶體段永遠都不會放到保留部分中,而大於這個值的大記憶體段也永遠不會存放到非保留池中,即使共享池的空間不夠用的情況下也是如此。

保留池的空閒記憶體也不會被包含在普通共享池的空閒列表中。它會維護一個單獨的空閒列表。保留池也不會在它的LRU列表中存放可重建段。當釋放普通共享池空閒列表上的記憶體時是不會清除這些大段的,同樣,在釋放保留池的空閒列表上的大記憶體段時也不會清除普通共享池中記憶體。

透過檢視V$SHARED_POOL_RESERVED可以查到保留池的統計資訊。其中欄位REQUEST_MISSES記錄了沒有立即從空閒列表中得到可用的大記憶體段請求次數,這個值要為0。因為保留池必須要有足夠個空閒記憶體來適應那些短期的記憶體請求,而無需將那些需要長期cache住的沒被pin住的可重建的段清除。否則就需要考慮增大SHARED_POOL_RESERVED_SIZE了。

你可以透過觀察檢視V$SHARED_POOL_RESERVED的MAX_USED_SIZE欄位來判斷保留池的大小是否合適。大多數情況下,你會觀察到保留池是很少被使用的,也就是說5%的保留池空間可能有些浪費。但這需要經過長期觀察來決定是否需要調整保留池大小。

例子:檢視引數SHARED_POOL_RESERVED_SIZE

SQL> show parameter SHARED_POOL_RESERVED_SIZE

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

shared_pool_reserved_size            big integer 6M

例子:檢視共享池的保留池中,沒有立即從空閒列表中得到可用的大記憶體段請求次數

SQL> select request_misses from v$shared_pool_reserved;

REQUEST_MISSES

--------------

             0

共享池的記憶體管理

通常來說,共享池是根據修正過的LRU演算法來釋放其中的物件(共享SQL區和資料自動記錄行)的,否則這些物件就一直保持在共享池中。如果共享池需要為一個新物件分配記憶體,並且共享池中沒有足夠記憶體時,記憶體中那些不經常使用的物件就被釋放掉。一個被許多會話使用過的共享池物件,即使最初建立它的程式已經結束,只要它是有用的,都會被修正過的LRU演算法一直保持在共享池中。這樣就使一個多使用者的Oracle系統對SQL語句的處理和記憶體消耗最小。

當一條SQL語句被提交給Oracle執行,Oracle會自動執行以下的記憶體分配步驟:

  1. Oracle檢查共享池,看是否已經存在關於這條語句的共享SQL區。如果存在,這個共享SQL區就被用於執行這條語句。而如果不存在,Oracle就從共享池中分配一塊新的共享SQL區給這條語句。同時,無論共享SQL區存在與否,Oracle都會為使用者分配一塊私有SQL區以儲存這條語句相關資訊(如變數值)。
  2. Oracle為會話分配一個私有SQL區。私有SQL區的所在與會話的連線方式相關。

在以下情況下,Oracle也會將共享SQL區從共享池中釋放出來:

  • 當使用ANALYZE語句更新或刪除表、簇或索引的統計資訊時,所有與被分析物件相關的共享SQL區都被從共享池中釋放掉。當下一次被釋放掉的語句被執行時,又重新在一個新的共享SQL區中根據被更新過的統計資訊重新解析
  • 當物件結構被修改過後,與該物件相關的所有共享SQL區都被標識為無效(invalid)。在下一次執行語句時再重新解析語句
  • 如果資料庫的全域性資料庫名(Global Database Name)被修改了,共享池中的所有資訊都會被清空掉
  • DBA透過ALTER SYSTEM FLUSH SHARED_POOL手工方式清空共享池

例子:手動清空共享池

SQL> alter system flush shared_pool;

System altered.

(2)資料庫緩衝區快取(Database Buffer Cache)

clipboard[10]

Database Buffer Cache也叫Buffer Cache,是SGA區中專門用於存放從資料檔案中讀取的的資料塊複製的區域。Oracle程式如果發現需要訪問的資料塊已經在Buffer Cache中,就直接讀寫記憶體中的相應區域,而無需讀取資料檔案,從而大大提高效能。Buffer Cache對於所有Oracle程式都是共享的,能被所有Oracle使用者訪問。在Oracle 11g中,Database Buffer Cache的大小建議由系統自動管理。

例子:檢視資料庫緩衝區快取的大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Buffer Cache Size';

NAME                             BYTES/1024/1024

-------------------------------- ---------------

Buffer Cache Size                            332

Buffer有三種狀態:

  • Unused:沒有被使用的Buffer,資料庫優先使用
  • Clean:已經被使用過但包含的是clean的資料,就是目前和磁碟上的資料一致,可以重複使用
  • Dirty:包含的是修改後資料,但是還沒有寫入到磁碟,與磁碟上面的資料不一致

Buffer有兩種訪問模式:

  • Current mode:指當前使用者訪問當前修改後未提交事務的資料,獲取的就是當前Buffer Cache裡面的資料塊
  • Consistent mode:指其他使用者訪問當前使用者修改後未提交事務的資料,獲取的是undo裡面的讀一致性的資料塊

Oracle對於buffer cache的管理,是透過兩個重要的連結串列實現的:寫連結串列和最近最少使用連結串列(the Least Recently Used LRU)。寫連結串列所指向的是所有髒資料塊快取。而LRU連結串列指向的是所有空閒的快取、pin住的快取以及還沒有來的及移入寫連結串列的髒快取。空閒快取中沒有任何有用的資料,隨時可以使用。而pin住的快取是當前正在被訪問的快取。LRU連結串列的兩端就分別叫做最近使用端(the Most Recently Used MRU)和最近最少使用端(LRU)。

當一個Oracle程式訪問一個快取時,這個程式會將這塊快取移到LRU連結串列中的MRU。而當越來越多的緩衝塊被移到MRU端,那些已經過時的髒緩衝(即資料改動已經被寫入資料檔案中,此時緩衝中的資料和資料檔案中的資料已經一致)則被移到LRU連結串列中LRU端。

當一個Oracle使用者程式第一次訪問一個資料塊時,它會先查詢buffer cache中是否存在這個資料塊的複製。如果發現這個資料塊已經存在於buffer cache(即命中cache hit),它就直接讀從記憶體中取該資料塊。如果在buffer cache中沒有發現該資料塊(即未命中cache miss),它就需要先從資料檔案中讀取該資料塊到buffer cache中,然後才訪問該資料塊。命中次數與程式讀取次數之比就是我們一個衡量資料庫效能的重要指標:buffer hit ratio(buffer命中率)。

例子:獲得自例項啟動至今的buffer命中率

SQL> select 1-(sum(decode(name,'physical reads',value,0))/

  2           (sum(decode(name,'db block gets',value,0))+

  3           (sum(decode(name,'consistent gets',value,0))))) "Buffer Hit Ration"

  4  from v$sysstat;

Buffer Hit Ration

-----------------

       .984403316

根據經驗,一個良好效能的系統,這個值一般保持在95%以上。

上面提到如果未命中(missed),則需要先將資料塊讀取到快取中去。這時Oracle程式需要從空閒列表

中找到一個適合大小的空閒buffer。如果空閒列表中沒有適合大小的空閒buffer,它就會從LRU端開始查詢LRU連結串列,直到找到一個可重用的快取塊或者達到最大查詢塊數限制。在查詢過程中,如果程式找到一個髒快取塊,它將這個快取塊移到寫連結串列中去,然後繼續查詢。當它找到一個空閒塊後,就從磁碟中讀取資料塊到快取塊中,並將這個快取塊移到LRU連結串列的MRU端。

當有新的物件需要請求分配buffer時,會透過記憶體管理模組請求分配空閒的或者可重用的buffer。“free buffer requested”就是產生這種請求的次數;當請求分配buffer時,已經沒有適合大小的空閒buffer時,需要從LRU連結串列上獲取到可重用的buffer。但是LRU連結串列上的buffer並非都是立即可重用的,還會存在一些塊正在被讀寫或者已經被別的使用者所等待。根據LRU演算法,查詢可重用的buffer是從連結串列的LRU端開始查詢的,如果這一段的前面存在這種不能立即被重用的buffer,則需要跳過去,查詢連結串列中的下一個buffer。“free buffer inspected”就是被跳過去的buffer的數目。

例子:檢視系統目前free buffer requested和free buffer inspected的值

SQL> select name,value from v$sysstat where name in ('free buffer requested','free buffer inspected');

NAME                                                                  VALUE

---------------------------------------------------------------- ----------

free buffer requested                                                 39220

free buffer inspected                                                     0

如果Oracle使用者程式達到查詢塊數限制後還沒有找到空閒快取,它就停止查詢LRU連結串列,並且透過訊號通知DBW0程式將髒快取寫入磁碟去。

由於Buffer Cache中存放的是從資料檔案中來的資料塊的複製,因此它的大小的計算也是以塊的尺寸為基數的。而資料塊的大小是由引數db_block_size指定的。9i以後,塊的大小預設是8K,它的值一般設定為和作業系統的塊尺寸相同或者它的倍數。每次讀多少塊是由引數db_file_multiblock_read_count來控制的,在Oracle10gR2以前的版本中,DBA必須根據db_block_size引數,以及應用系統的特性,來調整db_file_multiblock_read_count引數。在Oracle10gR2及其之後的版本中,Oracle資料庫已經可以根據系統的IO能力以及Buffer Cache的大小來動態調整該引數值,Oracle建議不要顯式設定該引數值。

例子:檢視引數db_block_size

SQL> show parameter db_block_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_block_size                        integer     8192

從9i開始,Oracle支援建立不同塊尺寸的表空間,並且可以為不同塊尺寸的資料塊指定不同大小的buffer cache。9i以後,除了SYSTEM表空間和TEMPORARY表空間必須使用標準塊尺寸外,所有其他表空間都可以最多指定四種不同的塊尺寸。而標準塊尺寸還是由上面的所說的引數db_block_size來指定。而db_cache_size則是標準塊尺寸的buffer cache的大小。

非標準塊尺寸的塊大小可以在建立表空間(CREATE TABLESPACE)時透過BLOCKSIZE引數指定。而不同塊尺寸的buffer cache的大小就由相應引數DB_nK_CACHE_SZIE來指定,其中n可以是2,4,8,16或者32。需要先設定DB_nK_CACHE_SIZE來指定快取這個表空間資料塊的buffer cache的大小,然後才能建立了一個塊大小為nK的非標準塊尺寸的表空間。

任何一個尺寸的Buffer Cache都是不可以快取其他尺寸的資料塊的。因此如果你打算使用多種塊尺寸用於你的資料庫的儲存,你需要給你要用到的非標準塊尺寸的資料塊指定相應的Buffer Cache大小。這些引數使你可以為系統指定多達4種不同塊尺寸的Buffer Cache。

特別注意,DB_nK_CACHE_SIZE 引數不能設定標準塊尺寸的緩衝區大小。舉例來說,如果 DB_BLOCK_SIZE 設定為 4K,就不能再設定 DB_4K_CACHE_SIZE 引數。

例子:是否可以設定設定db_8k_cache_size大小

SQL> alter system set db_8k_cache_size=200m scope=both;

alter system set db_8k_cache_size=200m scope=both

*

ERROR at line 1:

ORA-32017: failure in updating SPFILE

ORA-00380: cannot specify db_8k_cache_size since 8K is the standard block size

例子:建立一個非標準塊的表空間,假定塊大小為16k

先檢視DB_nK_CACHE_SZIE引數,為0表示還沒有啟用

SQL> show parameter db_16k_cache_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_16k_cache_size                    big integer 0

直接建立表空間會報錯

SQL> create tablespace ts01 datafile '+DATA/stone/datafile/ts01.dbf' size 10m blocksize 16K;

create tablespace ts01 datafile '+DATA/stone/datafile/ts01.dbf' size 10m blocksize 16K

*

ERROR at line 1:

ORA-29339: tablespace block size 16384 does not match configured block sizes

為非標準塊尺寸的資料塊指定相應的Buffer Cache大小

SQL> alter system set db_16k_cache_size=1m scope=both;

System altered.

SQL> show parameter db_16k_cache_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_16k_cache_size                    big integer 4M

即使修改時指定的是1M,修改之後系統會自動給出一個最小的4M大小,這個引數受Granule Size控制。小於4M系統自動設定為4M,大於4M,就是4M的整數倍。

SQL> select * from v$sgainfo where name='Granule Size';

NAME                                  BYTES RES

-------------------------------- ---------- ---

Granule Size                        4194304 No

然後再來建立表空間就可以了

SQL> create tablespace ts01 datafile '+DATA/stone/datafile/ts01.dbf' size 10m blocksize 16k;

Tablespace created.

可以將database buffer cache分成不同的buffer pool,達到不同的cache資料的目的。有以下三種:

  • 預設緩衝池(Default pool),塊正常快取的緩衝池,如果沒有指定其他的緩衝池,那database buffer cache就是預設的緩衝池
  • 保持緩衝池(Keep pool),用於快取那些需要經常查詢的物件但又容易被預設緩衝區置換出去的物件,可以更久被保留。它的大小由引數DB_KEEP_CACHE_SZIE控制
  • 回收緩衝池(Recycle pool),用於快取臨時使用的、不被經常使用的較大的物件,可以更快被清除。它的大小由引數DB_RECYLE_CACHE_SIZE指定

這三個引數相互之間是獨立的,並且他們都只適用於標準塊尺寸的資料塊。

(理論上講,預設池中的物件應該足夠熱(也就是說,用得足夠多),可以保證一直呆在快取中。快取會把它們一直留在記憶體中,因為它們是非常熱門的塊。可能還有 一些段相當熱門,但是並不太熱;這些塊就作為溫塊。這些段的塊可以從快取重新整理輸出,為不常用的一些塊(“不適合快取”塊)騰出空間。為了保持這些溫段的塊得到快取,可以採取下面的某種做法:將這些段分配到保持池,力圖讓溫塊在緩衝區快取中停留得更久。將“不適合快取”段分配到回收池,讓回收池相當小,以便塊能快速地進入快取和離開快取(減少管理的開銷)。這樣會增加DBA 所要執行的管理工作,因為要考慮3 個快取,要確定它們的大小,還要為這些快取分配物件。還要記住,這些池之間沒有共享,所以,如果保持池有大量未用的空間,即使預設池或回收池空間不夠用了, 保持池也不會把未用空間交出來。總之,這些池一般被視為一種非常精細的低階調優裝置,只有所有其他調優手段大多用過之後才應考慮使用。)

(3)重做日誌緩衝(Redo Log Buffer)

clipboard[11]

Redo Log Buffer是SGA中一段儲存資料庫修改資訊的快取。這些資訊被儲存在重做條目(Redo Entries)中。重做條目中包含了由於INSERT、UPDATE、DELETE、CREATE、ALTER或DROP所做的修改操作而需要對資料庫重新組織或重做的必須資訊。在必要時,重做條目還可以用於資料庫恢復。

重做條目是Oracle資料庫程式從使用者記憶體中複製到Redo Log Buffer中去的。重做條目佔用重做日誌緩衝連續的空間,迴圈寫入。後臺程式LGWR負責將Redo Log Buffer中的資訊寫入到磁碟上聯機重做日誌檔案。

例子:檢視重做日誌緩衝的大小

SQL> select name,bytes from v$sgainfo where name='Redo Buffers';

NAME                                  BYTES

-------------------------------- ----------

Redo Buffers                        2371584

SQL> select name,bytes from v$sgastat where name='log_buffer';

NAME                            BYTES

-------------------------- ----------

log_buffer                    2371584

一般預設情況下的log_buffer的大小夠用了,檢視Log_buffer是否需要調整,可以檢視資料庫是否有大量的log buffer space等待事件出現。redo log 最開始是在pga中的uga產生的(資料庫一般是專有模式),oracle會把它複製到SGA中的log_buffer中去,如果log_buffer過小,或者lgwr不能夠快速將redo 寫入到log file中,那麼就會產生log buffer space等待事件,遇到此類問題,可以增加 log_buffer大小,調整log file到裸裝置,I/O快的磁碟中。

(4)大池(Large Pool)

大池是SGA中的一塊可選記憶體池,根據需要時配置。在以下情況下需要配置大池:

  • 用於共享服務(Shared Server MTS方式中)的會話記憶體和Oracle分散式事務處理的Oracle XA介面
  • 使用並行查詢(Parallel Query Option PQO)時
  • IO服務程式
  • Oracle備份和恢復操作(啟用了RMAN時)

透過從大池中分配會話記憶體給共享服務、Oracle XA或並行查詢,Oracle可以使用共享池主要來快取共享SQL,以防止由於共享SQL快取收縮導致的效能消耗。此外,為Oracle備份和恢復操作、IO服務程式和並行查詢分配的記憶體一般都是幾百K,這麼大的記憶體段從大池比從共享池更容易分配得到。

例子:檢視大池的大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Large Pool Size';

NAME                             BYTES/1024/1024

-------------------------------- ---------------

Large Pool Size                                8

(5)Java池(Java Pool)

Java池也是SGA中的一塊可選記憶體區,它也屬於SGA中的可變區。Java池的記憶體是用於儲存所有會話中特定

Java程式碼和JVM中資料。Java池的使用方式依賴於Oracle服務的執行模式。不要認為使用Java開發的程式就要用Java池,只是說在資料庫裡面使用Java去編寫了儲存過程才會用到Java池,但是目前很少有人用Java去編寫儲存過程了。Java池的大小可以透過引數JAVA_POOL_SIZE來設定。

例子:檢視Java池的大小

SQL> select name,bytes/1024/1024 from v$sgainfo where name='Java Pool Size';

NAME                             BYTES/1024/1024

-------------------------------- ---------------

Java Pool Size                                 4

(6)流池(Streams Pool)

流池是Oracle 10g中新增加的。是為了增加對流(流複製是Oracle 9iR2中引入的一個非常吸引人的特性,支援異構資料庫之間的複製。10g中得到了完善)的支援。但是現在Oracle的流複製技術用得很少了,因為Oracle收購了Oracle golden gate,可以跨平臺,跨資料庫,Oracle現在主推這個,流複製就用得越來越少了。流池也是可選記憶體區,屬於SGA中的可變區。它的大小可以透過引數STREAMS_POOL_SIZE來指定。如果沒有被指定,流池大小預設為0,Oracle會在第一次使用流時自動建立,根據需要動態增加。

例子:檢視流池的大小

SQL> select name,bytes from v$sgainfo where name='Streams Pool Size';

NAME                                  BYTES

-------------------------------- ----------

Streams Pool Size                         0

Shared Pool、Large Pool、Java Pool和Streams Pool這幾塊記憶體區的大小是跟隨系統引數設定而改變的,所以又通稱為可變SGA(Variable SGA)。

例子:檢視sga的組成

SQL> select * from v$sga;

NAME                      VALUE

-------------------- ----------

Fixed Size              2257840

Variable Size         532679760

Database Buffers      297795584

Redo Buffers            2371584

SQL> show sga;

Total System Global Area  835104768 bytes

Fixed Size                  2257840 bytes

Variable Size             532679760 bytes

Database Buffers          297795584 bytes

Redo Buffers                2371584 bytes

(7)Fixed Size

Fixed Size部分為sga的固定部分,其大小由Oracle資料庫設定且不可手工修改,包含:

  • 資料庫和例項的狀態資訊等通用資訊,後臺程式需要訪問這部分資訊
  • 程式之間的通訊資訊,比如鎖的資訊

例子:檢視Fixed Size的大小

SQL> select name,bytes from v$sgainfo where name='Fixed SGA Size';

NAME                                  BYTES

-------------------------------- ----------

Fixed SGA Size                      2257840


如果資料庫是專用伺服器模式,Program Global Areas (PGA)主要由以下部分組成:

  • Stack Space(堆疊空間)
  • User Global Area(UGA)

其中User Global Area(UGA)包括以下部分:

  • Cursor State:存放遊標的執行資訊(可以把遊標看成私有SQL區)
  • User Sessions Data:存放會話的控制資訊
  • SQL Working Areas:處理SQL語句

其中SQL Working Areas包括以下部分:

  • Sort Area:使用order by或者group by排序資料時會用到這個區域
  • Hash Area:表發生hash jions時會用到這個區域
  • Create Bitmap Area:點陣圖索引建立會用到這個區域
  • Bitmap Merge Area:解析點陣圖索引執行計劃會用到這個區域

clipboard[12]

如果資料庫是共享伺服器模式,Program Global Areas (PGA)只有Stack Space,UGA在SGA裡面,如果配置了大池,UGA在大池,如果沒有配置大池,UGA在共享池。

例子:檢視當前PGA的大小

SQL> select component,current_size/1024/1024,max_size/1024/1024 from v$memory_dynamic_components where component='PGA Target';

COMPONENT            CURRENT_SIZE/1024/1024 MAX_SIZE/1024/1024

-------------------- ---------------------- ------------------

PGA Target                              280                280

SQL> select name,value/1024/1024 from v$pgastat where name='aggregate PGA target parameter';

NAME                                     VALUE/1024/1024

---------------------------------------- ---------------

aggregate PGA target parameter                       280

例子:檢視排序區,hash區,點陣圖區,點陣圖合併區的大小

SQL> show parameter sort_area_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sort_area_size                       integer     65536

SQL> show parameter hash_area_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

hash_area_size                       integer     131072

SQL> show parameter create_bitmap_area_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

create_bitmap_area_size              integer     8388608

SQL> show parameter bitmap_merge_area_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

bitmap_merge_area_size               integer     1048576

例子:檢視遊標(私有SQL區)的數量

SQL> show parameter open_cursors

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

open_cursors                         integer     300

open_cursors設定一個會話可以同時開啟的遊標數。由於每開啟一個遊標,都需要一部分PGA記憶體分配出來作為私有SQL區。因此這個引數也影響了每個程式的PGA記憶體的佔用大小。

例子:檢視每個session 的pga記憶體使用

SQL> select p.username,p.spid,p.program,pm.category,pm.used,pm.allocated,pm.max_allocated

  2  from v$process p join v$process_memory pm on p.pid=pm.pid

  3  join v$session s on s.paddr=p.addr and s.username is not null;

USERNAME   SPID       PROGRAM                        CATEGORY              USED  ALLOCATED MAX_ALLOCATED

---------- ---------- ------------------------------ --------------- ---------- ---------- -------------

oracle     42393      (TNS V1-V3) SQL                  27496      40240       4892600

oracle     42393      (TNS V1-V3) PL/SQL                 224       2008          2008

oracle     42393      (TNS V1-V3) Freeable                 0    1048576

oracle     42393      (TNS V1-V3) Other                         2179302       2179302

grid       42463                   SQL                  12968      89472        820392

grid       42463                   PL/SQL               18848      25064         27352

grid       42463                   Freeable                 0    1048576

grid       42463                   Other                         2491862       2741694

grid       42469                   SQL                    152      71032       3204032

grid       42469                   PL/SQL               43344      90696         95976

grid       42469                   Freeable                 0     524288

USERNAME   SPID       PROGRAM                        CATEGORY              USED  ALLOCATED MAX_ALLOCATED

---------- ---------- ------------------------------ --------------- ---------- ---------- -------------

grid       42469                   Other                         3231102      11692694

12 rows selected.

可以分成以下三步:

先從v$session獲取paddr

SQL> select username,sid,paddr from v$session where username is not null;

USERNAME                              SID PADDR

------------------------------ ---------- ----------------

SYS                                    43 00000000917AF190

SYS                                    44 00000000917B0248

SYS                                    52 00000000917B3470

再從v$process獲取對應paddr的spid

SQL> select addr,pid,spid,username from v$process where addr in ('00000000917AF190','00000000917B0248','00000000917B3470');

ADDR                    PID SPID                     USERNAME

---------------- ---------- ------------------------ ---------------

00000000917AF190         35 42393                    oracle

00000000917B0248         36 42463                    grid

00000000917B3470         39 42469                    grid

再用v$process_memory與v$process關聯就可以了 

SQL> select p.username,p.spid,p.program,pm.category,pm.used,pm.allocated,pm.max_allocated

  2  from v$process p join v$process_memory pm on p.pid=pm.pid

  3  where p.spid=42393;

USERNAME   SPID       PROGRAM                        CATEGORY              USED  ALLOCATED MAX_ALLOCATED

---------- ---------- ------------------------------ --------------- ---------- ---------- -------------

oracle     42393      (TNS V1-V3) SQL                  14696      27848       4892600

oracle     42393      (TNS V1-V3) PL/SQL                 224       2008          2008

oracle     42393      (TNS V1-V3) Freeable                 0     720896

oracle     42393      (TNS V1-V3) Other                         2519374       2519374


3、資料庫程式結構

4c0da0934ac7426e0f435ee7e1e4ee8d__1.jpg[1]

Oracle資料庫的程式分為3類:

  • 使用者程式:執行連線到oracle資料庫的應用或者工具的程式碼
  • 資料庫程式:執行Oracle資料庫自己的程式碼,包括伺服器程式及後臺程式
  • Oracle守護程式及應用程式:包括監聽和GI的程式,這些程式不僅僅用於一個資料庫

使用者程式(客戶端程式)用於執行連線到oracle資料庫的應用或者工具的程式碼,當使用者執行一個基於Oracle資料庫的應用程式時,客戶端作業系統就會建立一個使用者程式。使用者程式可以在資料庫伺服器上面,也可以不在資料庫伺服器上面。

伺服器程式用於處理連線到該例項的使用者程式的請求,主要任務包括:

  • 解析並執行使用者所提交的SQL語句
  • 搜尋SGA區的資料庫快取,決定是否讀取資料檔案。如果資料塊不在SGA區的資料庫快取中,就將其從資料檔案中讀入
  • 將查詢執行的結果資料返回給使用者

例子:在客戶端建立一個到資料庫的連線,檢視使用者程式和伺服器程式

C:\Users\shilei>sqlplus hr/hr@192.168.230.138:1521/stone

SQL*Plus: Release 11.2.0.1.0 Production on 星期三 11月 18 08:52:00 2015

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

連線到:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

檢視使用者程式

C:\Users\shilei>tasklist | findstr sqlplus

sqlplus.exe                  22764 Console                    1     30,036 K

檢視對應的伺服器程式,其中“LOCAL=NO”表示不是本地連線,是一個遠端連線

[ ~]$ ps -ef | grep LOCAL=NO | grep -v grep

oracle    3625     1  0 08:52 ?        00:00:00 oraclestone (LOCAL=NO)

我們在建立資料庫的時候,會讓你選擇資料庫的工作模式,是專用模式還是共享模式,不同模式下Oracle的伺服器程式是不一樣的,這裡看一下這兩種模式的區別。

Dedicated Server(專用伺服器模式):資料庫為每一個使用者程式分配一個伺服器程式為其服務

下圖表示使用者透過網路連線資料庫時專用伺服器模式下使用者程式和伺服器程式之間的關係。

clipboard[13]

在專用伺服器架構下,有以下兩種通訊機制

  • 如果使用者程式和專業伺服器程式在一臺機器上面,則使用作業系統的內部程式進行通訊
  • 如果使用者程式和專業伺服器程式在不同機器上面,則使用網路進行通訊

Shared Server(共享伺服器模式):使用排程器引導網路會話請求到共享伺服器程式池,使用共享伺服器模式可以減少作業系統的程式數量以及PGA,但是會增大響應時間,提高安裝和調優的複雜性,故目前大多數情況下都沒有使用,具體實現方式就不講了。

clipboard[14]

Oracle在例項啟動的時候自動建立多個後臺程式來操作管理資料庫,每個後臺程式都有各自的任務,可以透過v$process檢視檢視有哪些後臺程式在執行。

例子:檢視有哪些後臺程式在執行

SQL> select pname from v$process where pname is not null order by pname;

PNAME

-----

ARC0

ARC1

ARC2

ARC3

CJQ0

CKPT

D000

DBRM

DBW0

DIA0

DIAG

PNAME

-----

GEN0

LGWR

MMAN

MMNL

MMON

PMON

PSP0

Q001

Q002

QMNC

RECO

PNAME

-----

S000

SMCO

SMON

VKTM

W001

27 rows selected.

也可以透過作業系統檢視,後臺程式在作業系統上面的名稱為“ora_後臺程式名稱_例項名稱”

[ ~]# ps -ef | grep _stone | grep -v grep

oracle    2436     1  0 Nov18 ?        00:00:09 ora_pmon_stone

oracle    2438     1  0 Nov18 ?        00:00:16 ora_psp0_stone

oracle    2440     1  2 Nov18 ?        00:24:47 ora_vktm_stone

oracle    2444     1  0 Nov18 ?        00:00:02 ora_gen0_stone

oracle    2446     1  0 Nov18 ?        00:00:04 ora_diag_stone

oracle    2448     1  0 Nov18 ?        00:00:03 ora_dbrm_stone

oracle    2450     1  0 Nov18 ?        00:00:58 ora_dia0_stone

oracle    2452     1  0 Nov18 ?        00:00:02 ora_mman_stone

oracle    2454     1  0 Nov18 ?        00:00:09 ora_dbw0_stone

oracle    2456     1  0 Nov18 ?        00:00:10 ora_lgwr_stone

oracle    2458     1  0 Nov18 ?        00:00:23 ora_ckpt_stone

oracle    2460     1  0 Nov18 ?        00:00:07 ora_smon_stone

oracle    2462     1  0 Nov18 ?        00:00:00 ora_reco_stone

oracle    2464     1  0 Nov18 ?        00:00:18 ora_mmon_stone

oracle    2466     1  0 Nov18 ?        00:00:31 ora_mmnl_stone

oracle    2468     1  0 Nov18 ?        00:00:01 ora_d000_stone

oracle    2470     1  0 Nov18 ?        00:00:00 ora_s000_stone

oracle    2478     1  0 Nov18 ?        00:00:01 ora_arc0_stone

oracle    2480     1  0 Nov18 ?        00:00:01 ora_arc1_stone

oracle    2482     1  0 Nov18 ?        00:00:01 ora_arc2_stone

oracle    2484     1  0 Nov18 ?        00:00:01 ora_arc3_stone

oracle    2487     1  0 Nov18 ?        00:00:00 ora_qmnc_stone

oracle    2491     1  0 Nov18 ?        00:00:01 ora_q001_stone

oracle    2509     1  0 Nov18 ?        00:00:13 ora_cjq0_stone

oracle    2757     1  0 Nov18 ?        00:00:02 ora_smco_stone

oracle    9575     1  0 08:31 ?        00:00:00 ora_q002_stone

oracle   12657     1  0 15:00 ?        00:00:00 ora_w001_stone

例子:透過v$bgprocess檢視來檢視Oracle有哪些後臺以及描述

SQL> select name,description from v$bgprocess;

NAME  DESCRIPTION

----- ----------------------------------------------------------------

PMON  process cleanup

VKTM  Virtual Keeper of TiMe process

我們看到Oracle在非RAC和RAC環境下的後臺程式有所不同。

clipboard[15]

在非RAC環境下,後臺程式分為必要和可選兩類,此處先看必要的幾個程式,RAC的相關程式後面在ASM章節再講,可選的程式用到的時候再講。

(1)DBWn(Database Writer)資料庫寫程式
將資料庫緩衝區快取中修改的塊(Dirty)寫入資料檔案中。引數DB_WEITER_PROCESSES定義DBWn程式的數量。大多數情況下一個資料庫寫程式(DBW0)就足夠了,但是如果你的資料庫資料量改動頻繁和大量,可以增加額外的資料庫寫程式(DBW0-DBW9,DBWa-DBWz,最多36個,不要超過CPU的數量)以提高效能,但對於單CPU系統來說,只能有一個資料庫寫程式。

例子:檢視當前系統DBWn的數量以及最大的數量

SQL> show parameter db_writer_processes

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_writer_processes                  integer     1

SQL> select pname from v$process where pname like '%DBW%';

PNAME

-----

DBW0

[ ~]$ ps -ef | grep dbw | grep -v grep

oracle    2454     1  0 Nov19 ?        00:00:13 ora_dbw0_stone

最大數量

SQL> select count(*) from v$bgprocess where name like '%DBW%';

  COUNT(*)

----------

        36

觸發DBWn寫資料庫緩衝區快取中的髒塊到磁碟的條件有:

  • 當伺服器程式在掃描了一定數量的資料庫緩衝區快取還找不到可用的乾淨塊來寫入,則通知DBWn將髒塊寫入到磁碟
  • DBWn定期的寫buffer,來推進檢查點(例項恢復必須開始的redo thread position)

在許多情況下,DBWn寫的資料分散在整個磁碟(scattered write)。因此,DBWn寫往往比LGWR的順序寫慢。DBWn執行多塊寫時可能提高效率,多塊寫入的數目與作業系統有關。

(2)LGWR(Log Writer)日誌寫程式

將重做日誌緩衝區的資料順序寫入(sequential write)到磁碟的聯機重做日誌檔案。一個例項只有一個LGWR程式

例子:檢視當前系統的LGWR

SQL> select pname from v$process where pname='LGWR';

PNAME

-----

LGWR

[ ~]$ ps -ef | grep lgwr | grep -v grep

oracle    2456     1  0 Nov20 ?        00:00:19 ora_lgwr_stone

觸發LGWR條件有:

  • 使用者提交事務
  • 發生聯機重做日誌檔案切換
  • 每隔3秒
  • 重做日誌緩衝區1/3滿或者新產生大於1MB的資料
  • DBWR 觸發LGWR寫入

在DBWn將資料庫緩衝區快取中的髒塊寫入到磁碟的資料檔案之前,這些髒塊對應的重做記錄必須先寫入到磁碟的聯機重做日誌檔案,如果DBWn發現對應的重做記錄還沒有寫入到磁碟的聯機重做日誌檔案,則通知LGWR進行寫入,等待寫入完成後,DBWn再進行寫入。

當使用者執行COMMIT語句,事務被分配一個SCN(system change number),LGWR立即將提交記錄、提交SCN以及事務的重做條目一起寫入到磁碟,而對應修改的資料庫緩衝區快取中的髒塊則會延遲到更有效率的時候寫入到磁碟,這就是所謂的快速提交機制,也就是說只要將事務的相應重做資訊透過LGWR寫入到了磁碟,即使該事務修改後的資料還沒有寫入到磁碟,Oracle資料庫就認為已經事務已經完成。

在某些情況下,即使使用者沒有執行COMMIT語句,LGWR也會將事務的重做資訊寫入到磁碟,但是隻有後面使用者執行了COMMIT語句,寫入到磁碟的重做資訊才會永久有效。

(3)CKPT(Checkpoint)檢查點程式

在資料庫系統中,寫聯機重做日誌檔案和寫資料檔案是資料庫中IO消耗最大的兩種操作,在這兩種操作中寫資料檔案屬於分散寫,寫聯機重做日誌檔案是順序寫,因此為了保證資料庫的效能,通常資料庫都是在提交(commit)完成之前要先保證重做日誌都被寫入到聯機重做日誌檔案中,而髒資料塊儲存在資料庫緩衝區快取(buffer cache)中再不定期的分批寫入到資料檔案中。也就是說日誌寫入和提交操作是同步的,而資料寫入和提交操作是不同步的。這樣就存在一個問題,當一個資料庫崩潰的時候並不能保證資料庫緩衝區快取裡面的髒資料全部寫入到資料檔案中,這樣在例項啟動的時候就要使用日誌檔案進行恢復操作,將資料庫恢復到崩潰之前的狀態,保證資料的一致性。檢查點是這個過程中的重要機制,透過它來確定,恢復時哪些日誌應該被掃描並應用於恢復。

例子:檢視當前系統的CKPT

SQL> select pname from v$process where pname='CKPT';

PNAME

-----

CKPT

[ ~]$ ps -ef | grep ckpt | grep -v grep

oracle    2503     1  0 Nov29 ?        00:00:22 ora_ckpt_stone

檢查點程式將檢查點資訊(包括檢查點位置、SCN、開始恢復的聯機重做日誌位置等)寫入控制檔案和資料檔案頭部並通知DBWn將髒塊寫入到磁碟。

clipboard[16]

Checkpoint主要2個作用:

  • 保證資料庫的一致性,這是指通知DBWn將髒塊寫入到磁碟,保證記憶體和磁碟上的資料是一樣的
  • 縮短例項恢復的時間,例項恢復要把例項異常關閉前沒有寫入到硬碟的髒資料透過日誌進行恢復。如果髒塊過多,例項恢復的時間也會很長,檢查點的發生可以減少髒塊的數量,從而提高例項恢復的時間

Oracle資料庫有以下幾種檢查點:

  • Thread checkpoint(執行緒檢查點),資料庫將被某個特定的重做執行緒所修改的所有緩衝區寫入磁碟。資料庫中所有例項的執行緒檢查點的集合即為資料庫檢查點。執行緒檢查點在下列情況下發生:

o 一致的資料庫關閉

o ALTER SYSTEM CHECKPOINT 語句

o 聯機重做日誌切換

o ALTER DATABASE BEGIN BACKUP 語句

  • Tablespace and data file checkpoints(表空間和資料檔案檢查點),表空間檢查點是一組資料檔案檢查點,每個資料檔案檢查點對錶空間中的某個資料檔案做檢查點操作。這些檢查點發生在很多情況下,包括將一個表空間設為只讀、將表空間離線、收縮資料檔案、或執行ALTER TABLESPACE BEGIN BACKUP等。
  • Incremental checkpoints(增量檢查點),增量檢查點是一種執行緒檢查點,部分原因是為了避免在聯機重做日誌切換時寫入大量的塊。DBWn至少每隔三秒會進行檢查以確定是否有工作要做。當 DBWn 將髒緩衝區寫入磁碟時, 它會向前推進檢查點位置,導致CKPT將檢查點位置寫入控制檔案,而不是資料檔案頭。
  • 其他型別的檢查點包括例項和介質恢復檢查點,和刪除或截斷模式物件時的檢查點。

前面LGWR和CKPT都提到了SCN(system change number),那麼SCN到底是什麼呢,SCN用以標識資料庫在某個確切時刻提交的版本。在事務提交時,它被賦予一個唯一的標識事務的SCN。SCN同時被作為Oracle資料庫的內部時鐘機制,可被看做邏輯時鐘,每個資料庫都有一個全域性的SCN生成器。作為資料庫內部的邏輯時鐘,資料庫事務依SCN而排序,Oracle也依據SCN來實現一致性讀(Read Consistency)等重要資料庫功能。SCN在資料庫中是唯一的,並隨時間而增加,但是可能並不連貫。除非重建資料庫,SCN的值永遠不會被重置為0。系統當前SCN並不是在任何的資料庫操作時都會改變,SCN通常在事務提交或回滾時改變。在控制檔案、資料檔案頭、資料庫、日誌檔案頭、日誌檔案change vector中都有SCN,但其作用各不相同。

CKPT一定是是在checkpoint發生的時候將資料庫當前的SCN更新入資料庫檔案頭和控制檔案當中,同時DBWn程式將buffer cache中的髒資料塊寫到資料檔案當中(這個髒資料也一定是當前online redo log保護的那一部分)。同時CKPT程式還會在控制檔案當中記錄(redo block address)RBA,這個地址用來標誌恢復的時候需要從日誌中的那個位置開始。

ORACLE中除了有SCN,還有Checkpoint_Change#,那這兩者的關係是什麼呢,其實Checkpoint_Change#是來源於SCN,SCN是時刻在變化的,Checkpoint_Change#是在資料發生了檢查點的時候才改變的,它的值來源於SCN。因為SCN時刻在變化,無法捕獲到Checkpoint_Change#等於SCN的時刻。

例子:檢視系統當前的SCN

SQL> select dbms_flashback.get_system_change_number() SCN from dual;

       SCN

----------

   2681573

在Oracle資料庫中和checkpoint相關的SCN總共有4個
1)System checkpoint SCN (存在於控制檔案)
在系統執行checkpoint後,Oracle會更新當前控制檔案中的System checkpoint SCN。我們可以透過select checkpoint_change# from v$database來檢視。

例子:檢視當前的System checkpoint SCN

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

------------------

           2678314

2)Datafile checkpoint SCN (存在於控制檔案)
由於控制檔案中記錄了Oracle中各個資料庫檔案的位置和資訊,其中當然也包括了Datafile checkpoint SCN,因此在執行checkpoint的時候,Oracle還會去更新控制檔案中所記錄的各個資料檔案的datafile checkpoint SCN。我們可以透過select checkpoint_change# from v$datafile來檢視。

例子:檢視當前各個資料檔案的Datafile checkpoint SCN

SQL> select name,checkpoint_change# from v$datafile;

NAME                                                                             CHECKPOINT_CHANGE#

-------------------------------------------------------------------------------- ------------------

/u01/app/oracle/oradata/STONE/datafile/o1_mf_system_c06xczt5_.dbf                           2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_sysaux_c06xczw8_.dbf                           2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_undotbs1_c06xczwc_.dbf                         2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_users_c06xczx2_.dbf                            2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_example_c06xj0bk_.dbf                          2678314

3)Start SCN (存在於各個資料檔案頭)
在執行checkpoint時,Oracle會更新存放在各個實際的資料檔案頭的Start SCN(注意絕對不會是控制檔案中的),這個SCN存在的目的是用於檢查資料庫啟動過程中是否需要做media recovery(介質恢復)我們可以透過select checkpoint_change# from v$datafile_header來檢視

例子:檢視當前各個資料檔案的Start SCN

SQL> select name,checkpoint_change# from v$datafile_header;

NAME                                                                             CHECKPOINT_CHANGE#

-------------------------------------------------------------------------------- ------------------

/u01/app/oracle/oradata/STONE/datafile/o1_mf_system_c06xczt5_.dbf                           2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_sysaux_c06xczw8_.dbf                           2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_undotbs1_c06xczwc_.dbf                         2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_users_c06xczx2_.dbf                            2678314

/u01/app/oracle/oradata/STONE/datafile/o1_mf_example_c06xj0bk_.dbf                          2678314

4)End SCN(存在於控制檔案)
End SCN也是記錄在控制檔案當中,每一個所記錄的資料檔案頭都有一個對應的End SCN,這個End SCN一定是存在於控制檔案當中。這個SCN存在的絕對意義主要是用來去驗證資料庫啟動過程中是否需要做instance recovery。我們可以透過select name,last_change# from v$datafile來檢視。那麼在資料庫正常執行的情況下,對於read/write的online 資料檔案這個SCN號為#FFFFFF(NULL)。

例子:檢視當前各個資料檔案的End SCN

SQL> select name,last_change# from v$datafile;

NAME                                                                             LAST_CHANGE#

-------------------------------------------------------------------------------- ------------

/u01/app/oracle/oradata/STONE/datafile/o1_mf_system_c06xczt5_.dbf

/u01/app/oracle/oradata/STONE/datafile/o1_mf_sysaux_c06xczw8_.dbf

/u01/app/oracle/oradata/STONE/datafile/o1_mf_undotbs1_c06xczwc_.dbf

/u01/app/oracle/oradata/STONE/datafile/o1_mf_users_c06xczx2_.dbf

/u01/app/oracle/oradata/STONE/datafile/o1_mf_example_c06xj0bk_.dbf

那麼我們來看看不需要做例項恢復和需要做例項恢復的情況。

1)如果系統正常關閉,則system checkpoint scn = datafile checkpoint scn = start scn = stop scn,不需要做例項恢復。

例子:檢視系統正常關閉後,mount狀態下各個SCN的情況

先建立一個指令碼,同時獲取上面的四個SCN

[ ~]$ cat getscn.sql

select 'System Checkpoint SCN - V$Database:checkpoint_change#' "SCN Location",checkpoint_change# from v$database

union

select 'Datafile Checkpoint SCN - V$Datafile:checkpoint_change#' "SCN Location",checkpoint_change# from v$datafile

union

select 'Datafile Start SCN - V$Datafile_header:checkpoint_change#' "SCN Location",checkpoint_change# from v$datafile_header

union

select 'Datafile Stop SCN - V$Datafile:Last_change#' "SCN Location",last_change# from v$datafile;

然後檢視當前各個SCN的值

SQL> @getscn

SCN Location                                              CHECKPOINT_CHANGE#

--------------------------------------------------------- ------------------

Datafile Checkpoint SCN - V$Datafile:checkpoint_change#              2678314

Datafile Start SCN - V$Datafile_header:checkpoint_change#            2678314

Datafile Stop SCN - V$Datafile:Last_change#

System Checkpoint SCN - V$Database:checkpoint_change#                2678314

正常關閉資料庫並啟動到mount狀態

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Total System Global Area  835104768 bytes

Fixed Size                  2257840 bytes

Variable Size             549456976 bytes

Database Buffers          281018368 bytes

Redo Buffers                2371584 bytes

Database mounted.

SQL> @getscn

SCN Location                                              CHECKPOINT_CHANGE#

--------------------------------------------------------- ------------------

Datafile Checkpoint SCN - V$Datafile:checkpoint_change#              2683010

Datafile Start SCN - V$Datafile_header:checkpoint_change#            2683010

Datafile Stop SCN - V$Datafile:Last_change#                          2683010

System Checkpoint SCN - V$Database:checkpoint_change#                2683010

可以看到這四個SCN相等,不需要進行例項恢復。

2)系統異常關閉,則system checkpoint scn = datafile checkpoint scn = start scn , stop scn is NULL,需要進行例項恢復。

SQL> alter database open;

Database altered.

SQL> startup mount force

ORACLE instance started.

Total System Global Area  835104768 bytes

Fixed Size                  2257840 bytes

Variable Size             549456976 bytes

Database Buffers          281018368 bytes

Redo Buffers                2371584 bytes

Database mounted.

SQL> @getscn

SCN Location                                              CHECKPOINT_CHANGE#

--------------------------------------------------------- ------------------

Datafile Checkpoint SCN - V$Datafile:checkpoint_change#              2683013

Datafile Start SCN - V$Datafile_header:checkpoint_change#            2683013

Datafile Stop SCN - V$Datafile:Last_change#

System Checkpoint SCN - V$Database:checkpoint_change#                2683013

可以看到stop scn為空,需要進行例項恢復。

在正常open資料庫的時候,Oracle會將記錄在控制檔案中的每一個資料檔案頭的End SCN都設定為#FFFFFF(NULL),那麼如果資料庫進行了正常關閉比如(shutdown or shutdown immediate),這個時候系統會執行一個檢查點,這個檢查點會將控制檔案中記錄的各個資料檔案頭的End SCN更新為當前online資料檔案的各個資料檔案頭的Start SCN,也就是End SCN=Start SCN,如果再次啟動資料庫的時候發現二者相等,則直接開啟資料庫,並再次將End SCN設定為#FFFFFF(NULL),那麼如果資料庫是異常關閉,那麼checkpoint就不會執行,因此再次開啟資料庫的時候End SCN<>Start SCN,這個時候就需要做例項恢復。

而在資料庫的啟動過程中,當System Checkpoint SCN=Datafile Checkpoint SCN=Start SCN的時候,Oracle資料庫是可以正常啟動的,而不需要做任何的media recovery。而如果三者當中有一個不同的話,則需要做media recovery。

(4)SMON(System Monitor)系統監控程式

一個例項只有一個系統監控程式,作用:

  • 在例項啟動時負責對資料庫進行恢復。如果是非正常關閉資料庫,則當下次啟動例程時,SMON程式會自動讀重做日誌檔案,對資料庫進行恢復,即執行將已提交的事務寫入資料檔案中、回退未提交的事務等操作
  • 清除已經分配但不再使用的表空間中的臨時段。(如果表空間中有大量的盤區,則清除就會花費大量時間,就會影響資料庫啟動時的效能)
  • 合併基於資料字典管理的各個表空間中位置相鄰的空閒盤區,使之更容易分配

例子:檢視當前系統的SMON

SQL> select pname from v$process where pname='SMON';

PNAME

-----

SMON

[ ~]$ ps -ef | grep smon | grep -v grep

oracle    2505     1  0 Nov29 ?        00:00:04 ora_smon_stone

SMON定期檢查系統是否需要它,其他的程式如果在需要的時候也會呼叫它。

clipboard[17]

例項恢復的目的

例項恢復可確保資料庫在一個例項失敗後仍能回到一個一致的狀態。由於Oracle 資料庫對資料檔案更改的管理方式會導致資料庫的檔案可以處於不一致的狀態。

重做執行緒是對例項生成的所有更改的記錄。單例項資料庫擁有一個重做執行緒,而一個 Oracle RAC 資料庫擁有多個重做執行緒(每個資料庫例項有一個) 

當事務提交時,日誌寫入程式 (LGWR) 將記憶體中的重做條目和事務 SCN 同時寫入聯機重做日誌。但是,資料庫寫入程式 (DBWn) 只在它認為最有效率的時候將已修改的資料塊寫入資料檔案。由於這個原因,未提交的更改可能會暫時存在於資料檔案中,而已提交的更改也可能還不在資料檔案中。 

如果某個開啟的資料庫的例項失敗,或者由於 SHUTDOWN ABORT 語句或異常終止,則可能會導致下列情況: 

  • 由某事務已提交的資料塊更新還未寫入資料檔案,而僅寫入了聯機重做日誌中。這些更改必須重新應用到資料庫
  • 資料檔案包含例項失敗時尚未提交的更改。這些更改必須回滾,以確保事務一致性

例項恢復只使用聯機重做日誌檔案和當前線上的資料檔案,以同步資料檔案,並確保它們一致。 

Oracle 資料庫何時執行例項恢復

是否需要例項恢復取決於重做執行緒的狀態。在資料庫例項被開啟為讀/寫模式時,重做執行緒在控制檔案中被標記為開啟,而當例項被一致關閉時,重做執行緒被標記為關閉。如果重做執行緒在控制檔案中被標記為開啟,但沒有活動的例項持有對應於這些執行緒的執行緒佇列,則資料庫將需要例項恢復。 

Oracle 資料庫在以下情況下自動執行例項恢復:

  • 單例項資料庫或 Oracle RAC 資料庫的所有例項失敗後第一次開啟資料庫。這種形式的例項恢復也稱為崩潰恢復。Oracle 資料庫一起恢復所有已終止例項的聯機重做執行緒。 
  • 只是 Oracle RAC 資料庫中的某些、但不是所有例項失敗。例項恢復將由配置中的某個存活例項自動進行。

SMON 後臺程式自動執行例項恢復並應用聯機重做記錄。而不需要任何使用者干預。 

例項恢復檢查點的重要性

例項恢復使用檢查點來確定必須將哪些更改應用到資料檔案。檢查點位置始終保證所有比其 SCN 低的檢查點所對應的已提交更改都已儲存到資料檔案。 

聯機重做日誌中的重做執行緒如下圖:

clipboard[18]

例項恢復期間,資料庫必須應用檢查點位置和重做執行緒結尾之間發生的更改。如圖 13-5 所示, 某些更改可能已經寫入資料檔案。但是,只有其 SCN低於檢查點位置的更改,才保證已被寫到了磁碟上。 

例項恢復階段

例項恢復的第一階段稱為快取恢復或前滾,這涉及將聯機重做日誌中記錄的所有更改重新應用到資料檔案。因為回滾資料記錄在聯機重做日誌中,前滾也會重新生成相應的撤消段。 

前滾會遍歷各個必要的聯機重做日誌,以將資料庫推進到一個更前的一致時間點。前滾之後,資料塊包含記錄在聯機重做日誌檔案中的所有已提交更改。這些檔案可能還包含未提交的更改,要麼是在例項失敗前儲存到資料檔案中的,或者是在快取恢復過程中引入的。 

前滾之後,任何未提交的更改必須被撤消。Oracle 資料庫使用檢查點位置,保證每個低於其 SCN 的已提交更改都已儲存到磁碟。Oracle 資料庫應用撤消塊,以回滾資料塊中在例項失敗前寫入的或快取恢復過程中引入的未提交更改。這一階段稱為回滾或事務恢復。 

前滾和回滾如下圖:

clipboard[19]

Oracle 資料庫可以根據需要同時回滾多個事務。例項失敗時的所有活動事務被標記為終止。新事務可以自己回滾個別塊以獲取所需的資料,而不必等待 SMON 程式來回滾這些已終止的事務。 

(

“前滾和回滾”是Oracle資料庫例項發生意外崩潰,重新啟動的時候,由SMON進行的自動恢復過程。下面透過模擬例項和講解介紹這個過程。

失敗前場景說明

日誌中記錄過程如下:

1、事務A進行之後,結束commit。之後系統進行了一次checkpoint A;

2、Checkpoint之後,進行事務B,結束commit;

3、進行事務C,C事務量較大,其中進行了一定量的Redo Log檔案寫入。之後系統斷電;

1、系統啟動過程,進入例項恢復階段

當例項意外中斷的時候,各型別檔案,包括控制檔案、資料檔案和日誌檔案上,會存在不一致的問題。這種不一致主要體現在SCN值的差異上。

例項在啟動的時候,經過三階段(nomount、mount和open)。在open之前,會進行這種不一致現象的檢查,如果出現不一致,要啟動SMON程式的恢復流程。

SMON是Oracle例項的一個後臺程式,主要負責進行系統監控恢復。進行恢復的依據主要是Redo Log記錄。

2、前滾程式

SMON首先找到最後SCN記錄的Redo Log File。尋找最後一個打入的Checkpoint。

順序找到CheckPoint A之後,表示A之前的所有事務都是完全寫入到資料檔案中,不存在不一致性問題。恢復過程從Checkpoint A開始,Oracle開始依據重做日誌Redo Log的系列條目,進行推進。

首先遇到了事務B資訊,由於事務B已經commit,所以事務B所有相關的Redo Log條目已經全都寫入到Redo Log File中。所以,按照日誌繼續條目推進,完全可以重演replay,並且應用apply事務B的全部過程。

這樣,事務B全部實現,最終將透過DBWn完全寫入到資料檔案中。所以,例項失敗之前提交commit的事務B,完全恢復。

進入事務C的範疇,由於一部分事務C的Redo Log條目已經進入Redo Log File中,所以在進行前滾的時候,一定會replay到這部分的內容。不過,這部分內容中不可能出現commit的標記。所以,前滾的結果一定是遇到例項突然中斷的那個時點。此時replay的結果是,事務C沒有提交。這樣結束了前滾過程,進入回滾階段。

3、回滾過程

對事務C,要進行回滾過程,釋放所有相關資源。從Undo空間中尋找到舊版本SCN的資料塊資訊,來進行SGA中Buffer Cache資料塊恢復。

)

(

Crash Recovery 過程

       當資料庫突然崩潰,而還沒有來得及將buffer cache裡的髒資料塊重新整理到資料檔案裡,同時在例項崩潰時正在執行著的事務被突然中斷,則事務為中間狀態,也就是既沒有提交也沒有回滾。這時資料檔案裡的內容不能體現例項崩潰時的狀態。這樣關閉的資料庫是不一致的。

       下次啟動例項時,Oracle會由SMON程式自動進行例項恢復。例項啟動時,SMON程式會去檢查控制檔案中所記錄的、每個線上的、可讀寫的資料檔案的END SCN號。

       資料庫正常執行過程中,該END SCN號始終為NULL,而當資料庫正常關閉時,會進行完全檢查點,並將檢查點SCN號更新該欄位。

       而崩潰時,Oracle還來不及更新該欄位,則該欄位仍然為NULL。當SMON程式發現該欄位為空時,就知道例項在上次沒有正常關閉,於是由SMON程式就開始進行例項恢復了。

1.2.1 前滾

       SMON程式進行例項恢復時,會從控制檔案中獲得檢查點位置。於是,SMON程式到聯機日誌檔案中,找到該檢查點位置,然後從該檢查點位置開始往下,應用所有的重做條目,從而在buffer cache裡又恢復了例項崩潰那個時間點的狀態。這個過程叫做前滾,前滾完畢以後,buffer cache裡既有崩潰時已經提交還沒有寫入資料檔案的髒資料塊,也還有事務被突然終止,而導致的既沒有提交又沒有回滾的事務所弄髒的資料塊。

1.2.2 回滾

       前滾一旦完畢,SMON程式立即開啟資料庫。但是,這時的資料庫中還含有那些中間狀態的、既沒有提交又沒有回滾的髒塊,這種髒塊是不能存在於資料庫中的,因為它們並沒有被提交,必須被回滾。開啟資料庫以後,SMON程式會在後臺進行回滾。

       有時,資料庫開啟以後,SMON程式還沒來得及回滾這些中間狀態的資料塊時,就有使用者程式發出讀取這些資料塊的請求。這時,伺服器程式在將這些塊返回給使用者之前,由伺服器程式負責進行回滾,回滾完畢後,將資料塊的內容返回給使用者。

總之,Crash Recovery時,資料庫開啟會佔用比正常關閉更長的時間。

1.2.3 必須先前滾,在回滾

       回滾段實際上也是以回滾表空間的形式存在的,既然是表空間,那麼肯定就有對應的資料檔案,同時在buffer cache 中就會存在映像塊,這一點和其他表空間的資料檔案相同。

       當發生DML操作時,既要生成REDO(針對DML操作本身的REDO Entry)也要生成UNDO(用於回滾該DML操作,記錄在UNDO表空間中),但是既然UNDO資訊也是使用回滾表空間來存放的,那麼該DML操作對應的UNDO資訊(在BUFFER CACHE生成對應中的UNDO BLOCK)就會首先生成其對應的REDO資訊(UNDO BLOCK's REDO Entry)並寫入Log Buffer中。

       這樣做的原因是因為Buffer Cache中的有關UNDO表空間的塊也可能因為資料庫故障而丟失,為了保障在下一次啟動時能夠順利進行回滾,首先就必須使用REDO日誌來恢復UNDO段(實際上是先恢復Buffer Cache中的髒資料塊,然後由Checkpoint寫入UNDO段中),在資料庫OPEN以後再使用UNDO資訊來進行回滾,達到一致性的目的。

       生成完UNDO BLOCK's REDO Entry後才輪到該DML語句對應的REDO Entry,最後再修改Buffer Cache中的Block,該Block同時變為髒資料塊。

       實際上,簡單點說REDO的作用就是記錄所有的資料庫更改,包括UNDO表空間在內。

)

(5)PMON(Process Monitor)程式監控程式

作用:

  • 在使用者程式失敗的時候執行程式恢復,並負責清除資料庫緩衝區快取,釋放程式使用的資源。比如說重置當前活動的事務表,釋放不需要的locks,清理程式id(隱式回滾)。
  • 週期性的檢查排程器或者伺服器程式,並在中斷執行後進行重啟(故意中斷的除外)。
  • 監控超時的空閒會話。
  • 動態註冊資料庫服務到監聽。當一個例項開啟,PMON會檢視listener是否正在執行。如果listener正在執行,那麼PMON會傳遞相關的引數,如果沒有執行那麼PMON定期的嘗試連線。

例子:檢視當前系統的PMON

SQL> select pname from v$process where pname='PMON';

PNAME

-----

PMON

[ ~]$ ps -ef | grep pmon | grep -v grep

oracle    2480     1  0 Nov29 ?        00:00:10 ora_pmon_stone

PMON定期檢查系統是否需要它,其他的程式如果在需要的時候也會呼叫它。

clipboard[20]

(6)RECO(Recover Process)恢復程式

在分散式資料庫中,RECO程式自動解決分散式事務發生錯誤的情況。一個節點上的RECO程式自動連線到沒有被正確處理事務相關的資料庫上面。當RECO建立了資料庫之間的連線,它會自動的解決沒有辦法處理的事務,刪除與該事務相關的行(清理事務表)。

例子:檢視當前系統的PMON

SQL> select pname from v$process where pname='RECO';

PNAME

-----

RECO

[ ~]$ ps -ef | grep reco | grep -v grep

oracle    2507     1  0 Nov29 ?        00:00:01 ora_reco_stone

clipboard[21]

(7)ARCn(Archiver Process)歸檔程式

作用:

  • 在重做日誌切換後複製重做日誌檔案到儲存上面
  • 收集事務的重做資料並傳輸到備庫

歸檔程式只有資料庫在歸檔模式並且自動歸檔開啟的時候存在(從Oracle10g開始,log_archive_start引數已經被廢棄,只要啟動資料庫的歸檔模式,Oracle就會啟用自動歸檔)。系統預設有4個歸檔程式。可以有多個歸檔目的地,建議至少為每一個歸檔目的地分配一個歸檔程式。

例子:檢視資料庫當前是否是歸檔模式

SQL> archive log list

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     34

Next log sequence to archive   36

Current log sequence           36

例子:檢視當前系統的ARCn

SQL> select pname from v$process where pname like '%ARC%';

PNAME

-----

ARC0

ARC1

ARC2

ARC3

[ ~]$ ps -ef | grep arc | grep -v grep

oracle    2523     1  0 Nov29 ?        00:00:01 ora_arc0_stone

oracle    2525     1  0 Nov29 ?        00:00:02 ora_arc1_stone

oracle    2527     1  0 Nov29 ?        00:00:01 ora_arc2_stone

oracle    2529     1  0 Nov29 ?        00:00:01 ora_arc3_stone


4、資料庫程式啟動順序

如果我們安裝了GI,那麼作業系統一啟動,就會去帶動我們的GI,這是由於GI安裝的時候會去修改作業系統的啟動檔案/etc/inittab,在這個檔案裡面增加一個啟動GI的入口點/etc/init.d/init.ohasd,所以作業系統在啟動的時候,就會執行這個命令/etc/init.d/init.ohasd run >/dev/null 2&1clipboard[22]

[ ~]# cat /etc/init/oracle-ohasd.conf

# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. 

#

# Oracle OHASD startup

start on runlevel [35]

stop  on runlevel [!35]

respawn

exec /etc/init.d/init.ohasd run >/dev/null 2>&1

5、資料庫儲存結構

Oracle資料庫必須包含以下三種檔案:

  • 控制檔案(Control files):包含資料庫的資訊以及備份的資訊
  • 資料檔案(Data files):包含資料字典和使用者資料
  • 聯機重做日誌檔案(Online redo log files):包含資料的改變資訊,保證不丟失資料

Oracle資料庫正常穩定執行建議還包括以下檔案:

  • 引數檔案(Parameter files):包含例項啟動時的引數資訊
  • 密碼檔案(Password file):允許使用者使用sysdba、sysoper和sysasm角色遠端連線到資料庫進行管理操作
  • 備份檔案(Backup files):用於資料庫恢復
  • 歸檔重做日誌檔案(Archived redo log files):聯機重做日誌檔案的歸檔
  • 跟蹤檔案(Trace files):用於記錄伺服器程式或者後臺程式的錯誤資訊
  • 告警檔案(Alert log file):記錄資料庫執行的資訊以及錯誤

Oracle資料庫的邏輯結構和物理結構

clipboard[23]

邏輯上,一個資料庫包含多個表空間,一個表空間包含多個段,一個段包含多個區,一個區包含多個資料塊。

  • 資料塊(data blocks):邏輯儲存結構中最小的邏輯單位,資料庫輸入輸出操作的最小儲存單位,由多個作業系統塊構成。
  • 區(extent):由一組連續的資料塊構成,是儲存分配的最小單位,是表中資料增大的基本單位。
  • 段(segment):由資料區構成,是獨立的邏輯儲存結構。段是為特定的資料物件分配的一系列資料區,佔用磁碟空間。不是所有的資料庫物件都會分配段,比如檢視、觸發器、包。4種主要型別的段:

(1)資料段,建立表時自動建立以表名字命名的資料段

(2)索引段,建立索引時自動建立以索引名字命名的索引段

(3)回滾段:儲存undo資訊

(4)臨時段:SQL語句需要臨時工作區(比如排序)就會用到臨時段

  • 表空間(tablespace):表空間是資料庫的最大邏輯劃分割槽域,用來存放表,索引,回滾段等資料物件,任何資料物件在建立時都必須指定儲存在某個表空間中。

表空間與資料檔案相對應,一個表空間由一個或多個資料檔案組成,一個資料檔案只屬於一個表空間,單個資料檔案最大大小為(2^22-1)*DB_BLOCK_SIZE。如果是大檔案表空間,則只有一個資料檔案,最大可以到(2^32-1)*32K=128T。

例子:檢視當前資料庫的控制檔案

SQL> select * from v$controlfile;

STATUS  NAME                                                                             IS_ BLOCK_SIZE FILE_SIZE_BLKS

------- -------------------------------------------------------------------------------- --- ---------- --------------

        /u01/app/oracle/oradata/STONE/controlfile/o1_mf_c06xh9fs_.ctl                    NO       16384            596

        /u01/app/oracle/fast_recovery_area/STONE/controlfile/o1_mf_c06xh9jx_.ctl         YES      16384            596

例子:檢視當前資料庫的資料檔案及表空間

SQL> select file_name,tablespace_name from dba_data_files;

FILE_NAME                                                                        TABLESPACE_NAME

-------------------------------------------------------------------------------- ------------------------------

/u01/app/oracle/oradata/STONE/datafile/o1_mf_users_c06xczx2_.dbf                 USERS

/u01/app/oracle/oradata/STONE/datafile/o1_mf_undotbs1_c06xczwc_.dbf              UNDOTBS1

/u01/app/oracle/oradata/STONE/datafile/o1_mf_sysaux_c06xczw8_.dbf                SYSAUX

/u01/app/oracle/oradata/STONE/datafile/o1_mf_system_c06xczt5_.dbf                SYSTEM

/u01/app/oracle/oradata/STONE/datafile/o1_mf_example_c06xj0bk_.dbf               EXAMPLE

例子:查到當前資料庫的聯機重做日誌檔案

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                                                           IS_

---------- ------- ------- -------------------------------------------------------------------------------- ---

         3         ONLINE  /u01/app/oracle/oradata/STONE/onlinelog/o1_mf_3_c06xhj1g_.log                    NO

         3         ONLINE  /u01/app/oracle/fast_recovery_area/STONE/onlinelog/o1_mf_3_c06xhj37_.log         YES

         2         ONLINE  /u01/app/oracle/oradata/STONE/onlinelog/o1_mf_2_c06xhdlj_.log                    NO

         2         ONLINE  /u01/app/oracle/fast_recovery_area/STONE/onlinelog/o1_mf_2_c06xhdnc_.log         YES

         1         ONLINE  /u01/app/oracle/oradata/STONE/onlinelog/o1_mf_1_c06xh9t5_.log                    NO

         1         ONLINE  /u01/app/oracle/fast_recovery_area/STONE/onlinelog/o1_mf_1_c06xh9xt_.log         YES

6 rows selected.

例子:查到當前資料庫的歸檔日誌檔案

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     47

Next log sequence to archive   49

Current log sequence           49

SQL> show parameter db_recovery_file_dest

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest                string      /u01/app/oracle/fast_recovery_

                                                 area

db_recovery_file_dest_size           big integer 4182M

SQL> select name,sequence#,first_change# from v$archived_log;

NAME                                                                                        SEQUENCE# FIRST_CHANGE#

------------------------------------------------------------------------------------------ ---------- -------------

/u01/app/oracle/fast_recovery_area/STONE/archivelog/2015_09_24/o1_mf_1_5_c06xz88j_.arc              5        987870

/u01/app/oracle/fast_recovery_area/STONE/archivelog/2015_09_24/o1_mf_1_6_c0784v9r_.arc              6        997228

例子:檢視當前資料庫的引數檔案

SQL> !ls /u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilestone.ora

/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilestone.ora

例子:檢視當前會話的初始化引數

SQL> show parameters;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

O7_DICTIONARY_ACCESSIBILITY          boolean     FALSE

例子:檢視spfile中的初始化引數

SQL> show spparameters;

SID      NAME                          TYPE        VALUE

-------- ----------------------------- ----------- ----------------------------

*        O7_DICTIONARY_ACCESSIBILITY   boolean

*        active_instance_count         integer

*        aq_tm_processes               integer

*        archive_lag_target            integer

*        asm_diskgroups                string

*        asm_diskstring                string

*        asm_power_limit               integer

*        asm_preferred_read_failure_gr string

         oups

*        audit_file_dest               string      /u01/app/oracle/admin/stone/

                                                   adump

例子:檢視當前資料庫的密碼檔案

SQL> !ls /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwstone

/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwstone

例子:使用V$PWFILE_USERS這個檢視可以檢視使用者是否被授予了SYSDBA,,SYSOPER,SYSASM系統許可權

SQL> select * from V$PWFILE_USERS;

USERNAME                       SYSDB SYSOP SYSAS

------------------------------ ----- ----- -----

SYS                            TRUE  TRUE  FALSE

SQL> grant sysdba to hr;

Grant succeeded.

SQL> select * from V$PWFILE_USERS;

USERNAME                       SYSDB SYSOP SYSAS

------------------------------ ----- ----- -----

SYS                            TRUE  TRUE  FALSE

HR                             TRUE  FALSE FALSE

SQL> revoke sysdba from hr;

Revoke succeeded.

SQL> select * from V$PWFILE_USERS;

USERNAME                       SYSDB SYSOP SYSAS

------------------------------ ----- ----- -----

SYS                            TRUE  TRUE  FALSE

例子:檢視當前資料庫的跟蹤檔案以及告警檔案

11g之前是由引數background_dump_dest指定位置,11g使用ADR後,在ADR對應目錄下。

SQL> show parameter background_dump_dest

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

background_dump_dest                 string      /u01/app/oracle/diag/rdbms/sto

                                                 ne/stone/trace

SQL> select * from v$diag_info;

   INST_ID NAME                           VALUE

---------- ------------------------------ --------------------------------------------------------------------------------

         1 Diag Enabled                   TRUE

         1 ADR Base                       /u01/app/oracle

         1 ADR Home                       /u01/app/oracle/diag/rdbms/stone/stone

         1 Diag Trace                     /u01/app/oracle/diag/rdbms/stone/stone/trace

         1 Diag Alert                     /u01/app/oracle/diag/rdbms/stone/stone/alert

         1 Diag Incident                  /u01/app/oracle/diag/rdbms/stone/stone/incident

         1 Diag Cdump                     /u01/app/oracle/diag/rdbms/stone/stone/cdump

         1 Health Monitor                 /u01/app/oracle/diag/rdbms/stone/stone/hm

         1 Default Trace File             /u01/app/oracle/diag/rdbms/stone/stone/trace/stone_ora_678.trc

         1 Active Problem Count           0

         1 Active Incident Count          0

11 rows selected.

例子:檢視當前資料庫USER表空間DEPT的表段的段資訊

SQL> select owner,segment_name,segment_type,tablespace_name,bytes,blocks from dba_segments where tablespace_name='USERS' and segment_name='DEPT';

OWNER                          SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS

------------------------------ ------------------------------ ------------------ ------------------------------ ---------- ----------

SCOTT                          DEPT                           TABLE              USERS                               65536          8

HR                             DEPT                           TABLE              USERS                               65536          8

例子:檢視當前資料庫USER表空間DEPT的表段的區資訊

SQL> select segment_name,extent_id,block_id,blocks from dba_extents where segment_name='DEPT';

SEGMENT_NAME                    EXTENT_ID   BLOCK_ID     BLOCKS

------------------------------ ---------- ---------- ----------

DEPT                                    0      94960          8

DEPT                                    0        128          8

DEPT                                    0        688          8

例子:檢視塊大小

SQL> show parameter db_block_size

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_block_size                        integer     8192

SYSTEM和SYSAUX表空間

SYSTEM和SYSAUX表空間是資料庫建立的時候自動建立的表空間,資料庫執行的時候都必須online,Oracle建議不要在這2個表空間存放業務資料。

  • SYSTEM表空間是最重要的表空間,包含資料字典等核心功能
  • SYSAUX表空間包含資料庫的一些額外元件資訊,例如EM知識庫資訊

自動儲存管理ASM

ASM主要用於Oracle RAC環境的併發訪問,是一個叢集檔案系統,主要用於存放Oracle資料庫的檔案,包含資料檔案,控制檔案,聯機日誌檔案,備份,歸檔等,不能存放作業系統的檔案,比如資料庫安裝檔案,如果要放的話,就需要在ASM上面建立一個ACFS檔案系統。我們一般主要使用ASM的磁碟組,類似RAID,做了條帶化和映象。

clipboard[24]

ASM儲存元件

ASM磁碟可以是物理磁碟或者分割槽、儲存的LUN、LV或者網路檔案,多個ASM磁碟構成ASM磁碟組,每個ASM磁碟劃分成多個分配單元(AU),分配單元是ASM最小的連續分配磁碟空間,可以設定分配單元為1、2、4、8、16、32或者64M,一個或者多個分配單元構成ASM區(extent),一個或者多個區構成ASM檔案。ASM檔案只能在一個磁碟組中。

clipboard[25]


6、資料庫的互動

描述一下使用者和伺服器程式在不同的機器上面,透過網路與資料庫進行互動的最基本的過程。

(1)資料庫例項啟動

(2)使用者發起一個使用者程式

(3)伺服器上的監聽檢測到連線請求,建立一個伺服器程式

(4)使用者發起DML語句

(5)伺服器程式收到DML語句,檢查共享池中是否有同樣的SQL語句的共享SQL區,如果有,伺服器程式確認使用者的訪問許可權並使用共享SQL區去處理這個語句,如果沒有,分配新的共享SQL區去解析和處理語句。

(6)伺服器程式從資料檔案或者資料庫緩衝區快取獲取必要的資料

(7)伺服器程式在SGA中修改資料。事務提交後,LGWR將修改動作寫入聯機重做日誌檔案,DBWn在合適的時候將修改的塊更新的磁碟上

(8)如果事務成功,伺服器程式透過網路給應用傳送訊息,如果失敗,將會返回錯誤

clipboard[26]


7、相關習題

(1)Identify the memory component from which memory may be allocated for:
Session  memory  for  the  shared  serverBuffers  for  I/O  slavesOracle  Database  Recovery Manager (RMAN) backup and restore operations.
A.  Large Pool
B.  Redo Log Buffer
C.  Database Buffer Cache
D.  Program Global Area (PGA)

答案:A

(2)Which two statements are true about Shared SQL Area and Private SQL Area? (Choose two.)
A. Shared SQL Area will be allocated in the shared pool
B. Shared SQL Area will be allocated when a session starts
C. Shared SQL Area will be allocated in the large pool always
D. The whole of Private SQL Area will be allocated in the Program Global Area (PGA) always
E. Shared SQL Area and Private SQL Area will be allocated in the PGA or large pool
F. The number of Private SQL Area allocations is dependent on the OPEN_CURSORS parameter

答案:AF

(3)Which three statements are correct about temporary tables? (Choose three.)
A. Indexes and views can be created on temporary tables
B. Both the data and structure of temporary tables can be exported
C. Temporary tables are always created in a user's temporary tablespace
D. The data inserted into a temporary table in a session is available to other sessions
E. Data Manipulation Language (DML) locks are never acquired on the data of temporary tables

答案:ACE

(4)Which two statements correctly describe the relation between a data file and the logical database structures? (Choose two)
A. An extent cannot spread across data files.
B. A segment cannot spread across data files.
C. A data file can belong to only one tablespace.
D. A data file can have only one segment created in it.
E. A data block can spread across multiple data files as it can consist of multiple operating system (OS) blocks.

答案:AC

(5)Which two statements are true regarding a tablespace? (Choose two.)
A. It can span multiple databases
B. It can consist of multiple data files
C. It can contain blocks of different files
D. It can contains segments of different sizes
E. It can contains a part of nonpartitioned segment

答案:BD

(6)You execute this command to drop the ITEM table, which has the primary key referred in the ORDERS table:
   SQL> DROP TABLE scott.item CASCADE CONSTRAINTS PURGE;
Which two statements are true about the effect of the command? (Choose two.)
A.  No flashback is possible to bring back the ITEM table.
B.  The ORDERS table is dropped along with the ITEM table.
C.  The dependent referential integrity constraints in the ORDERS table are disabled.
D.  The dependent referential integrity constraints in the ORDERS table are removed.
E.  The table definition of the ITEM table and associated indexes are placed in the recycle bin.

答案:AD

(7)You executed this command to create a temporary table:
   SQL> CREATE GLOBAL TEMPORARY TABLE report_work_area (
                     Startdate        DATE,
                     enddate          DATE,
                     class            CHAR(20)
             ) ON COMMIT PRESERVE ROWS;
Which statement is true about the rows inserted into the REPORT_WORK_AREA table during a transaction?
A.  The rows stay in the table only until session termination
B.  The rows stay in the table only until the next transaction starts on the table
C.  The rows are visible to all current sessions after the transaction in committed
D.  The rows stay available for subsequent sessions after the transaction is committed

答案:A

(8)You want to access employee details contained in flat files as part of the EMPLOYEE table. You plan to add a new column to the EMPLOYEE table to achieve this.
Which data types would you use for the new column?
A.  CLOB
B.  BLOB
C.  BFILE
D.  LONG RAW

答案:C

(9)Note the following structures in your database server:
   1. Extents
   2. OS Blocks
   3. Tablespace
   4. Segments
   5. Oracle Data Block
Which option has the correct arrangement of these structures from the smallest to the largest?
A. 2, 5, 1, 4, 3
B. 1, 2, 3, 4, 5
C. 5, 2, 1, 3, 4
D. 2, 1, 5, 4, 3

答案:A

(10)See the Exhibit:
Identify the component marked with a question mark:
clipboard[27]
A.  Checkpoint (CKPT)
B.  Process Monitor (PMON)
C.  Archiver Processes (ARcn)
D.  Recoverer Process (RECO)
E.  Memory Manager Process (MMAN)

答案:A

(11)Why does performance degrade when many UPDATE, INSERT or DELETE statements are issued on a table that has an associated bitmap index?
A.  The DML operations re-create the bitmap index blocks
B.  The bitmap index is rebuilt automatically after a DML operation
C.  The smallest amount of a bitmap that can be locked is a bitmap segment
D.  Additional time is taken to remove NULL values from the bitmap index after a DML operation

答案:C

(12)Which is the correct description of a pinned buffer in the database buffer cache?
A.  The buffer is currently being accessed
B.  The buffer is empty and has not been used
C.  The contents of the buffer have changed and must be flushed to the disk by the DBWn process
D.  The buffer is a candidate for immediate aging out and its contents are synchronized with the block contents on the disk

答案:A

(13)View  the  Exhibit  to  examine  the  output  produced  by  the  following  query  at  three  different times  since  the  database  instance  started  and  has  experienced  workloads  of  different capacities:

   SQL> SELECT substr(component, 0, 10) COMP, current_size CS, user_specified_size US
        FROM v$memory_dynamic_components
        WHERE current_size!=0;
What do you infer from this?
png此主題相關圖片如下:
clipboard[28]

A.  The database instance is running with manual PGA management.
B.  The database instance is running with manual shared memory management.
C.  The database instance has the MEMORY_TARGET value set to a nonzero value. 

D.  All  sessions  are  connected  to  the  database  instance  in  dedicated  mode,  and  no  RMAN  or  parallel  query operations have been performed.

答案:C

(14)Your database instance is  started using the server parameter file (SPFILE). You executed a command to change the value of the LOG_BUFFER initialization parameter:

   ALTER SYSTEM SET LOG_BUFFER=32M SCOPE=BOTH;

What would be the outcome of this command?
A.  The command succeeds only if Automatic Memory Management is not enabled.
B.  The command succeeds, but you need to restart the database for changes to take effect.
C.  The command returns an error because the size of the redo log buffer cannot be changed dynamically.
D.  The parameter value is changed and it comes into effect as soon as space becomes available in the System Global Area (SGA).

答案:C

(15)Which two statements about the background process of the database writer are true? (Choose two.)
A.  It is possible to have multiple database writers in an Oracle instance.
B.  It writes dirty buffers, if any, to data files whenever a checkpoint occurs.
C.  It writes dirty buffers, if any, to data files whenever a transaction commits.
D.  It writes dirty buffers, if any, to data files before the log writer (LGWR) writes.

答案:AB

(16)Which two statements are true regarding a PL/SQL package body? (Choose two.)
A.  It cannot be created without a package specification.
B.  It cannot invoke subprograms defined in other packages.
C.  It can contain only the subprograms defined in the package specification.
D.  It can be changed and recompiled without making the package specification invalid.

答案:AD

(17)Note the following functionalities of various background processes:
   1. Record the checkpoint information in data file headers.
   2. Perform recovery at instance startup.
   3. Cleanup unused temporary segments.
   4. Free the resources used by a user process when it fails.
   5. Dynamically register database services with listeners.
   6. Monitor sessions for idle session timeout.
Which option has the correct functionalities listed for a background process?
A.  Archiver Process (ARCn): 1, 2, 5
B.  System Monitor Process (SMON): 1, 4, 5
C.  Process Monitor Process (PMON): 4, 5, 6
D.  Database Writer Process (DBWn): 1, 3, 4

答案:C

(18)Which three statements are correct about temporary tables? (Choose three.)
A.  Indexes and views can be created on temporary tables.
B.  Both the data and the structure of temporary tables can be exported.
C.  Temporary tables are always created in a user's temporary tablespace.
D.  The data inserted into a temporary table in a session is available to other sessions.
E.  Data manipulation language (DML) locks are never acquired on the data of temporary tables.

答案:ACE

(19)Which three statements are true about logical structures of the Oracle database? (Choose three.)
A.  Each segment contains one or more extents.
B.  Multiple tablespaces can share a single data file.
C.  A data block is the smallest unit of input/output (I/O) in data files.
D.  It is possible to have tablespaces of different block sizes in a database.
E.  Each data block in the database always corresponds to one operating system block.

答案:ACD

(20)In a new installation of Oracle Database 11g, you perform these activities:
   1. Organize software and data on different subdirectories to avoid poor performance.
   2. Use consistent naming conventions for database files.
   3. Separate administrative information pertaining to the database in different directories.
Which option corresponds to the type of activities you performed?
A.  Oracle Managed Files
B.  Oracle Grid Architecture
C.  Optimal Flexible Architecture
D.  Oracle database architecture
E.  Automatic Storage Management

答案:C

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

相關文章