Oracle 數據庫的組成(instance+database)


 

 

 

 

 

Oracle服務器是一種對象關系數據庫管理系統,它為信息管理提供開放、綜合、集成的方法。

Oracle服務器中有多種進進程、內存結構和文件;

Oracle服務器由一個Oracle實例和一個Oracle數據庫組成。

Oracle服務器Oracle實例+Oracle數據庫

Oracle實例:后台進程+內存結構 

(必須啟動實例才能訪問數據庫中的數據,每次啟動實例,都會分配系統全局去SGA並啟動Oracle后台進程

SGA是用於村粗數據庫信息的內存區,該信息為數據庫進程所共享。

后台進程代表調用進程執行功能。它們把為每個用戶運行的多個oracle程序所處理的功能統一起來。

后台進程執行i/o並監控其他oracle進程以增加並行性,從而使性能和可靠性更加優越。

Oracle數據塊:物理結構+邏輯結構

 Oracle存儲結構:物理結構+邏輯結構

物理結構

主要文件

數據文件

重做日志文件

控制文件

其他文件

參數文件

歸檔日志文件

邏輯結構

表空間

數據塊

 

        O racle 內存結構

系統全局區SGAOracle實例啟動時分配系統全局區)

程序全局區PGA(服務器進程啟動時分配程序全局區)

用戶全局區UGA(用戶全局區為用戶進程存儲回話狀態)

 

 


Oracle 數據庫的組成

  • 實例 instance

內存

• sgapgastreams pool....

進程

• Oracle 后台進程(為oracle實例服務,PMONSMON等)

服務器端進程

客戶端進程

  • 數據庫 database

文件

控制文件,重做日志文件,數據文件

  • 其它組成部分

參數文件,密碼文件(放置sys用戶的口令),Archived歸檔日志(redo文件的備份)

 

 

  • 數據庫 database

數據庫是一個靜態的,被動的文件.

  • 實例=內存區+后台進程
    • 實例的內存區:SGA+PGA,內存是一塊區域.
    • 后台進程:使用/操作實例的內存區.

