oracle體系結構(轉)

zhouwf0726發表於2019-05-04

http://oracle.chinaitlab.com/serial/38165.html

在本章裡你可以瞭解以下內容
  
  1、 ORACLE 例項——包括記憶體結構與後臺程式
  2、 ORACLE 資料庫——物理作業系統檔案的集合
  3、 瞭解記憶體結構的組成
  4、 瞭解後臺程式的作用
  5、 瞭解資料庫的物理檔案
  6、 解釋各種邏輯結構
  
  一、ORACLE例項
  
  1、ORACLE 例項
  
  System Global Area(SGA) 和 Background Process 稱為資料庫的例項。
  
  2、ORACLE 資料庫
  
  一系列物理檔案的集合(資料檔案,控制檔案,聯機日誌,引數檔案等)
  
  3、系統全域性共享區System Global Area(SGA)
  
  System Global Area 是一塊巨大的共享記憶體區域,他被看做是Oracle 資料庫的一個大緩衝池,這裡的資料可以被ORACLE的各個程式共用。其大小可以通過如下語句檢視:
  SQL> select * from v$sga;
  NAME VALUE
  -------------------- ---------
  Fixed Size 39816
  Variable Size 259812784
  Database Buffers 1.049E+09
  Redo Buffers 327680
  
  更詳細的資訊可以參考V$sgastat、V$buffer_pool
  
  主要包括以下幾個部分:
  
  a、 共享池(Shared pool)
  
  共享池是SGA中最關鍵的記憶體片段,特別是在效能和可伸縮性上。一個太小的共享池會扼殺效能,使系統停止,太大的共享池也會有同樣的效果,將會消耗大量的CPU來管理這個共享池。不正確的使用共享池只會帶來災難。共享池主要又可以分為以下兩個部分:
  
  SQL語句緩衝(Library Cache)
  
  當一個使用者提交一個SQL語句,Oracle會將這句SQL進行分析(parse),這個過程類似於編譯,會耗費相對較多的時間。在分析完這個SQL,Oracle會把他的分析結果給儲存在Shared pool的Library Cache中,當資料庫第二次執行該SQL時,Oracle自動跳過這個分析過程,從而減少了系統執行的時間。這也是為什麼第一次執行的SQL 比第二次執行的SQL要慢一點的原因。
  
  下面舉例說明parse的時間
  SQL> select count(*) fromscpass ;
  COUNT(*)
  ----------
  243
  Elapsed: 00:00:00.08
  
  這是在Share_pool 和Data buffer 都沒有資料緩衝區的情況下所用的時間
  SQL> alter system flush SHARED_POOL;
  System altered.
  
  清空Share_pool,保留Data buffer
  SQL> select count(*) from scpass ;
  COUNT(*)
  ----------
  243
  Elapsed: 00:00:00.02
  SQL> select count(*) from scpass ;
  COUNT(*)
  ----------
  243
  Elapsed: 00:00:00.00
  
  從兩句SQL 的時間差上可以看出該SQL 的Parse 時間約為00:00:00.02
  
  對於儲存在共享池中的SQL語句,可以從V$Sqltext、v$Sqlarea中查詢到,對於程式設計者來說,要儘量提高語句的重用率,減少語句的分析時間。一個設計的差的應用程式可以毀掉整個資料庫的Share pool,提高SQL語句的重用率必須先養成良好的變成習慣,儘量使用Bind變數。
  
  資料字典緩衝區(Data Dictionary Cache)
  
  顯而易見,資料字典緩衝區是ORACLE特地為資料字典準備的一塊緩衝池,供ORACLE內部使用,沒有什麼可以說的。
  
  b、塊緩衝區快取記憶體(Database Buffer Cache)
  
  這些緩衝是對應所有資料檔案中的一些被使用到的資料塊。讓他們能夠在記憶體中進行操作。在這個級別裡沒有系統檔案,,戶資料檔案,臨時資料檔案,回滾段檔案之分。也就是任何檔案的資料塊都有可能被緩衝。資料庫的任何修改都在該緩衝裡完成,並由DBWR程式將修改後的資料寫入磁碟。
  
  這個緩衝區的塊基本上在兩個不同的列表中管理。一個是塊的“髒”表(Dirty List),需要用資料庫塊的
  
  書寫器(DBWR)來寫入,另外一個是不髒的塊的列表(Free List),一般的情況下,是使用最近最少使用 (Least Recently Used,LRU)演算法來管理。塊緩衝區快取記憶體又可以細分為以下三個部分(Default pool,Keep pool,Recycle pool)。如果不是人為設定初始化引數(Init.ora),ORACLE將預設為Default pool。由於作業系統定址能力的限制,不通過特殊設定,在32位的系統上,塊緩衝區快取記憶體最大可以達到1.7G,在64位系統上,塊緩衝區快取記憶體最大可以達到10G。
  
  c、重做日誌緩衝區(Redo log buffer)
  
  重做日誌檔案的緩衝區,對資料庫的任何修改都按順序被記錄在該緩衝,然後由LGWR程式將它寫入磁碟。這些修改資訊可能是DML語句,如(Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。 重做日誌緩衝區的存在是因為記憶體到記憶體的操作比較記憶體到硬碟的速度快很多,所以重作日誌緩衝區可以加快資料庫的操作速度,但是考慮的資料庫的一致性與可恢復性,資料在重做日誌緩衝區中的滯留時間不會很長。所以重作日誌緩衝區一般都很小,大於3M之後的重作日誌緩衝區已經沒有太大的實際意義。
  
  d、Java程式緩衝區(Java Pool)
  
  Java 的程式區,Oracle 8I 以後,Oracle 在核心中加入了對Java的支援。該程式緩衝區就是為Java 程式保留的。如果不用Java程式沒有必要改變該緩衝區的預設大小。
  
  e、大池(Large Pool)
  
  大池的得名不是因為大,而是因為它用來分配大塊的記憶體,處理比共享池更大的記憶體,在8.0開始引入。
  
  下面物件使用大池:
  
  MTS——在SGA的Large Pool中分配UGA
  
  語句的並行查詢(Parallel Executeion of Statements)——允許程式間訊息緩衝區的分配,用來協調 並行查詢伺服器
  
  備份(Backup)——用於RMAN磁碟I/O快取
  
  4、後臺程式(Background process)
  
  後臺程式是Oracle的程式,用來管理資料庫的讀寫,恢復和監視等工作。Server Process主要是通過他和user process進行聯絡和溝通,並由他和user process進行資料的交換。在Unix機器上,Oracle後臺程式相對於作業系統程式,也就是說,一個Oracle後臺程式將啟動一個作業系統程式;在Windows機器上, Oracle後臺程式相對於作業系統執行緒,開啟工作管理員,我們只能看到一個ORACLE.EXE的程式,但是通過另外的工具,就可以看到包含在這裡程式中的執行緒。
  
  在Unix上可以通過如下方法檢視後臺程式:
  
  ps –ef | grep ora_
  # ps -ef | grep ora_ | grep XCLUAT
  oracle 29431 1 0 Sep 02 2:02 ora_dbwr_SID
  oracle 29444 1 0 Sep 02 0:03 ora_ckpt_SID
  oracle 29448 1 0 Sep 02 2:42 ora_smon_SID
  oracle 29442 1 0 Sep 02 3:25 ora_lgwr_SID
  oracle 29427 1 0 Sep 02 0:01 ora_pmon_SID
  
  a、Oracle系統有5 個基本程式他們是
  DBWR(資料檔案寫入程式)
  LGWR(日誌檔案寫入程式)
  SMON(系統監護程式)
  PMON(使用者程式監護程式)
  CKPT(檢查點程式,同步資料檔案, 日誌檔案,控制檔案)
  
  b、DBWR
  將修改過的資料緩衝區的資料寫入對應資料檔案
  維護系統內的空緩衝區
  這裡指出幾個容易錯誤的概念:
  當一個更新提交後,DBWR把資料寫到磁碟並返回給使用者提交完成.
  DBWR會觸發CKPT 後臺程式
  DBWR不會觸發LGWR 程式
  上面的概念都是錯誤的.
  DBWR是一個很底層的工作程式,他批量的把緩衝區的資料寫入磁碟。和任何前臺使用者的程式幾乎沒有什麼關係,也不受他們的控制。至於DBWR會不會觸發LGWR和CKPT程式,我們將在下面幾節裡討論。
  DBWR工作的主要條件如下
  DBWR 超時
  系統中沒有多的空緩衝區用來存放資料
  CKPT 程式觸發DBWR 等
  
  c、LGWR
  將重做日誌緩衝區的資料寫入重做日誌檔案,LGWR是一個必須和前臺使用者程式通訊的程式。當資料被修改的時候,系統會產生一個重做日誌並記錄在重做日誌緩衝區內。這個重做日誌可以類似的認為是以下的一個結構:
  SCN=000000001000
  資料塊ID
  物件ID=0801
  資料行=02
  修改後的資料=0011
  提交的時候,LGWR必須將被修改的資料的重做日誌緩衝區內資料寫入日誌資料檔案,然後再通知前臺程式提交成功,並由前臺程式通知使用者。從這點可以看出LGWR承擔了維護系統資料完整性的任務。
  LGWR 工作的主要條件如下
  使用者提交
  有1/3 重做日誌緩衝區未被寫入磁碟
  有大於1M 重做日誌緩衝區未被寫入磁碟
  超時
  DBWR需要寫入的資料的SCN號大於LGWR 記錄的SCN號,DBWR 觸發LGWR寫入
  
  d、SMON
  工作主要包含
  清除臨時空間
  在系統啟動時,完成系統例項恢復
  聚結空閒空間
  從不可用的檔案中恢復事務的活動
  OPS中失敗節點的例項恢復
  清除OBJ$表
  縮減回滾段
  使回滾段離線
  
  e、PMON
  主要用於清除失效的使用者程式,釋放使用者程式所用的資源。如PMON將回滾未提交的工作,釋放鎖,釋放分配給失敗程式的SGA資源。
  
  f、CKPT
  同步資料檔案,日誌檔案和控制檔案,由於DBWR/LGWR的工作原理,造成了資料檔案,日誌檔案,控制檔案的不一至,這就需要CKPT程式來同步。CKPT會更新資料檔案/控制檔案的頭資訊。
  CKPT工作的主要條件如下
  在日誌切換的時候
  資料庫用immediate ,transaction , normal 選項shutdown 資料庫的時候
  根據初始話檔案LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設定的數值來確定
  使用者觸發
  以下程式的啟動需要手工配置
  
  g、ARCH
  當資料庫以歸檔方式執行的時候,Oracle會啟動ARCH程式,當重做日誌檔案被寫滿時,日誌檔案進行切換,舊的重做日誌檔案就被ARCH程式複製到一個/多個特定的目錄/遠端機器。這些被複制的重做日誌檔案被叫做歸檔日誌檔案。
  
  h、RECO
  負責解決分佈事物中的故障。Oracle可以連線遠端的多個資料庫,當由於網路問題,有些事物處於懸而未決的狀態。RECO程式試圖建立與遠端伺服器的通訊,當故障消除後,RECO程式自動解決所有懸而未決的會話。
  i、服務程式Server Process
  服務程式的分類
  專用服務程式(Dedicated Server Process)
  一個服務程式對應一個使用者程式
  共享服務程式(MultiTreaded Server Process)
  一個服務程式對應多個使用者程式,輪流為使用者程式服務。
  PGA & UGA
  PGA = Process Global Area
  UGA = User Global Area
  他儲存了使用者的變數、許可權、堆疊、排序空間等使用者資訊,對於專用伺服器程式,UGA在PGA中分配。對於多執行緒程式,UGA在Large pool中分配。
  
  j、使用者程式User Process
  在客戶端,將使用者的SQL 語句傳遞給服務程式
  
  5、一個貫穿資料庫全域性的概念----系統改變號SCN(System Change Number)
  系統改變號,一個由系統內部維護的序列號。當系統需要更新的時候自動增加,他是系統中維持資料的一致性和順序恢復的重要標誌。
  
  a. 查詢語句不會使SCN增加,就算是同時發生的更新,資料庫內部對應的SCN也是不同的。這樣一來就保證了資料恢復時候的順序。
  
  b. 維持資料的一致性,當一
  
  二、ORACLE 資料庫
  
  ORACLE資料庫的組成——物理作業系統檔案的集合。主要包括以下幾種。
  
  1、控制檔案(引數檔案init.ora記錄了控制檔案的位置)
  控制檔案包括如下主要資訊
  資料庫的名字,檢查點資訊,資料庫建立的時間戳
  所有的資料檔案,聯機日誌檔案,歸檔日誌檔案資訊
  備份資訊等
  有了這些資訊,Oracle就知道那些檔案是資料檔案,現在的重做日誌檔案是哪些,這些都是系統啟動和執行的基本條件,所以他是Oracle執行的根本。如果沒有控制檔案系統是不可能啟動的。控制檔案是非常重要的,一般採用多個鏡相複製來保護控制檔案,或採用RAID來保護控制檔案。控制檔案的丟失,將使資料庫的恢復變的很複雜。
  控制檔案資訊可以從V$Controlfile中查詢獲得
  
  2、資料檔案(資料檔案的詳細資訊記載在控制檔案中)
  可以通過如下方式檢視資料檔案
  SQL> select name from v$datafile;
  NAME
  ---------------------------------------------
  /u05/dbf/PROD/system_01.dbf
  /u06/dbf/PROD/temp_01.dbf
  /u04/dbf/PROD/users_01.dbf
  /u09/dbf/PROD/rbs_01.dbf
  /u06/dbf/PROD/applsys_indx_01.dbf
  /u05/dbf/PROD/applsys_data_01.dbf
  從以上可以看出,資料檔案大致可以分為以下幾類:
  
  i. 系統資料檔案(system_01.dbf)
  存放系統表和資料字典,一般不放使用者的資料,但是使用者指令碼,如過程,函式,包等卻是儲存在資料字典中的。
  名詞解釋:資料字典 資料字典是一些系統表或檢視,他存放系統的資訊,他包括資料庫版本,資料檔案資訊,表與索引等段資訊,系統的執行狀態等各種和系統有關的資訊和使用者指令碼資訊。資料庫管理員可以通過對資料字典的查詢,就可以瞭解到Oracle的執行狀態。
  
  ii. 回滾段檔案(rbs_01.dbf)
  如果資料庫進行對資料的修改,那麼就必須使用回滾段,回滾段是用來臨時存放修改前的資料(Before Image)。回滾段通常都放在一個單獨的表空間上(回滾表空間),避免表空間碎片化,這個表空間包含的資料檔案就是回滾資料檔案。
  
  iii. 臨時資料檔案(temp_01.dbf)
  主要存放使用者的排序等臨時資料,與回滾段相似,臨時段也容易引起表空間碎片化,而且沒有辦法在一個永久表空間上開闢臨時段,所以就必須有一個臨時表空間,它所包含的資料檔案就是臨時資料檔案,主要用於不能在記憶體上進行的排序操作。我們必須為使用者指定一個臨時表空間。
  
  iv. 使用者資料檔案(/applsys_data_01.dbf ,applsys_indx_01.dbf)
  存放使用者資料,這裡列舉了兩類常見的使用者型資料,一般資料和索引資料,一般來說,如果條件許可的話,可以考慮放在不同的磁碟上。
  
  3、重做日誌檔案(聯機重做日誌)
  使用者對資料庫進行的任何操作都會記錄在重做日誌檔案。在瞭解重做日誌之前必須瞭解重做日誌的兩個概念,重做日誌組和重做日誌組成員(Member),一個資料庫中至少要有兩個日誌組檔案,一組寫完後再寫另一組,即輪流寫。每個日誌組中至少有一個日誌成員,一個日誌組中的多個日誌成員是鏡相關係,有利於日誌檔案的保護,因為日誌檔案的損壞,特別是當前聯機日誌的損壞,對資料庫的影響是巨大的。
  聯機日誌組的交換過程叫做切換,需要特別注意的是,日誌切換在一個優化效果不好的資料庫中會引起臨時的“掛起”。掛起大致有兩種情況:
  在歸檔情況下,需要歸檔的日誌來不及歸檔,而聯機日誌又需要被重新利用
  檢查點事件還沒有完成(日誌切換引起檢查點),而聯機日誌需要被重新利用
  解決這種問題的常用手段是:
  
  i.增加日誌組
  
  ii.增大日誌檔案成員大小
  通過v$log可以檢視日誌組,v$logfile可以檢視具體的成員檔案。
  
  4、歸檔日誌檔案
  Oracle可以執行在兩種模式之中,歸檔模式和不歸檔模式。如果不用歸檔模式,當然,你就不會有歸檔日誌,但是,你的系統將不會是一個實用系統,特別是不能用於生產系統,因為你可能會丟失資料。但是在歸檔模式中,為了儲存使用者的所有修改,在重做日誌檔案切換後和被覆蓋之間系統將他們另外儲存成一組連續的檔案系列,該檔案系列就是歸檔日誌檔案。
  有人或許會說,歸檔日誌檔案佔領我大量的硬碟空間,其實,具體想一想,你是願意浪費一點磁碟空間來保護你的資料,還是願意丟失你的資料呢?顯而義見,我們需要保證我們的資料的安全性。其實,歸檔並不是一直佔領你的磁碟空間,你可以把她備份到磁帶上,或則刪除上一次完整備份前的所有日誌檔案。
  
  5、初始化引數檔案
  initSID.ora或init.ora檔案,因為版本的不一樣,其位置也可能會不一樣。在8i中,通常位於$ORACLE_HOME/admin//Pfile下,初始化檔案記載了許多資料庫的啟動引數,如記憶體,控制檔案,程式數等,在資料庫啟動的時候載入(Nomount時載入),初始化檔案記錄了很多重要引數,對資料庫的效能影響很大,如果不是很瞭解,不要輕易亂改寫,否則會引起資料庫效能下降。
  
  6、其他檔案
  i . 密碼檔案
  用於Oracle 的具有sysdba許可權使用者的認證.
  ii. 日誌檔案
  報警日誌檔案(alert.log或alrt.ora)
  記錄資料庫啟動,關閉和一些重要的出錯資訊。資料庫管理員應該經常檢查這個檔案,並對出現的問題作出即使的反應。你可以通過以下SQL 找到他的路徑select value from v$PARAMETER where name ="background_dump_dest";
  後臺或使用者跟蹤檔案
  系統程式或使用者程式出錯前寫入的資訊,一般不可能讀懂,可以通過ORACLE的TKPROF工具轉化為可以讀懂的格式。對於系統程式產生的跟蹤檔案與報警日誌檔案的路徑一樣,使用者跟蹤檔案的路徑,你可以通過以下SQL找到他的路徑select value from v$PARAMETER where name ="user_dump_dest";
  
  三、ORACLE邏輯結構
  
  1、 表空間(tablespace)
  表空間是資料庫中的基本邏輯結構,一系列資料檔案的集合。一個表空間可以包含多個資料檔案,但是一個資料檔案只能屬於一個表空間。
  
  2、 段(Segment)
  段是物件在資料庫中佔用的空間,雖然段和資料庫物件是一一對應的,但段是從資料庫儲存的角度來看的。一個段只能屬於一個表空間,當然一個表空間可以有多個段。
  表空間和資料檔案是物理儲存上的一對多的關係,表空間和段是邏輯儲存上的一對多的關係,段不直接和資料檔案發生關係。一個段可以屬於多個資料檔案,關於段可以指定擴充套件到哪個資料檔案上面。
  段基本可以分為以下四種
  資料段(Data Segment)
  索引段(Index Segment)
  回滾段(Rollback Segment)
  臨時段(Temporary Segment)
  
  3、區間(Extent)
  關於Extent的翻譯有多種解釋,有的譯作擴充套件,有的譯作盤區,我這裡通常譯為區間。在一個段中可以存在多個區間,區間是為資料一次性預留的一個較大的儲存空間,直到那個區間被用滿,資料庫會繼續申請一個新的預留儲存空間,即新的區間,一直到段的最大區間數(Max Extent)或沒有可用的磁碟空間可以申請。 在ORACLE8i以上版本,理論上一個段可以無窮個區間,但是多個區間對ORACLE卻是有效能影響的,ORACLE建議把資料分佈在儘量少的區間上,以減少ORACLE的管理與磁頭的移動。
  
  4、Oracle資料塊(Block)
  ORACLE最基本的儲存單位,他是OS資料塊的整數倍。ORACLE的操作都是以塊為基本單位,一個區間可以包含多個塊(如果區間大小不是塊大小的整數倍,ORACLE實際也擴充套件到塊的整數倍)。
  
  5、基本表空間介紹
  
  a. 系統表空間
  主要存放資料字典和內部系統表基表
  檢視資料資料字典的SQL
  select * from dict
  檢視內部系統表的SQL
  select * from v$fixed_view_definition
  DBA對系統的系統表中的資料字典必須有一個很深刻的瞭解,他們必須準備一些基礎的SQL語句,通過這些SQL可以立即瞭解系統的狀況和資料庫的狀態,這些基本的SQL包括
  系統的剩餘空間
  系統的SGA
  狀態系統的等待
  使用者的許可權
  當前的使用者鎖
  緩衝區的使用狀況等
  在成為DBA 的道路上我們不建議你過分的依賴於OEM/Quest 等優秀的資料庫管理工具,因為他們不利於你對資料資料字典的理解,SQL語句可以完成幾乎全部的資料庫管理工作。
  大量的讀少量的寫是該表空間的一個顯著的特點。
  
  b. 臨時表空間.
  臨時表空間顧名思義是用來存放臨時資料的,例如排序操作的臨時空間,他的空間會在下次系統啟動的時候全部被釋放。
  
  c. 回滾段表空間
  
  i. 回滾段在系統中的作用
  當資料庫進行更新插入刪除等操作的時候,新的資料被更新到原來的資料檔案,而舊的資料(Before Image)就被放到回滾段中,如果資料需要回滾,那麼可以從回滾段將資料再複製到資料檔案中。來完成資料的回滾。在系統恢復的時候, 回滾段可以用來回滾沒有被commit 的資料,解決系統的一至性。
  回滾段在什麼情況下都是大量的寫,一般是少量讀,因此建議把回滾段單獨出來放在一個單獨的裝置(如單獨的磁碟或RAID),以減少磁碟的IO爭用。
  
  ii. 回滾段的工作方式
  一個回滾表空間可以被劃分成多個回滾段.
  一個回滾段可以儲存多個會話的資料.
  回滾段是一個圓形的資料模型
  假設回滾段由4 個區間組成,他們的使用順序就是區間1à區間2à區間3à區間4à區間1。也就是說,區間是可以迴圈使用的,當區間4到區間1的時候,區間1裡面的會話還沒有結束, 區間4用完後就不能再用區間1,這時系統必須分配區間5,來繼續為其他會話服務服務。
  我們分析一個Update 語句的完成
  
  ①. 使用者提交一個Update 語句
  
  ②. Server Process 檢查記憶體緩衝.
  如果沒有該資料塊的緩衝,則從磁碟讀入
  
  i. 如果沒有記憶體的有效空間,DBWR被啟動將未寫入磁碟的髒緩衝寫入磁碟
  
  ii. 如果有有效空間,則讀入
  
  ③. 在緩衝內更新資料
  
  i. 申請一個回滾段入口,將舊資料寫如回滾段
  
  ii. 加鎖並更新資料
  
  iii. 並在同時將修改記錄在Redo log buffer中

http://oracle.chinaitlab.com/serial/38165.html


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

相關文章