簡談Oracle體系結構


 覺得老師在講Oracle數據庫時,底層的只是介紹特別少,Oracle數據庫的體系基本完全不明白,完全不明白Oracle的工作機制和過程,在此通過看一些書籍,總結一下:

1.  查看一些數據文件的基本信息
   desc dba_data_files;  //查看數據文件的結構
   select * from dba_data_files;  查看一些基本的信息
   
   select name from v$controlfile; //查看控制文件的name
   
   select group#,status from v$log;  //查看日誌文件的組合狀態
   
   其他文件還有參數文件,備份文件,歸檔重做日誌文件,以及警告,跟蹤文件等等。
   1)參數文件:參數文件用於記錄Oracle數據庫的一些基本參數信息,主要包括數據庫名和控制文件所在路徑等等,參數文件分爲文本參數文件(PFILE)和服務器參數文件(SPFILE)。
   
   2)備份文件: 文件受損時,可以藉助備份文件對受損文件進行數據的恢復,對文件進行還原的過程,就是用備份文件替換該文件的過程。
   
   3)歸檔重做日誌文件:該文件用於對寫滿的日誌文件進行賦值並保存,具體功能由歸檔進程ARCn實現,該進程負責將寫滿的重做日誌文件複製到歸檔日誌文件中
   
   4)警告,跟蹤日誌文件
   當一個進程發現了一個內部錯誤的時候,可以將錯誤的信息存儲到該進程的跟蹤文件中,而警告文件則是一種特殊的跟蹤文件,它包含錯誤事件的說明,而隨之產生的跟蹤文件則記錄了錯誤的詳細信息。
   
   
   
 2.
   邏輯存儲結構:
   數據塊--》區--》段--》表空間--》數據庫
   1)表空間:
   這個是Oracle中最大的邏輯存儲結構,它與物理上的數據文件相對應,每個Oracle數據庫都至少有一個表空間,每個表空間均可以對應多個數據文件,表空間的大小等於構成該表空間的所有數據文件的大小之和。
   select table_name from dba_tablespace;  //查看錶空間的名稱
   會顯示:
   SYSTEM  --系統表空間,用於存儲系統的數據字典,系統的管理信息和用戶數據等
   SYSAUX  --輔助系統表空間。用於減少系統表空間的符合,提高系統的作業效率
   UNDOTBS1  --撤銷表空間。用於在自動撤銷管理方式下存儲撤銷消息
   TEMP  --臨時表空間,用於存儲臨時的數據,例如存儲排序時產生的臨時數據
   USERS  --用戶表空間。用於存儲永久性用戶對象和私有信息
   EXAMPLE  --實例表空間。用於存放實例數據庫的模式對象信息等
   
   2)段
   段是一組盤區,它不再是存儲空間的分配單位,而是一個獨立的邏輯存儲結構。對於具有獨立存儲結構的對象,它的數據全部存放在保存它的段中,一個段只屬於一個特定的數據庫對象,每當創建一個具有獨立段的數據庫對象時Oracle會爲它創建一個段。
  
  3)區
  這個是磁盤空間分配的最小單位,由一個或者多個數據塊組成。每當一個段中的所有空間愛你被使用完後,系統將自動爲該段分配一個新的區。  一個或多個區組成一個段,所以段的大小由區的個數決定,但是一個數據段可以包含區的大小並不是無限制的,它由以下兩個參數決定:
  MIN_EXTENTS: 定義段初始分配的區的個數,也就是段最少可分配的個數
  MAX_EXTENTS: 定義一個段最多可以分配的區的個數
   select table_name,min_extents,max_extents from dba_tablespace;  //查看錶的最大和最小區的個數
   
   4)塊
   數據塊是用來管理存儲空間的最基本單位,也是最小的邏輯存儲單位。Oracl數據庫都是以數據塊爲單位進行邏輯的讀寫操作。在數據塊中可以存儲不同類型的數據,如表數據,索引數據等,但是沒個數據塊都具有相同的結構。
   一個數據塊主要由頭部,表目錄,行目錄,空閒空間和行空間組成
   塊頭部: 包含數據塊中一般的屬性信息,如數據塊的物理地址,所屬段的類型
   表目錄: 如果數據塊中存儲的數據是某一個表的數據,則關於該表的信息將會存放在目錄中
   行目錄: 用來存儲數據塊中有效的行目錄
   空閒空間: 數據塊中還沒有使用的存儲空間
  行空間: 表或者索引的數據存儲在行空間中,因此行空間是數據塊中已經使用的存儲空間。
   
   
   
 3.Oracle的進程結構
  在Oracle數據庫啓動時候,首先啓動Oracle實例,系統建好自動分配SGA(系統全局區)並啓動多個後臺進程,在啓動後臺進程後一步的爲所有數據庫用戶執行不同的任務。通過系統查詢字典V$BGPROCESS,可以瞭解數據庫中所有的後臺進程信息。其中Oracle數據庫實例的後臺進程主要有DBWin進程,SMON進程,PMON進程,ARCn進程,RECO進程,LCKn進程,Dnnn進程以及SNPn進程。
  
  1.DBWn進程,是數據庫採用LRU算法將數據緩衝區的數據寫入數據文件的進程。
  
  DBWn進程的作用主要有一下幾個方面:
  管理數據緩衝區,以便用戶進程能夠找到空閒的緩衝區;
  將所有修改後的緩衝區數據寫入數據文件
  使用LRU算法將最近使用過得塊保留在內存中
  通過延遲寫來優化磁盤IO讀寫
  
  DBWn進程的工作流程如下:
  (1)當一個用戶進程產生後,服務器進程就從數據文件中查找是存在用戶進程所需要的數據
  
  (2)如果內存中沒有需要的數據,服務器進程就從數據文件中讀取數據。此時,服務器進程會首先從LRU中查找是否有存放數據的空閒塊
  
  (3)如果LRU中沒有空閒塊,則將LRU中的DIRTY數據塊移入DIRTY LIST
  
  (4)如果DIRTYLIST超長,服務器進程通知DBWn進程將數據寫入磁盤,並刷新緩衝區
  
  (5)當LRU中有空閒塊後,服務器進程從磁盤的數據文件中讀取數據並存放到數據緩衝區
  
  其他進程簡單的瞭解一下:
  LGWR 進程
  負責將日誌緩衝區中的日誌數據寫入到磁盤的日誌文件中,Oracle數據庫運行時,對數據庫的修改操作將被記錄到日誌文件信息中,而這些日誌信息將首先保存在日誌緩衝區中,當日志信息達到一定量時,由LGWR進程將日誌數據寫入日誌文件。 日誌緩衝區是一個循環緩衝區,當LGWR進程將日誌緩衝區的日誌數據寫入日誌文件後,服務器進程又可以將新的日誌數據保存到日誌緩衝區。
  
  SMON進程
  用於數據庫實例出現故障或系統崩潰的時候,通過聯機重做日誌文件中的條目應用於數據庫文件來執行崩潰恢復,SMON進程一般用於定期合併字典管理的表空間中的空閒空間,此外,它還用於在系統重新啓動期間清理所有表空間的臨時字段。
  
  PMON進程
  用於清理失效的用戶進程,釋放用戶進程所用的資源,PMON週期性的檢查調度進程和服務器的狀態,如果發現進程已死,則重新啓動它,PMON進程被有規律的喚醒,檢查是否需要使用,或者其他進程發現需要時也可以調用此進程
  
  ARCn進程
  這個有兩種運行方式,分別是歸檔方式和非歸檔方式,當且僅當Oracle數據庫運行在歸檔模式下時才產生ARCn進程,該進程主要用於將寫滿的日誌文件複製到歸檔日誌文件中,防止日誌文件組中的信息由於日誌文件的循環使用而被覆蓋。
  在一個Oracle數據庫實例中,允許請的ARCn進程的個數由參數LOG_ARCHIVE_MAX_PROCESS 決定,可通過SHOW PARAMETER語句查詢該參數
  show parameter log_archive_max_process 得出結果爲4
  
  
  RECH進程
  存在於分佈式數據庫系統中,主要負責在分佈式數據庫環境中自動回覆那些失敗的分佈式事務。
  
  LCKn進程
  LCKn進程 用於實現實例間的封鎖,它存在於並行服務器系統中。在一個Oracle數據庫實例中,最多可以啓動10個LCKn進程,進程名稱分別是LCK0,LCK1....LCK9
  
  Dnnn進程
  用於將多個用戶進程連接到服務器進程,它存在於多線程服務器結構體系中Dnnn可以啓動多個,其名稱分別爲D001,D002.....
  
  SNPn進程
  用於處理數據庫快照的自動刷新,在Oracle數據庫中,通過參數JOB_QUEUE_PROCESS來設置快照進程的個數。通過SHOW PAREMETER JOB_QUEUE_PROCESS語句,可以瞭解參數信息。
  
