a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數據庫 > Oracle > 正文

Oracle 體系結構介紹

2024-08-29 13:51:58
字體:
來源:轉載
供稿:網友
在本章里你可以了解以下內容
  
  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中

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人在线视频网 | 国产福利片在线观看 | 久久精品在线 | 懂色av中文一区二区三区天美 | 精品福利在线视频 | 9999国产精品 | 最新av在线网址 | 国产一区免费在线观看 | 欧美日韩精品一区二区三区在线观看 | 国产精品日韩 | 欧美一区二区三区四区在线观看 | 久久久国产一区二区三区四区小说 | 日本中文字幕在线播放 | 久久久国产视频 | 在线观看黄色网 | 欧美日韩亚洲天堂 | 亚洲成人免费 | 另类天堂 | 免费黄看片| 久久久久久久国产精品影院 | 欧美2区| 成人情趣视频 | 韩日精品 | 国产成人激情视频 | 99国产精品久久久久久久 | 99精品久久久久 | 亚洲日韩欧美一区二区在线 | 午夜免费观看网站 | 日本在线视频观看 | 中文成人在线 | 中文字幕在线资源 | 日韩资源在线 | 亚洲精品大片 | 亚洲视频免费在线 | 台湾佬成人 | 日夜夜精品 | 午夜在线观看视频网站 | 欧美中文字幕在线 | 美女国产网站 | 亚洲国产婷婷 | 日韩h在线观看 |