SGA(系統全局區system global area

  • SGA區中數據是共享的,所有人都可以看到的數據.
  • Oracle最重要的內存區域,是數據庫中共享資源的內存區域.

1Database Buffer Cache(數據緩沖區)

  • 數據塊
    • 表的數據記錄是放在數據塊里的.
    • oracle最小的單位是數據塊.
    • 數據塊被讀到內存里(oracle查詢是在內存里完成的.數據處理要內存來完成)
    • 某個用戶從磁盤里讀了一個數據塊,放到內存里來,這個數據塊被所有人所共有.

 

2、Shared pool

  • Library cache(庫高速緩存)
    • SQL的一些信息.
      • 比如一條SQL被解析了,生成了執行計划,這條SQL生成的執行計划可以被其他用戶使用.如果其他用戶再查詢這條SQL就不用解析了,就可以直接使用這個執行計划.
  • Data Dictionary Cache(數據字典高速緩存)
    • 數據字典信息
      • 如表的屬性,列,存儲 空間,權限等信息.

 

3Redo log buffer(重做日志區)

 

 

 

SGA 區里發生了什么?

  • SQL語句在這里被解析,生成執行計划,執行計划被共享。
  • 數據在這里被訪問,被共享。
  • 重做日志在這里被產生。

SGA內存配置(show parameter sga

 

PGA

PGA自己的內存區:

  • Sort Area(排序區):當排序區不夠就放到臨時表空間中排序.
  • Hash Area
  • Bitmap Merge Area
  • Session Memory
  • Persistent Area
  • Runtime Area
    • 是某個會話獨有的數據和其他的一些東西.
    • 每個會話都不一樣,每個會話都有自己的PGA.
    • 屬於每一個會話私有的內存區.

 

PGA 里發生了什么?

  • 私有SQL

私有SQL區包含了

1綁定變量值的信息.

2運行時期內存結構信息等數據。

-每一個運行SQL語句的會話都有一個塊私有SQL區。

-所有提交了相同SQL語句的用戶都有各自的私有SQL區,並且他們共享一個共享SQL區。因此,一個共享SQL區可能和多個私有共享區相關聯。

  • 游標和SQL

一個Oracle預編譯程序或OCI程序的應用開發人員能夠很明確的打開一個游標,或者控制一塊特定的私有SQL區,將他們作為程序運行的命名資源。

  • 會話內存

基於排序的操作(ORDER BYGROUP BYROLLUP、窗口函數);

– Hash Join

– Bitmap merge

– Bitmap create

 

PGA是所有會話的總和

PGA會話內存總和(pga_alloc_mem)

 

后台進程

 

 

SQL> desc v$bgprocess;

SQL> select count(*) from v$bgprocess;

SQL> select name from v$bgprocess;

后台進程是一段代碼,完成一些固定的功能.

后台進程定義:為了最大的性能和容納更多的用戶,oracle使用額外的進程被叫做后台進程處理。

 

一、后台進程主要包括:

    • Database Writer Process(DBWn)
    • Log Writer Process(LGWR)
    • CheckPoint Process(CKPT)
    • System Monitor Process(SMON)
    • Process Monitor Process(PMON)
    • Recoverer Process(RECO)
    • Job Queue Processes
    • Archiver Processes(ARCn)
    • Queue Monitor Processes (QMNn)
    • Other Background Processes
 

 

 

DBWn(Database Writer Process)

      • n是指ORACLE可以啟動多個Database Writer Process
      • 內存中有很多臟數據,有很多數據在修改,一個Database Writer Process不夠用,就會啟多個Database Writer Process
      • DBWn是數據庫后台寫入進程,負責把buffer cache內的臟數據(當buffer cache被修改了,就會標成臟數據)寫入數據庫.DBWn的主要工作是把臟數據寫入磁盤以保證buffer cache是干凈的.
      • 用戶進程會產生臟數據,空余的緩沖區會減少.如果空閑的緩沖區太少,用戶進程從磁盤讀取block進緩沖區的時候就找不到空余的位置了.DBWn管理buffer cache保證用戶進程始終可以找到空閑的位置.

 

在什么觸發DBWR進程的條件:

1.當臟緩沖區的數量超過了所設定的限額。

2.當所設定的時間間隔到了。

3.當有進程需要數據庫高速緩沖區卻找不到空閑的緩沖區時。當server process在buffer cache中無法找到可用的buffer時,調用該進程,保證用戶進程始終可以在buffer cache中找到空閑的位置;

4.當校驗點發生時。 接收到CKPT(檢查點,checkpoint)進程的指令后,調用該進程,將數據寫入到磁盤中。

5.當某個表被刪除或被截斷時。

6.當某個表空間被設置為只讀狀態時。

7.當使用類似於alter tablespace users begin backup的命令對某個表空間進行聯機備份時。

8.當某個臨時表空間被設置為只脫機狀態或正常狀態時。

 

查看DB_WRITER_PROCESSES參數

SQL> show parameter db_writer_processes

 

NAME                                 TYPE        VALUE

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

db_writer_processes                  integer     1

SQL>

修改DB_WRITER_PROCESSES參數

 

作為一個DBA,可以通過設置多個DBWn進程來加快臟數據寫入磁盤的速度。在sqlplus中,連接上數據庫后,使用命令如下命令即可查看並改寫該進程個數:(需重啟數據庫生效)

 

可通過設置DB_WRITER_PROCESSES的參數來讓多個DBWR來進行寫操作

1.show parameter db_writer_processes

2.alter system set db_writer_processes=9 scope=spfile(網有說是最多10dbwr同時進行寫操作,但是官方的文檔上說有20,本人沒有測試過)

3.shutdown immediate

4.startup

 

 

SQL> alter system set db_writer_processes=8 scope=spfile;

 

System altered.

 

SQL> show parameter db_writer_processes

 

NAME                                 TYPE        VALUE

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

db_writer_processes                  integer     1

SQL> startup force

ORACLE instance started.

 

Total System Global Area 1653518336 bytes

Fixed Size                  2253784 bytes

Variable Size            1207962664 bytes

Database Buffers          436207616 bytes

Redo Buffers                7094272 bytes

Database mounted.

Database opened.

SQL> show parameter db_writer_processes

 

NAME                                 TYPE        VALUE

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

db_writer_processes                  integer     8

SQL>

官方文檔關於dbwn的說明

Database Writer Process (DBWn)

The database writer process (DBWn) writes the contents of buffers to datafiles. The DBWn processes are responsible for writing modified (dirty) buffers in the database buffer cache to disk. Although one database writer process (DBW0) is adequate for most systems, you can configure additional processes (DBW1 through DBW9 and DBWa through DBWj) to improve write performance if your system modifies data heavily. These additional DBWn processes are not useful on uniprocessor systems.

數據庫的dbwn進程主要是把緩存的內容寫到數據文件中。dbwn進程主要負責把數據庫的高速緩存中的臟數據寫到硬盤上。雖然一個dbwn進程能夠滿足大部分的系統,如果你的系統臟數據太多,你也可以配置(dbw1dbw9dbwadbwj)來改善寫性能。在單進程的系統上增加dbwn進程沒有用。

When a buffer in the database buffer cache is modified, it is marked  dirty. A cold buffer is a buffer that has not been recently used according to the least recently used (LRU) algorithm. The DBWn process writes cold, dirty buffers to disk so that user processes are able to find cold, clean buffers that can be used to read new blocks into the cache. As buffers are dirtied by user processes, the number of free buffers diminishes. If the number of free buffers drops too low, user processes that must read blocks from disk into the cache are not able to find free buffers. DBWn manages the buffer cache so that user processes can always find free buffers.

在數據庫高速緩存中當有一個緩存被修改,它就變成了臟數據了。一個冷緩存就是最近沒有被訪問的緩存塊。dbwn進程寫冷塊,臟緩存到硬盤,所以用戶進程能夠找到冷塊,清除緩,能把新的塊讀進緩存中去。緩存被用戶進程變臟,空閑緩存的數量就變少了。如果空閑的緩存下降的太少了,如果緩存不能找到空閑的塊用戶進程就必須從硬盤中讀塊。dbwn管理着高速緩存是為了讓用戶進程總能找到空閑的緩存。

 

 

 

 

SGA只會將修改了的數據(臟數據)寫入磁盤

 

 

LGWR(Log Writer Process)

 

 

LGWR進程在啟動實例時啟動

 

LGWR是把log_buffer中的日志條目ORACLE把客戶提交的SQL語句轉換成ORACLE能夠識別、通過它可以重構數據的一種日志格式)寫入到日志文件中.

 

LGWR保存日志條目,迅速釋放log_buffer空間,只要該日志條目寫入到日志文件,所占的內存空間就釋放.所以log_buffer的功能就是臨時的存放日志條目,循環的使用,如果log_buffer滿了,就無法接受新的事務,就會發生實例掛起現象.

 

LGWR的作用

將日志緩存區的數據從內存寫到磁盤的redo文件里,完成數據庫對象創建、更新等操作過程中的記錄。

 

LGWR的一些理解:

 

LGWR,是Log Writer的縮寫,也是一種后台進程。主要負責將日志緩沖內容寫到磁盤的在線重做日志文件或組中。DBWn將dirty塊寫到磁盤之前,所有與buffer修改相關的redo log都需要由LGWR寫入磁盤的在線重做日志文件(組),如果未寫完,那么DBWn會等待LGWR,也會產生一些相應的等待事件(例如:log file prarllel write,后面單獨作為話題再聊)。總之,這樣做的目的就是為了當crash時,可以有恢復之前操作的可能,也是Oracle在保持交易完整性方面的一個機制。

 

相關知識點:

1、LGWR寫日志是順序寫,這就解釋了一個Orace Server只能有一個LGWR進程,不能像DBWR那樣可以有多個,否則就無法保證順序寫的機制,而且可能會產生鎖的問題。

2、用戶進程每次修改內存數據塊時,都會在日志緩沖區(redo buffer)中構造一個相應的重做條目(redo entry),它記錄了被修改數據塊修改之前和之后的值。

3、LGWR將redo entry寫入聯機日志文件的情況可以概括為兩種:后台寫和同步寫,或者說異步寫和同步寫。

 

 

可以使用如下命令查看日志文件位置:

SQL> select group#,member from v$logfile;

 

    GROUP#

----------

MEMBER

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

         3

/u01/app/oracle/oradata/gaga01/redo03.log

 

         2

/u01/app/oracle/oradata/gaga01/redo02.log

 

         1

/u01/app/oracle/oradata/gaga01/redo01.log

 

 

LGWR進行寫操作的情況:

1、用戶進程提交一個commit

2.日志緩沖區達到1/3范圍,或者包含了1MB的緩存重做日志數據

3.要求LGWR切換日志文件

4.出現超時(3秒鍾內未活動,則進行一次寫操作。)

5.DBWR需要寫入的數據的SCN號大於LGWR 記錄的SCN號,DBWR 觸發LGWR寫入

 

 

 LGWR的工作機制:

    1、提交的時候,LGWR先要把日志緩沖區中的日志條目先寫入到​日志文件,然后再提示用戶該事務已經提交,以防在提交的時候突然間斷電,導致客戶先收到提交提示,而事務卻丟失,這是不允許發生的。就好像我們到銀行取錢的時候,銀行要我們先簽字,再給錢一個道理,萬一你丫的拿了錢跑了,不簽字以后不認賬。

    2、當log_buffer三分之一滿的時候,日志馬上要寫,三分之一滿意味着日志將要用之過半,所以要抓緊寫,​然后釋放空間,以提供空間給新的事務。

    3、當日志條目達到1MB的時候,LGWR也要開始寫,如果不寫,此時實例崩潰,就會丟失太多的事務,所以當積累了一定的事務量的時候,LGWR就要寫了。

    4、​每隔3秒就要寫,這個目的也是為了減少事務丟失,因為只要把日志條目保存了,即使實例崩潰了,也能夠根據redolog進行重做,不會丟失數據。

    5、​在DBWn寫之前LGWR就要寫,因為我們要把事務造成的修改給保存起來了,所以我們先要把該事務先保存,要不然先保存修改的數據,此時實例崩潰了,事務沒有記下來,那么數據緩沖區的臟塊就白保存了,事后也無法判斷該臟塊是哪個事務修改的,無法回滾。

    以上是LGWR寫的觸發因素,我們可以發現LGWR寫的頻率是最高的,下面我們來討論一下跟性能相關的問題,我們在維護數據庫時,一條最根本的原則是:保證log_buffer始終都有可用空間給Server進程寫,否則就會出現事務等待,做到這一點,就必須保證有足夠數量的日志組,以及足夠大的日志組,只要日志組有可用的空間給LGWR寫,就能夠及時的釋放log_buffer的空間,能夠保證log_buffer被永久的循環的使用,有關與LGWR相關的調優問題,我們在后面的調優章節中詳細的給大家介紹。

后台寫的條件:

(1)、每3秒LGWR啟動一次。

(2)、DBWR啟動時如果發現dirty塊對應的redo entry還沒寫入聯機日志文件,則DBWR觸發LGWR進程並等待LGWR完成后繼續。

(3)、redo entry數量達到整個log buffer的1/3時,觸發LGWR。

(4)、redo entry的數量達到1M。

同步寫的條件:

COMMIT。即執行COMMIT時,必須等待log buffer進行flushing操作(可能產生log file sync等待事件),寫入磁盤中的聯機日志文件。但一般上述1/3滿的條件觸發LGWR,幾乎強制LGWR實時寫,因此當需要執行COMMIT,可能沒有任何redo entry需要寫入了。

4、3秒觸發LGWR的規則,事實上,這個超時是DBWR的,但是因為LGWR總在DBWR調用之前執行,因此效果上也相當於LGWR的超時是3秒即調用。

LGWR負責釋放臟的日志塊從而提供可用日志塊,LGWR在日志緩沖區中的臟日志塊超過1M或者超過日志緩沖區的1/3時就會啟動,而且在將重做記錄寫入聯機日志文件時,都是按照順序寫入,不存在類似DBWR的隨機寫入,所以寫入的速度是非常快的

        觸發LGWR進程將日志緩沖區中的日志信息寫入聯機日志文件條件包括以下幾種:

        1) 前台進程觸發,包括兩種情況。最顯而易見的一種情況就是用戶發出commit或rollback語句進行提交時,需要觸發LGWR將內存里的日志信息寫入聯機日志文件,因為提交的數據必須被保護而不被丟失;另外一種情況就是在日志緩沖區中找不到足夠的內存來放日志信息時,也會觸發LGWR進程將一些日志信息寫入聯機日志文件以后,從而釋放一些空間出來。

        2) 每隔三秒鍾,LGWR啟動一次。

        3) 在DBWR啟動時,如果發現臟數據塊所對應的重做條目還沒有寫入聯機日志文件,則DBWR觸發LGWR進程並等待LRWR寫完以后才會繼續。

        4) 日志信息的數量達到整個日志緩沖區的1/3時,觸發LGWR。

        5) 日志信息的數量達到1MB時,觸發LGWR。

        6) 發生日志切換時觸發LGWR。

        oracle記錄數據庫變化(也就是記錄日志信息)的最小單位是改動向量(change vector)。改動向量用來描述對數據庫中任何單個數據塊所做的一次改動。改動向量的內容包括:被改動的數據塊的版本號、事務操作代碼、被改動的數據塊的地址等。這里的版本號非常重要,它能夠幫助數據塊始終能夠體現當前最新的狀態。oracle在建立改動向量時,會從數據塊中拷貝其版本號。而當恢復期間,oracle讀取改動向量並將改動應用於相應的數據塊以后,被恢復的數據塊的版本號加1。這里的數據塊可以屬於表、也可以數據索引、也可以屬於回滾段。但是對於臨時表空間里的臨時段,不會生成改動向量。

        對於update事務,

        1) 對回滾段事務表的改動,這發生在回滾段段頭。事務表中包含被修改的數據塊的地址、該事務的狀態(commit或active)、 以及存有該事務所使用的回滾段的地址。如果事務表被修改,就會產生針對於它的改動向量。

        2) 對回滾段數據塊的改動。將修改前的舊值(abc)存放到回滾段的數據塊里。這時回滾段發生改變,於是產生改動向量。

        3) 對redo_test表的數據塊所做的改動。將修改后的新值(cdf)存放到表的數據塊里。這時數據塊發生改變,於是產生改動向量。

        重做記錄中會有三個改動向量。當然可能有其他情況會產生新的重做記錄,比如修改的列如果有索引,則必須修改索引。這時就會產生第二個重做記錄,用來描述對索引數據塊的修改。這時候的重做記錄還是和第一個重做記錄一樣,包含多個改動向量。此外,在事務完成之后運行commit或rollback語句時,就會產生第三個重做記錄。該重做記錄只有一個改動向量,用來記錄對回滾段事務表的更改,因為commit或rollback時,需要更新事務表里記錄的該事務的狀態

 

   

 

 

 

 