5.  Oracle內存結構
  1) 系統全局區域 SGA
  全局區域由一塊內存結構組成,他是所有用戶進程共享的一塊內存區域,可以包含一個數據庫實例的數據或控制信息,在一個數據庫實例中,可以有多個用戶進程,這些用戶進程共享系統全局區域中的數據,因此在系統全局區域中又稱爲共享區域。 它的大小由sga_max_size決定
  
  在系統全局區中,可以按照不同的作用分爲數據緩衝區,日誌緩衝區和共享池。
  (1)數據緩衝區用於存放最近訪問的數據塊信息,當用戶想數據庫請求數據時,如果所需的數據已經位於數據庫緩衝區,則Oracle將直接從數據緩衝區中提取信息並返回給用戶,而不必再從數據文件中國讀取數據。它供所有用戶共享 大小youdb_cache_size決定
  
  (2)日誌緩衝區
  日誌緩衝區用於存儲數據庫的修改操作信息,當日止緩衝區的日誌數量達到一定的程度的時候,有日誌寫入進程LGWR將日誌寫入磁盤日誌文件。 它的大小由log_buffer決定。 我的顯示爲 6340608
  
  (3)共享池
  用於保存最近執行的SQL語句,PL/SQL程序的數據字典信息,它是對SQL語句和PL/SQL語句進行語法分析,編譯,和執行的內存區域,共享池主要包括以下三種緩存
       庫緩衝區:用於保存SQL語句的分析代碼和執行計劃,在緩衝區中不通的數據庫用戶可以共享相同SQL語句。
    
    數據字典緩衝區:用於保存字典中得到的表,列定義和權限
    
    用戶全局區:用於保存用戶的會話信息。大小由share_pool_size 決定 可以使用 show parameter share_pool_size 查看大小
 
  2)程序全局區域
    程序全局區域是Oracle系統分配給一個進程的私有內存區域,包含單個用戶或服務器數量可控制信息,它在用戶連接到數據庫並創建一個會話的時候,由Oracle自動分配。 全局區域大小由參數pga_aggregate_target決定,通過show parameter pga..可以查看它的信息  我的顯示是0 (表示禁用)(PGA_AGGREGATE_TARGET參數用於控制PGA的總體期望目標)
 
  3)排序區
 這是Oracle系統爲排序操作產生的臨時數據提供的內存空間,實際上,在Oracle中,存放用戶排序操作產生臨時數據區域由內存區和磁盤臨時段。 當進行排序操作時候,Oracle系統會優先使用內存排序進行排序,如果內存空間不夠,才使用臨時段進行排序。  排序的大小由sort_area_size決定。 (我的顯示爲65535)
 
  4)大型池
  這個是系統全局區域中可選的一個內存結構,用於提供一個大的緩衝區數據庫的備份與恢復操作使用。大型池的大小由參數large_pool_size決定。
  
  5)Java池
  這個用於在數據庫中支持Java的運行。例如,使用java編寫一個存儲過程,這是Oracle的Java虛擬機就會使用Java池來處理用戶對話中的Java存儲過程,大小由參數 java_pool_size決定。
發佈了160 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章