SMON(System Monitor Process)

SMON是Oracle數據庫至關重要的一個后台進程,SMONSystem Monitor 的縮寫,意即:系統監控。

作用:

      • 實例恢復
        • 前滾Rolls forward changes in redo logs
        • Opens database for user access
        • 回滾Rolls back uncommitted transactions
      • 回收空間Coalesces free space
      • 釋放臨時表Deallocates temporary segments

 

在數據庫啟動過程中,SMON排在CKPT進程之后,在Oracle9i中排在第六號的位置:

PMON started with pid=2

DBW0 started with pid=3

LGWR started with pid=4

CKPT started with pid=5

SMON started with pid=6

RECO started with pid=7

SMON負責系統監視已經一些系統清理及恢復工作,這些工作主要包括:

1.清理臨時空間以及臨時段

SMON負責在數據庫啟動清理臨時表空間中的臨時段,或者一些異常操作過程遺留下來的臨時段.

例如,當創建索引過程中,創建期間分配給索引的Segment被標志為TEMPORARY,如果Create Index (或rebuild Index等)會話因某些原因異常中斷,SMON負責清理這些臨時段。

2.接合空閑空間

在DMT(字典管理表空間)中,SMON負責把那些在表空間中空閑的並且互相是鄰近的Extent接合成一個較大的空閑擴展區,這需要表空間的pctincrease設置為非零值。

3.執行實例恢復(Instance recovery)

在實例恢復過程中,SMON的工作包括三個環節:

      1. 應用Redo執行前滾、
      2. 打開數據庫提供訪問、
      3. 回滾未提交數據

4.離線(Offline)回滾段

在自動回滾段管理(AUM)中負責Offline不再需要的回滾段,日志中會記錄類似如下信息:

Fri May 2 15:43:21 2008

SMON offlining US=11

5.執行並行恢復

以下信息來自9i日志:

Fri May 11 21:30:45 2007

SMON: Parallel transaction recovery tried

 

Also Record some English Note About SMON:

The SMON background process performs all system monitoring functions on the Oracle database. The SMON process performs a "warm start" each time that Oracle is re-started, ensuring that any in-flight transaction at the time of the last shutdown are recovered. For example, if Oracle crashed hard with a power failure, the SMON process is attached at startup time, and detects any uncompleted work, using the rollback segments to recover the transactions. In addition, SMON performs periodic cleanup of temporary segments that are no longer needed, and also perform tablespace operations, coalescing contiguous free extents into larger extents.

 

 

 

      • Process Monitor Process(PMON)
        • 回滾事務
        • 釋放鎖及其它資源
        • 重啟死掉的調度器.(在共享服務器中用).
        • 在監聽器中注冊服務信息

 

 

 

      • CheckPoint Process(CKPT)

檢查點,把內存中的數據寫到磁盤上

      • 會啟動DBWn來寫臟數據(SIGNALLING DBWn at CKPT.)
      • 完后會更新DATAFILEHEADER和控制文件的HEADER.HEADER中有同步所需要的信息,CHECKPOINT的信息.
      • ORACLE,正常情況下,所有文件必須同期性地同步;CHECKPOINT來完成.

 

 

      • 服務器進程 --server process
        • 接受客戶端發出的SQL請求。
        • 完成SQL的分析,執行計划和SQL的執行過程。

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM