ORACLE各類對象、概念及關係整理(一文讀懂)

 

下面是我整理(抄襲)的一些Oracle數據庫相關概念對象的理解,若有疏漏,歡迎指正。至於整理這篇文章的目的:主要是網上的內容太散了,這樣整理一遍能夠加深理解,也便於後續查閱。就個人理解:下述內容應該可對10g,11g,12c都適用。更新的版本沒用過。

  Oracle DataBase是一款關係型數據庫管理系統,不少時候,咱們會把那個承載咱們核心數據的系統籠統地成爲數據庫服務器,但從嚴格意義上來說Oracle DataBase是由兩個部分組成: php

其中:html

  數據庫指的是用戶存儲數據的一些物理文件,數據庫 = 物理結構+邏輯結構java

  實例是數據庫啓動時初始化的一組進程和內存結構,實例 = 後臺進程 + 內存linux

  正由於如此咱們通常纔會說關閉和啓動實例,加載和卸載數據庫,就是這個道理。從實例和數據庫的概念上來看,咱們能知道,實例是暫時的,它不過是一組邏輯劃分的內存結構和進程結構,它會隨着數據庫的關閉而消失,而數據庫它其實就是一堆物理文件,它是永久存在的(除非磁盤損壞)。數據庫和實例一般是一對一的,這種結構咱們稱爲單實例體系結構;固然還有一些複雜的分佈式的結構,一個數據庫能夠對多個實例,像Oracle的RAC(請自行google或者baidu),即集羣模式。算法

  下圖是對一個oracle數據庫服務,更具體的結構展現:sql

  當在計算機服務器上啓動Oracle數據庫後,稱服務器上啓動了一個Oracle實例(Instance)。Oracle 實例(Instance)是存取和控制數據庫的軟件機制,它包含系統全局區(SGA)和Oracle進程兩部分。SGA是系統爲實例分配的一組共享內存緩衝區,用於存放數據庫實例和控制信息,以實現對數據庫中數據的治理和操做。  
  進程是操做系統中一個極爲重要的概念。一個進程執行一組操做,完成一個特定的任務。對Oracle數據庫治理系統來講,進程由用戶進程、服務器進程和後臺進程所組成。  
  當用戶運行一個應用程序時,系統就爲它創建一個用戶進程。服務器進程處理與之相連的用戶進程的請求,它與用戶進程相通信,爲相連的用戶進程的Oracle請求服務。  
  爲了提升系統性能,更好地實現多用戶功能,Oracle還在系統後臺啓動一些後臺進程,用於數據庫數據操做。
  下面具體說明Oracle數據庫的相關概念
 
1、Oracle數據庫實例
  這一部分主要參考(抄襲):
 
一、 用戶與Oracle數據庫的交互流程
  下面這張圖,描述了單實例體系結構大體的交互流程 
   (1)用戶和用戶進程交互
  用戶進程能夠是通常的客戶端軟件,像Oracle的sqlplus,sql developer,或者是一些驅動程序等,都屬於用戶進程。
  (2)用戶進程和服務器進程交互
  服務器進程有時會稱爲前臺進程,固然是相對於後臺進程(後面會提到的數據庫寫入器,日誌寫入器等)來講的,服務器進程的主要做用就是處理鏈接到當前實例的用戶進程的請求,對客戶端發來的sql進行執行並返回執行結果。在專有服務器結構中,用戶進程和服務器進程是一對一的,也就是說,當監聽程序監聽到客戶端來了一個請求,會爲其分配一個對應的服務器進程。還有一種結構爲共享服務器,這種結構就不是一個用戶進程對應一個服務器進程了,會經過調度程序進行協調處理,關於共享服務器鏈接,本文在此就不敘述了。
  (3)服務器進程和實例進程交互
  (4)實例和數據庫進程交互
 
  上面描述了一些咱們在進行數據庫鏈接操做的時候,大體的交互流程是什麼樣的。下面,咱們就來看看Oracle 的實例內存結構
 
2.實例內存結構
  (因爲數據庫寫入器和日誌寫入器和內存結構很是相關,並且很是重要,因此內存結構和這兩個進程結構會相互配合地進行描述)
  Oracle實例內存結構由兩部分組成:SGA(系統全局區)和PGA(用戶全局區),SGA是一塊共享的內存區域,也是最大的一塊內存區域,它包含該實例的數據和控制信息。SGA在實例啓動時被自動分配,當實例關閉時被收回。數據庫的全部數據操做都要經過SGA來進行;PGA則是用戶會話專有的內存區域,每一個會話在服務器端都有一塊專有的內存區域就是PGA。本文主要對SGA進行分析描述。SGA組成以下:
 
  (1)數據庫緩衝區緩存&數據庫寫入器
  緩衝區緩存(Buffer Cache)是Oracle用來執行sql 的工做區域,在更新數據時,用戶會話不會直接去更新磁盤上的數據,想一想,若是容許這麼作,那麼頻繁的磁盤IO對於系統性能的影響是毀滅性的。因此, 實際的處理流程是這樣的:
   對於一條簡單的查詢語句——select ename,salary from emp where name='不二';,當用戶提交了該條sql語句,該條sql語句會由對應的用戶進程(好比咱們經常使用的sql developer)發送給服務器,監聽程序監聽到該條請求,Oracle會爲其創建一個對應的服務器進程,而後服務器進程會先掃描緩衝區中有沒有包含關鍵行("不二")的數據塊,若是有,這就算一次緩存命中了,而後相關行會傳輸到PGA進行進一步處理,最終通過格式化後展現給用戶;若是沒有命中,那麼服務器進程會首先將對應行復制到緩衝區內,而後再返回給客戶端。
  DML(insert,update,delete)操做同理,加入用戶發送一條update語句,服務進程依然先去掃描緩衝區,若是緩存命中,則直接更新,數據變髒;若是沒有命中,由服務器進程將對應數據塊先從磁盤上覆制到緩衝區內,再進行更新操做。
  1)髒緩衝區
  若是緩衝區存儲的塊和磁盤上的塊不一致,該緩衝區就叫作「髒緩衝區」,髒緩衝區最終會由數據庫寫入器(DBWn)寫入到磁盤中去。
  2)數據庫寫入器(DBWn)
  數據庫寫入器是Oracle的一個後臺進程,所謂後臺進程是相對於前臺進程(服務器進程)來說的。DBWn的"n"意味着一個實例是能夠有多個數據庫寫入器的。
  做用:簡而言之,DBWn的做用就是將變髒了的緩衝區從數據庫緩衝區緩存中寫入到磁盤中的數據文件中去。
  數據庫緩衝區緩存這塊內存區域和數據庫寫入器這塊是比較重要的概念,別的數據庫產品像mySql也都有對應的實現,只不過叫法不同罷了。瞭解這塊的時候,要時刻意識到 會話是不會直接更新磁盤數據的,會話的更新,插入,刪除包括查詢等都是先做用到緩衝區上,隨後,DBWn會將其中的髒緩衝區轉儲到磁盤上去。 
  3)DBWn執行寫入的觸發條件:
   DBWn是個比較懶的進程,它會盡量少的進行寫入,在如下四種狀況它會執行寫入:
  a.一個服務進程在設定的時間內沒有找到空閒塊(沒有任何可用緩衝區,不得不寫啊)
  b.髒緩衝區過多
  c.3秒超時(每3秒自動喚醒一次)
  d.遇到檢查點,即checkPoint(檢查點),檢查點是個Oracle事件,遇到檢查點,DBWn會執行寫入。好比實例有序關閉的時候會有檢查點,DBWn會將全部髒緩衝區寫入到磁盤上去的,這很容易理解,要保持數據文件的一致性。
  4)注意:
  從上述DBWn的幾個寫入時機,咱們能意識到,DBWn的寫入不是直接依賴於會話的更新操做的。不是一有髒緩衝區,它就執行寫入。並且, DBWn執行寫入跟commit操做也沒有任何關係,不要覺得commit操做的影響結果會實時流入到磁盤中去。
  DBWn採用極懶算法進行寫入,緣由咱們應該要清楚:頻繁的磁盤IO對系統的壓力很大,若是DBWn很積極地去寫入磁盤,那對系統性能的影響就太大了,換個角度想,若是DBWn很勤快的寫磁盤,那麼數據庫緩衝區存在的意義也就不大了。
  固然,講到這兒,咱們可能會意識到一個問題,DBWn如此懶地進行數據轉儲,若是在某一時刻,數據庫緩衝區緩存內存在着大量的髒緩衝區(生產環境中,這是常態),也就是有大量的未commit和已commit的數據還在內存中,沒有持久化到磁盤中,而後忽然系統斷電了,這種狀況下,數據是否是就丟掉了?數據固然不會丟失,這就引出了重作日誌(redo log)的概念,接下來,咱們就來談談對應重作日誌的內存結構和後臺進程。
 
  (2) 日誌緩衝區&日誌寫入器
  當咱們執行一些DML操做(insert,update,delete),數據塊發生改變了,產生的變動向量則會寫入到重作日誌文件中去。有了這些記錄,當系統因爲斷電等因素忽然宕掉,數據庫緩衝區緩存內的大量髒數據還沒來得及寫入到數據文件中去,在從新啓動的時候,會有一個實例恢復的過程,在此過程當中就應用了重作日誌記錄來使數據保持一致;或者數據庫遭遇了物理損壞,好比磁盤損壞了,此時能夠經過Oracle的備份恢復工具(如RMAN)進行數據恢復,原理就是:提取備份集-->應用重作日誌文件中的變動記錄。
  1)日誌緩衝區(log buffer)
  日誌緩衝區是一塊比較小的內存區域,它是用來短時間存儲,即將寫入到磁盤的重作日誌文件中的變動向量。
  日誌緩衝區存在的意義依然是爲了減小磁盤IO,減小用戶的等待時間,試想下,若是每一次用戶DML操做都要進行等待重作記錄被寫入到磁盤中去,體驗會有多差勁。
  2)日誌寫入器(LGWR)
  做用:日誌寫入器(LGWR)就是把日誌緩衝區(log buffer)內的內容寫入到聯機的磁盤的重作日誌文件中去,釋放log用戶buffer空間。相比數據庫寫入器(DBWn),日誌寫入器就勤快多了。
  3)LGWR執行寫入的觸發條件:
  a.commit時寫入
  前面提過,DBWn的寫入和commit沒有任何關係,若是commit時數據庫沒有任何記錄,那數據就真的丟失了,Oracle 的重作日誌就是爲了保證數據安全而存在的,用戶commit時(在oracle中稱爲快速提交機制(fast commit):把redo log buffer中的記錄寫入日誌文件,寫入一條提交的記錄),會話會先掛起,等待LGWR將這些記錄寫入到磁盤上的重作日誌文件中,纔會通知用戶提交完成。因此, LGWR在commit時執行寫入,是爲了確保事務永不丟失。
  b.3秒超時(每3秒自動喚醒一次)
  c.日誌緩衝區的佔用率達到1/3,或日誌數量超過1M。
  d.DBWR進程觸發:DBWn將髒緩衝區寫入磁盤前,先檢測他的相關redo記錄是否寫入聯機日誌文件,若是沒有就通知LGWR進程。在Oracle中稱爲提早寫機制(write ahead):redo記錄先於數據記錄被寫入磁盤。這個寫入是爲了數據回滾考慮的。DBWn徹底可能寫入還沒提交的事務(參照上面提到的寫入時機),那如何保證事務回滾呢?(注:DBWR全稱是Database Writer Process,屬於Oracle後臺進程的一種,有的地方也叫DBWn,我想這裏是出於DBWR進程個數的緣由,DBWR進程在一個Oracle Server中能夠最多有20個。本文聚合了不少篇文章,若是遇到DBWR和DBWn,請作同一名詞處理)
  首先要知道,DBWn除了寫入實際的數據,還會寫入撤銷數據(能夠參考:Oracle閃回技術)簡單說,事務回滾須要撤銷數據,在寫入撤銷數據前,會先寫入針對撤銷數據的日誌記錄(有點繞), 若用戶要進行事務回滾,就能夠應用這些日誌記錄來構造撤銷數據,而後進行回滾。
 
   咱們對這兩塊最重要的內存區域和對應的後臺進程作個總結:
  數據庫緩衝區緩存和日誌緩衝區都是爲了提升性能,避免頻繁IO而存在的。日誌緩衝區相比數據庫緩衝區緩存要小的多,而且不能進行自動管理,對於日誌緩衝區的修改須要重啓實例,數據庫緩衝區緩存可進行自動管理。做用在數據庫緩衝區緩存上的DBWn進程,爲了不頻繁的磁盤IO致使系統性能降低,會盡量少地執行寫入,且DBWn的寫入和commit操做沒有任何關係;
  而做用在日誌緩衝區上的LGWR進程,則會很是積極地進行寫入,通常狀況下,它幾乎是實時地將重作日誌記錄轉儲到磁盤中去。LGWR是Oracle體系結構中最大的瓶頸之一。DML的速度不可能超過LGWR將變動向量寫入磁盤的速度。
 
  (3)共享池
   共享池包含共享SQL區和數據字典存儲區。共享SQL區包含執行特定的SQL語句所用的信息。數據字典區用於存放數據字典,它爲全部用戶進程所共享。
它是最複雜的SGA結構,它有許多子結構,咱們來看看常見的幾個共享池組件:
  1)庫緩存:庫緩存這塊內存區域會按已分析的格式緩存最近執行的代碼,這樣,一樣的sql代碼屢次執行的時候,就不用重複地去進行代碼分析,能夠很大程度上提升系統性能。
  2)數據字典緩存:存儲oracle中的對象定義(表,視圖,同義詞,索引等數據庫對象),這樣在分析sql代碼的時候,就不用頻繁去磁盤上讀取數據字典中的數據了
  3)PL/SQL區:緩存存儲過程、函數、觸發器等數據庫對象,這些對象都存儲在數據字典中,經過將其緩存到內存中,能夠在重複調用的時候提升性能。
 
  (4)大池
  大池是個可選的內存區域,前面咱們提到專有服務器鏈接和共享服務器鏈接,若是數據庫採用了共享服務器鏈接模式,則要使用到大池;RMAN(Oracle的高級備份恢復工具)備份數據也須要大池。
 
  (5) JAVA池
  Oracle 的不少選項使用java寫的,Java池用做實例化Java對象所需的堆空間
 
  (6)流池
  從重作日誌中提取變動記錄的進程和應用變動記錄的進程會用到流池(如實例不正常關閉,譬如斷電致使實例關閉,在重啓時,Oracle會自動執行實例恢復過程,在此過程須要提取重作日誌記錄和應用重作日誌兩個動做)
 
  以上列舉了Oracle常見的內存結構,要注意的是,上面列舉的內存區域,除了日誌緩衝區是固定的,不能動態調整也不能進行自動管理外,其餘內存區域均可以進行動態調整,也能夠進行自動管理。
 
3.實例進程結構
  oracle中的進程共分爲三類:用戶進程、服務進程、後臺進程。其中後臺進程伴隨實例的啓動而啓動,他們主要是維護數據庫的穩定,至關於一個企業中的管理者及內部服務人員。他們並不會直接給用戶提供服務。
  下面說說Oracle 的比較常見的後臺進程,不是全部的進程。(DBWn和LGWR較重要,前面已作了瞭解,在此再也不展開)其中DBWn,ARCn能夠設置數據庫啓動時的數量。這些進程在系統中能夠不止一個。
  (1)DBWn 數據庫寫進程:數據庫緩衝區的治理進程。(請參考上面的「數據庫緩衝區緩存&數據庫寫入器」中的描述)
  在它的治理下,數據庫緩衝區中總保持有必定數量的自由緩衝塊,以確保用戶進程總能找到供其使用的自由緩衝塊。 
 
  (2)LGWR 日誌文件寫進程:(請參考上面的「日誌緩衝區&日誌寫入器」中的描述)
  是日誌緩衝區的治理進程,負責把日誌緩衝區中的日誌項寫入磁盤中的日誌文件上。每一個實例只有一個LGWR進程。
 
  (3)SMON(System Monitor):安裝和打開數據庫,負責完成自動實例恢復和回收分類(sort)表空間。
  做用:
  a.負責實例恢復,前滾(Roll Forward)恢復到實例關閉的狀態,使用最後一次檢查點後的日誌進程重作。這時包括提交和未提交的事務。打開數據庫,進行回滾(Roll Back):回滾未提交的事務。(oracle承諾commit以後數據不會丟失,如今咱們能夠大體的瞭解是如何實現這個承諾,以及在數據的安全性和數據庫性能之間的平衡選擇。)
  b.負責清理臨時段,以釋放空間
  觸發條件:按期被喚醒或者被其餘事務主動喚醒。
 
  (4)PMON(Process Monitor):進程監視器,主要監視服務器進程。前面提到過,專有服務器體系模式下,用戶進程和服務器進程是一對一的關係,若是某個會話發生異常,PMON會銷燬對應的服務器進程,回滾未提交的事務,並回收會話專有的PGA內存區域。
  做用:
  a.發現用戶進程異常終止,並進行清理。釋放佔用資源。(清理異常終止用戶使用的鎖)
       b.向監聽程序動態的註冊實例。
   觸發條件:定時被喚醒,其餘進程也會主動喚醒它。
 
  (5)CKPT(Checkpoint Process):CKPT負責發起檢查點信號,手動設置檢查點的語法:
    1 alter system checkpoint; 
  檢查點可強制DBWn寫入髒緩衝區,當數據庫崩潰後,因爲大量髒緩衝區未寫入數據文件,在從新啓動時,須要由SMON進行實例恢復,實例恢復須要提取和應用重作日誌記錄,提取的位置就是從上次檢查點發起的位置開始的(檢查點以前的數據已經被強制寫入到數據文件中去了),這個位置稱爲RBA(redo byte address),CKPT會不斷將這個位置更新到控制文件中去(以肯定實例恢復須要從哪兒開始提取日誌記錄)。
  觸發條件:日誌切換(log switch)會觸發檢查點。
 
  (6)MMON(Manageability Monitor)--AWR主要的進程
  數據庫的自我監視和自我調整的支持進程。實例在運行中,會收集大量有關實例活動和性能的統計數據,這些數據會收集到SGA中,MMON按期從SGA中捕獲這些統計數據,並將其寫入到數據字典中,便於後續對這些快照進行分析。(默認狀況,MMON每隔一個小時收集一次快照)
  做用:
  a.收集AWR必須的統計數據,把統計數據寫入磁盤。10g中保存在SYSAUX表空間中。
  b.生成server--generated報警
  觸發條件:每小時把shared pool中的統計信息寫入磁盤,或者shared pool佔用超過15%。
 
  (7)ARCn(archiver process)
  歸檔進程,這個進程是可選的,若是數據庫配置爲歸檔模式,這個進程就是必須的。所謂歸檔,就是將重作日誌文件永久保存( 生產庫通常都會配置爲歸檔模式)到歸檔日誌文件中。歸檔日誌文件和重作日誌文件做用是同樣的,只不太重作日誌文件會不斷被重寫,而歸檔日誌文件則保留了關於數據更改的完整的歷史記錄。
  做用:發生日誌切換時把寫滿的聯機日誌文件拷貝到歸檔目錄中。
  觸發條件:日誌切換時被LGWR喚醒。
  設置:LOG_ARCHIVE_MAX_PROCESSES能夠設置oracle啓動的時候ARCn的個數。
 
  (8)manageability monitor light(MMNL):輕量級的MMON
  (9)memory manager(MMAN):自動內容管理
   做用:每分鐘都檢查AWR性能信息,並根據這些信息來決定SGA組件最佳分佈。
   設置:STATISTICS_LEVEL:統計級別
             SGA_TARGET:SGA總大小
  (10)job queue coordinator(CJQ0):數據庫定時任務
  (11)recover writer(RVWR):做用是爲flashback database提供日誌記錄。把數據塊的前鏡像寫入日誌。
  (12)change tarcking writer(CTWR): 做用是跟蹤數據塊的變化,把數據塊地址記錄到 change_tracking file文件中。RMAN的增量備份將使用這個文件來肯定那些數據塊發生了變化,並進行備份。
  (13)LCKn 封鎖進程:用於並行服務器系統,主要完成實例之間的封鎖
 
4.總結:
  至此,Oracle基礎的內存結構和進程結構咱們已大概瞭解,來看下完成的進程和內存的交互狀況,能夠根據前面的理解將整個交互流程串聯一下。
 
 
2、Oracle數據庫存儲結構
  這一部分主要參考(抄襲):
 
  根據上文描述,Oracle數據庫服務,由實例+數據庫構成。上面講了實例,下面開始介紹數據庫對象(存儲結構——邏輯結構和物理結構)
  Oracle數據庫的存儲結構能夠分爲邏輯存儲結構和物理存儲結構,對於這兩種存儲結構,Oracle是分別進行管理的。
  邏輯存儲結構:Oracle內部的 組織和管理數據的方式。
  物理存儲結構:Oracle外部(操做系統)組織和管理數據的方式——真實 存儲數據的地方。
 
1.邏輯存儲結構:
  Oracle在邏輯上將保存的數據劃分爲一個個小單元來進行存儲和維護,更高一級的邏輯存儲結構都是由這些基本的小單元組成的。
  邏輯結構類型按照尺寸 從小到大分可分爲: 塊(block)-->區(extent)-->段(segment)-->表空間(tablespace)
  圖示以下:
  咱們能夠用下面的比喻來描述邏輯結構關係:
   塊 :一張張白紙 ---> 區:白紙組成的本子---> 段:多個本子放到一個文件袋中---> 表空間:文件櫃(存放多個文件袋)
  下面對每個概念具體介紹:
  (1)塊(block):
   Oracle用來管理存儲的最小單元,也是最小的邏輯存儲結構。Oracle數據庫在進行輸入輸出時,都是以塊爲單位進行讀寫操做的。塊的大小由參數 DB_BLOCK_SIZE設置,不一樣的Oracle版本DB_BLOCK_SIZE的默認值是不一樣的。咱們建議 數據塊的尺寸爲操做系統塊尺寸的整數倍(一、二、4等)。另外, 塊的大小是在建立數據庫的時候決定的,以後不能修改。固然,oracle同時也 支持不一樣的表空間擁有不一樣的數據塊尺寸。下面,咱們對塊的結構進行一些介紹。
  1)塊的頭部信息區:
  塊頭:包含塊的通常屬性信息,如,塊的物理地址、塊所屬的段的類型
  表目錄:若是塊中存儲的數據是表數據, 則在表目錄中保存塊中所包含的表的相關信息
  行目錄:行記錄的相關信息 如,ROWID
  2)塊的存儲區:主要包含空閒空間和已經使用的空間。Oracle主要是經過下面的兩個參數對這部分空間進行管理的
  • PCTFREE參數:指定塊中必須保留的最小空閒空間比例。當塊中的空閒存儲空間減小到PCTFREE所設置的比例後,Oracle將塊標記爲不可用狀態,新的數據行將不能被加入到這個塊。
  • PCTUSED參數:制定一個百分比,當塊中已經使用的存儲空間下降到這個百分比之下時,這個塊才被從新標記爲可用狀態。
  注意:以上兩個參數(PCTFREE、PCTUSED)既 能夠在表空間級別進行設置, 也能夠在段級別進行設置。段級別的設置優先級更高。
 
  (2)區(extent):
  比塊高一級的邏輯存儲結構, 由連續的塊組成,它是 oracle在進行存儲空間的分配和回收的最小單位(區是磁盤分配的最小單位)。在建立具備獨立段結構的數據庫對象時,例如表、索引等,Oracle會爲數據庫對象建立一個數據段,併爲數據段分配一個‘初始區’。後續區的分配方式,則根據表的空間管理辦法不一樣,而採用不一樣的分配方式,例如autoextent,uniform size 或者在建立表或表空間時設置default storage 子句。另外,用戶還可以經過執行下面的命令來回收表、索引等對象中未使用的區:
1 -- 相關表:DBA_EXTENTS 、USER_EXTENTS
2 select * from dba_extents;
3 select * from user_extents;
4 
5 --回收表、索引等對象中未使用的區
6 alter table table_name deallocate unused;
  (3)段(segment):
  由多個區組成,這些區能夠是連續的,也能夠是不連續的。當用戶在數據庫中建立各類具備實際存儲結構的對象時(保存有數據的對象),好比表、索引等,Oracle將爲這些對象建立「段」。 通常一個對象只擁有一個段。在建立段時,能夠爲它指定PCTFREE、PCTUSED等參數來控制其中的塊的存儲空間管理方式,也能夠爲它指定INITIAL、NEXT、PCTINCREASE等存儲參數,以指定其中區的分配方式。若是 沒有爲段指定這些參數,段將自動繼承表空間的相應參數。不一樣類型的數據庫對象擁有不一樣類型的段:
  • 數據段:保存用戶的數據(表中的記錄)。每一個表都有一個對應的數據段,其名稱和數據表的名字相同
  • 索引段:用來存儲系統、用戶的索引信息(索引中的索引條目)
  • 臨時段:在執行查詢等操做時,Oracle可能會須要使用到一些臨時存儲空間,用於臨時保存解析過的查詢語句以及在排序過程當中產生的臨時數據,如:order by語句的排序以及一些彙總等。
  • 回滾段:用來存儲用戶數據修改前的值,回滾段與事務是一對多的關係,一個事務只能使用一個回滾段,而一個回滾段可存放一個或多個事務的回退數據。
   歸納來講:每創建一張表,每每對應一個段,若是是分區表,那麼各個分區又獨立成段。在表上建一個索引,則又會有一個對應的索引段。
1 --相關表:DBA_SEGMENTS 、 USER_SEGMENTS
2 select * from dba_segments;
3 select * from user_segments;
  (4)表空間(tablespace):
  最高級的邏輯存儲結構, 一個Oracle數據庫是由多個表空間組成的, 但一個表空間只隸屬於一個數據庫,一個表空間能夠有多數據文件,可是一個數據文件只能屬於一個表空間。一個表空間就是一片磁盤區域,他由一個或者多個磁盤文件組成,一個表空間能夠容納許多表、索引或者簇等。每一個表空間有一個預製的磁盤區域稱爲初始區間(initial extent)用完這個區間後再用下一個,直到用完表空間,這時候須要對錶空間進行擴展,增長數據文件或者擴大已經存在的數據文件。在建立數據庫時會自動建立一些默認的表空間,例如 SYSTEM表空間,SYSAUX表空間等。經過使用表空間,Oracle將全部相關的邏輯結構和對象組合在一塊兒。咱們 能夠在表空間級別指定存儲參數,也能夠在段級別指定。下面咱們列出常見的表空間,和他們所存儲的信息:
  • 數據表空間:或稱爲用戶表空間,用於存儲用戶數據的普通表空間。
  • 系統表空間:默認的表空間,用於保存數據字典(一組保存數據庫自身信息的內部系統表和視圖,及用於Oracle內部使用的其餘一些對象),保存全部的PL/SQL程序的源代碼和解析代碼,包括存儲過程和函數、包、數據庫觸發器等,保存數據庫對象(表、視圖、序列)的定義。
  • 回滾表空間:用於存放回滾段,每一個實例最多隻能使用一個撤銷表空間。undo表空間的4個常見做用:
1)事務回滾,咱們對數據進行DML操做的時候,若是撤銷修改,就會經過undo表空間記錄的修改前數據把數據恢復到修改前。有些存儲過程當中經過exception捕捉異常的時候常常會有一句rollback,也是這個做用,對當前事務的數據操做進行回滾恢復。
2)數據庫恢復,數據庫異常關閉,從新啓動的時候依據undo表空間的記錄回退未提交的事務,將數據庫恢復。
3) 讀一致性,在一個會話操做數據未提交的時候,經過undo表空間保證其餘人訪問的數據的一致性(就是未修改的樣子)。
4)閃回查詢,這是個頗有趣的功能。能夠查看某個時間點時候的數據,常常,算了,也不常常,主要用於誤操做、誤刪數據等的恢復。
綜上所述,這些東西平常來講基本都不用管。
  • 臨時表空間:存儲SQL執行過程當中產生的臨時數據。建立Oracle數據庫的時候能夠設置一個叫sort_area_size的參數,默認值爲65536,排序的時候會首先使用這部份內存,若是不足就會使用臨時表空間。
  表空間的模式,也能夠稱爲狀態,能夠設置表空間的online(聯機)或者offline(脫機),Read/write(讀/寫) 或者 Read-only(只讀) 
  表空間能夠自動或手動脫機。例如,您能夠將表空間脫機,以進行維護或備份與恢復。數據庫在遇到某些錯誤時會自動將一個表空間脫機,好比數據庫寫進程 (DBWn)屢次試圖寫入數據文件但均遭遇失敗時。當用戶試圖訪問一個脫機表空間中的表時,將收到一個錯誤。
 
※安裝Oracle時,表空間的一些默認配置:
  1)Oracle Database 11g r2在用dbca數據庫管理助手建立數據庫的時候,默認會建立三個永久表空間(SYSTEM、SYSAUX、USERS),一個臨時表空間(TEMP),一個撤銷表空間(UNDOTBS1)。
  2)Oracle數據庫有幾個缺省表空間,其中SYSTEM和SYSAUX 表空間是一個Oracle數據庫必須有的。系統 必須表空間SYSTEM,SYSAUX,TEMP,UNDOTBS1
 
   ※各種表空間的操做方法,以及實踐:
  1)查詢表空間
  1 select * from dba_tablespaces; 
 
  2)建立數據表空間
1 CREATE TABLESPACE "ts_test"                      --表空間名WEIXIN
2     LOGGING                                     --啓動重作日誌
3     DATAFILE 'D:\app\oradata\orcl\ts_test.dbf' --指定對應的數據文件,能夠一個或者多個
4     SIZE 512M                                   --數據文件大小
5     AUTOEXTEND ON                               --數據文件自動擴展
6     NEXT 1024K                                  --一次擴展的大小
7     MAXSIZE UNLIMITED                           --數據文件最大容量:無限
8     EXTENT MANAGEMENT LOCAL                     --表空間本地管理
9     SEGMENT SPACE MANAGEMENT AUTO ;             --存儲管理方式,AUTO爲自動方式
 
  3)建立臨時表空間
1 CREATE TEMPORARY TABLESPACE tmp_ts_test
2   TEMPFILE  'D:\app\oradata\orcl\tmp_ts_test.DBF'
3   SIZE 100M;
  
  4)回滾段表空間
1 create undo tablespace undo_ts_test
2     datafile  'D:\app\oradata\orclundo_ts_test.DBF'
3     size  100M;
  5)新建用戶,並將先前建的表空間 ts_test 和臨時表空間 tmp_ts_test 做爲testuser用戶的默認使用空間。
 1 --建立新用戶,同時指定表空間和臨時表空間
 2 CREATE USER testuser         --建立用戶testuser
 3     PROFILE "DEFAULT"            --忽略對profile中的一些資源限制(什麼鬼,不明白)
 4     IDENTIFIED BY "pwd123456"       --密碼爲weixin
 5     default tablespace ts_test  --默認表空間ts_test,即數據默認存此表空間
 6     temporary tablespace tmp_ts_test  --臨時表空間
 7     QUOTA 500m ON ts_test    --用戶在表空間中的限額
 8     ACCOUNT UNLOCK;              --解鎖用戶
 9 
10 --一般建完用戶後會給用戶授予一些基本的權限
11 Grant connect, resource to testuser;
12 
13 --或者直接給用戶賦予dba權限(只是測試,生產請不要這麼作)
14 --with admin option 表示在得到權限的同時也得到了將這個權限授予其餘用戶的能力。
15 GRANT "DBA" TO "testuser" WITH ADMIN OPTION;   
  oracle的安全策略方面默認一個用戶的密碼有效期爲180天,咱們能夠直接把這個有效期調成永久。
  1 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 
 
  6)若是表空間不足,能夠有兩種方法:
  第一種,增長數據文件:
1 ALTER TABLESPACE ts_test(表空間名)  
2     ADD DATAFILE  '......'(數據文件全路徑名)
3     SIZE 1000M;
  第二種,把表空間設置爲自動擴展:
1 ALTER DATABASE DATAFILE   '.......'(數據文件全路徑名)  
2     autoextend on;  (在建立表空間時,就能夠加上這個關鍵字,表示該表空間自動擴展)
 
  7)刪除表空間
1 drop tablespace ts_test
2   including contents and datafile;
  若是表空間有數據,不增長 including contents 將沒法刪除成功,增長 and datafiles 關鍵字在linux 及 unix 下可自動刪除數據文件,而在windows 環境下須要手動刪除
 
  8)UNDO 表空間和 TEMP 表空間在數據庫建好是必然已經建立好了,不過,它們均可以新建,而且用戶均可以指定新建的空間。
  9)oracle 能夠爲不一樣的用戶指定不一樣的臨時表空間,並且能夠爲同一用戶的不一樣session 設置不一樣的臨時表空間(臨時表空間組),從而減緩IO 競爭。
 
2. oracle物理存儲結構:
  Oracle數據庫邏輯上由一個或多個表空間組成,每一個表空間在物理上由一個或多個數據文件組成,而每一個數據文件由數據塊構成的。因此, 邏輯上數據存放在表空間中,而物理上存儲在表空間所對應的數據文件中。咱們能夠用這張圖來描述數據文件和表空間的關係。
  或者用下面這張圖理解下:
  (1)構成Oracle數據庫物的物理文件組織結構:
   ※基礎文件:
  1)控制文件:
  控制文件雖小,但做用重大,它存放數據庫的基本信息。它包含指向數據庫其他部分的指針(包括重作日誌文件,數據文件,歸檔日誌文件等的位置),存儲重要的序列號和時間戳,存儲RMAN備份的詳細信息。控制文件一旦受損,那實例會立馬終止,一 般對控制文件的保護採用多路複用機制,就是冗餘多份在不一樣物理位置
  2)重作日誌文件
  重作日誌文件的做用爲:存放對數據的改變,重作日誌按時間順序存儲應用於數據庫的一連串的變動向量(包含聯機重作日誌文件和歸檔日誌文件)。由SMON在數據庫啓動時自動執行的實例恢復和磁盤損壞所要求的提取備份恢復都會應用到重作日誌進行相應的數據恢復
  重作日誌文件 也建議進行多路複用,一個數據庫至少要有兩組重作日誌文件。一組供LGWR進行寫入,日誌文件是固定大小,業務高峯期會很快寫滿,寫滿以後會切換到第二組上,在配置爲歸檔模式的數據庫中,這時由歸檔進程(ARCn)開始將第一組的內容進行歸檔備份,如此循環地進行寫入和歸檔。須要注意的是,在歸檔進程還未對當前組的日誌歸檔完畢前,是不容許LGWR對其進行重寫的。
  3)數據文件
  數據文件存儲着實際的數據,它是具體的存儲數據的物理文件,是一個物理概念。DBWn會將數據庫緩衝區中的內容寫入到這類文件中去,數據文件的大小和數量是不受限制的。Oracle從10g開始, 建立一個數據庫至少須要兩個數據文件,一個用於SYSTEM表空間,該表空間用來存儲數據字典;一個用於SYSAUX表空間,這個表空間用來存儲一些數據字典的輔助數據。
  數據文件由一個個的Oracle塊組成,這是Oracle的I/O基礎單元,與操做系統塊是不一樣的概念,Oracle塊要比操做系統塊大,這固然有出於性能的一些考慮,但咱們考慮這樣一種狀況,當用戶使用操做系統命令進行數據文件的備份的時候(假設1個Oracle塊=8個操做系統塊),已經複製了4個操做系統塊,而後CPU被DBWn搶佔了,DBWn又從新對這個Oracle塊進行了更新,這時,當複製命令又獲得了CPU時間去複製剩餘的4個塊的時候,就形成了整個Oracle塊的數據不一致,因此,這也是在執行這種備份(用戶自行備份)的時候,須要作一些額外處理,好比將表空間置爲備份模式的緣由。固然,使用RMAN是不存在這樣的問題的,RMAN的備份機制是確定能夠獲得數據一致的塊的。(這塊內容做了解便可)
對於數據文件的保護,通常可進行按期備份,或者使用RAID也能夠。
 
   ※外部文件:
  所謂外部文件,意味着這些文件從嚴格意義上來說並不屬於Oracle數據庫的一部分。
  1)實例參數文件
  這個文件存儲了數據庫所需的一些參數設置,好比各個內存區域的大小,可容許的最大進程數,最大會話數,控制文件的位置,數據庫的名稱等等,參數文件也是 實例啓動時首先要加載的文件
  2)口令文件
  通常稱爲外部口令文件。 通常的用戶名和口令是存放在數據字典中,不會存放在這個文件中在一些特殊場景下,好比實例還未啓動,這時,我可能須要以管理員的身份登入系統去執行一些恢復或者啓動操做,然而此時,數據字典因爲實例還沒啓動是不存在的,這時就須要外部口令文件進行用戶身份的驗證。
  3)歸檔日誌文件
  ARCn將聯機重作日誌文件會備份歸檔到這類文件中去,歸檔日誌文件保留了數據更改的完整歷史信息。
 
3、Oracle數據庫的啓動流程
  這一部分主要參考(抄襲):
 
  Oracle  的啓動須要經歷四個狀態,SHUTDOWN 、NOMOUNT 、MOUNT 、OPEN、
   1.數據庫流程詳解
  (1)startup nomount
  啓動實例(不加載數據庫),這個過程,會讀取配置文件(spfile / pfile)文件的相關參數來建立實例,也就是一系列的進程,啓動完成後實例是 STARTED 狀態。
  (2)alter database mount;
  加載(關聯)數據庫,這個過程的時候,實例讀取控制文件,關聯到對應的數據庫,此時實例爲MOUNTED狀態。
  (3)alter database open;
  打開數據庫,實例鏈接到數據文件,這個時候其餘用戶就能夠訪問到數據庫進行讀寫操做了,此時實例的狀態是OPEN。
  因此,咱們打開的過程當中實例的狀態就是: Deaded(idle)>>Started >> Mounted >> Open
 
   2.數據庫啓動流程實踐
  通常一臺機子上都會創建多個數據庫的,那麼怎麼啓動本身想啓動的那個實例呢?答案是:經過oracle_sid控制,oracle_sid是數據庫在操做系統的一個惟一標識,在演示數據庫啓動流程前,咱們先設定oracle_sid,而後再啓動實例。
  (1)準備工做以下:
  1)設定要啓動的數據庫,能夠不設,使用安裝時默認啓動的那個數據庫便可
1 C:\Users\anand>set oracle_sid=orcl
  2)和數據庫創建鏈接(其實通常這樣就可使用了)
1 C:\Users\anand>sqlplus / as sysdba
2 SQL*Plus: Release 11.2.0.1.0 Production on 星期六 6月 2 10:58:17 2018
3 Copyright (c) 1982, 2010, Oracle.  All rights reserved.
4 鏈接到:
5 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
6 With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
  (2)測試數據庫啓動流程
  1)啓動實例(不加載數據庫)
1 SQL> startup nomount
2 ORACLE 例程已經啓動。
3 
4 Total System Global Area 1068937216 bytes
5 Fixed Size                  2182592 bytes
6 Variable Size             624951872 bytes
7 Database Buffers          436207616 bytes
8 Redo Buffers                5595136 bytes
  2)加載(關聯)數據庫
1 SQL> alter database mount;
2 
3 數據庫已更改。
  3)打開數據庫
1 SQL> alter database open;
2 
3 數據庫已更改。
  4)驗證
1 SQL> select status from v$instance;
2 
3 STATUS
4 ------------
5 OPEN

 

4、ORACLE 的用戶、SCHEMA、數據庫、表空間、數據文件的相互關係
  這一部分主要參考(抄襲):
 
  在進入抽象的概念以前,能夠先看下網上的這段比喻:
  「咱們能夠把Database(這裏應該指的是某一個sid對應的數據庫)看做是一個大倉庫,倉庫分了不少不少的房間,Schema就是其中的房間,一個Schema表明一個房間,Table能夠看做是每一個Schema中的牀,Table(牀)被放入每一個房間中,不能放置在房間以外,那豈不是晚上睡覺無家可歸了,而後牀上能夠放置不少物品,就比如 Table上能夠放置不少列和行同樣,數據庫中存儲數據的基本單元是Table,現實中每一個倉庫放置物品的基本單位就是牀, User就是每一個Schema的主人,(因此Schema包含的是Object,而不是User),user和schema是一一對應的,每一個user在沒有特別指定下只能使用本身schema(房間)的東西,若是一個user想使用其餘schema(房間)的東西,那就要看那個schema(房間)的user(主人)有沒有給你這個權限了,或者看這個倉庫的老大(DBA)有沒有給你這個權限了。換句話說,若是你是某個倉庫的主人,那麼這個倉庫的使用權和倉庫中的全部東西都是你的(包括房間),你有徹底的操做權,能夠扔掉不用的東西從每一個房間,也能夠放置一些有用的東西到某一個房間,你還能夠給每一個User分配具體的權限,也就是他到某一個房間能作些什麼,是隻能看(Read-Only),仍是能夠像主人同樣有全部的控制權(R/W),這個就要看這個User所對應的角色Role了。」
 
  這些Oracle數據庫中具體的概念在前面已經介紹過了,下面再簡述一下:
  (1)數據庫:
  Oracle數據庫是數據的物理存儲。這就包括(數據文件ORA或者DBF、控制文件、聯機日誌、參數文件)。其實Oracle數據庫的概念和其它數據庫不同,這裏的數據庫是一個操做系統只有一個庫。能夠看做是Oracle就只有一個大數據庫。
  (2)實例:  
  一個Oracle實例(Oracle Instance)有一系列的後臺進程(Backguound Processes)和內存結構(Memory Structures)組成。 一個數據庫能夠有n個實例
  
 
  數據庫和實例的關係:
  ORACLE實例與ORACLE數據庫,這個是比較混淆的一個概念,在不少觀念下,包括我之前也會認爲一個實例等價於一個數據庫,其實這個應該說是在 大部分狀況下能夠認爲:一個實例對應一個數據庫, 實例是一個Instance,而數據是對外屏蔽的一些轉換後文件組合(學習過第四代數據庫就知道,若是你作過裸機文件也會明白原理),數據庫不是對外直接開放的,開放的規則是經過實例(Instance),Instance是一段內存,這個內存中包含不少個不一樣的版塊(主體上的分就是SGA和PGA了), 咱們一切操做都是交給實例的,而不是直接操做數據庫文件系統,爲何要有中間這個過程,ORACLE考慮到:安全、緩衝、效率、擴展性等問題;而爲何是大部分狀況下這樣說, 由於ORACLE還有集羣的概念,對於ORACLE RAC真正集羣使用後你會更加深入認識實例和數據庫之間的關係,它使用多個分佈於不一樣主機上的實例,對同一個裸機文件系統上的數據庫進行操做,因此此時實例和數據庫就不是一對一了,而是多對一,可是一個實例只能用一個數據庫這是確定的。
 
  (3)用戶(user)
   用戶是在實例下創建的。不一樣實例能夠建相同名字的用戶。
       具體的建立用戶的方法是這樣的(再寫一遍):
1 --建立新用戶,同時指定表空間和臨時表空間(建議建立的時候指明表空間名)
2 CREATE USER testuser         --建立用戶testuser
3     PROFILE "DEFAULT"            --忽略對profile中的一些資源限制(什麼鬼,不明白)
4     IDENTIFIED BY "pwd123456"       --密碼爲weixin
5     default tablespace ts_test  --默認表空間ts_test,即數據默認存此表空間
6     temporary tablespace tmp_ts_test  --臨時表空間
7     QUOTA 500m ON ts_test    --用戶在表空間中的限額
8     ACCOUNT UNLOCK;              --解鎖用戶
 
   ※關於profile的說明(使用profile文件實現用戶口令限制與資源限制)
  Proflie是口令限制,資源限制的命名集合.創建oracle數據庫時,oracle會自動創建名爲DEFAULT的PROFILE,初始化的DEFAULT沒有進行任何口令和資源限制.使用PROFILE有如下一些主要事項:
  a,創建PROFILE時,若是隻設置了部分口令或資源限制選項,其餘選項會自動使用默認值(DEFAULT的相應選項)
  b,創建用戶時,若是不指定PROFILE選項,oracle會自動將DEFAULT分配給相應的數據庫用戶.
  c,一個用戶只能分配一個PROFILE.若是要同時管理用戶的口令和資源,那麼在創建PROFILE時應該同時指定口令和資源選項.
  d,使用PROFILE管理口令時,口令管理選項老是處於被激活狀態,但若是使用PROFILE管理資源,必需要激活資源限制.
  
   ※關於profile使用的實踐
  1)查看當前存在的profile文件
1 select distinct profile from dba_profiles;
2 --查看指定profile文件中各資源的限制狀況:
3 select resource_name,limit from dba_profiles where profile='DEFAULT';
  2)修改如今profile文件中資源選項:
1 alter profile default limit FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 3;
  3)建立一個新的profile文件:
1 CREATE PROFILE lock_accout LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 10;
  4)讓用戶使用新的profile文件:
1 alter user testuser profile lock_accout;
  5)查看用戶當前使用的profile文件
select username,profile from dba_users;
  6)使用profile文件限制用戶對資源的使用;
1 --必須先激活資源限制:
2 alter system set resource_limit=TRUE scope=memory;
3 --對資源限制作修改:
4 alter profile lock_accout limit cpu_per_session 5000;
  7)刪除profile
1 drop profile lock_accout;
  8)刪除profile並將使用當前profile的用戶profile改成default
1 drop profile lock_accout cascade;
  9)如下列出全部profile相關參數內容以便於參考:
FAILED_LOGIN_ATTEMPTS:用於指定聯繫登錄的最大失敗次數.
 
PASSWORD_LOCK_TIME:用於指定賬戶被鎖定的天數.
PASSWORD_LIFE_TIME:用於指定口令有效期
PASSWORD_GRACE_TIME:用於指定口令寬限期.
PASSWORD_REUSE_TIME:用於指定口令可重用時間.
PASSWORD_REUSE_MAX;用於指定在重用口令以前口令須要改變的次數.
PASSWORD_VERIFY_FUNCTION;是否校驗口令(校驗將值改成VERIFY_FUNCTION)
CPU_PER_SESSION:用於指定每一個會話能夠佔用的最大CPU時間.
LOGICAL_READS_PER_SESSON:用於指定會話的最大邏輯讀取次數.
PRIVATE_SGA:用於指定會話在共享池中能夠分配的最大總計私有空間.須要注意,該選項只使用與共享服務器模式.
COMPOSITE_LIMIT:用於指定會話的總計資源消耗(單位:服務單元).
CPU_PER_CALL:限制每次調用(解析,執行或提取數據)可佔用的最大CPU時間(單位:百分之一秒)
LOGICAL_READS_PER_CALL:用於限制每次調用的最大邏輯I/O次數.
SESSIONS_PER_USER:用於指定每一個用戶的最大併發會話個數.
CONNECT_TIME:用於指定會話的最大鏈接時間.
IDLE_TIME:用於指定會話的最大空閒時間.
  (4)schema:
      在Oracle中,通常一個用戶就對應一個schema,該用戶的schema名等於用戶名,並做爲該用戶缺省schema,用戶是不能建立schema的,schema在建立用戶的時候建立,並能夠指定用戶的各類表空間(這點與PostgreSQL是不一樣,PostgreSQL是能夠建立schema並指派給某個用戶)。當前鏈接到數據庫上的用戶建立的全部數據庫對象默認都屬於這個schema(在不指明schema的狀況下),好比若用戶scott鏈接到數據庫,而後create table test(id int not null)建立表,那麼這個表被建立在了scott這個schema中;但若這樣create table testuser.test(id int not null)的話,這個表被建立在了testuser這個schema中,固然前提是權限容許(即testuser用戶給scott用戶在其schema下建立數據表的權限)。由此來看,schema是一個邏輯概念。
      但必定要注意一點: schema並非在建立user時就建立的,而是在該用戶建立了第一個對象以後纔將schema真正建立的,只有user下存在對象,他對應的schema纔會存在,若是user下不存在任何對象了,schema也就不存在了;
 
  (5)表空間:
  表空間是一個用來管理數據存儲 邏輯概念,表空間只是和數據文件(ORA或者DBF文件)發生關係,數據文件是物理的, 一個表空間能夠包含多個數據文件,而一個數據文件只能隸屬一個表空間。
 
  (6)數據文件(dbf、ora):
  數據文件是數據庫的 物理存儲單位。數據庫的數據在邏輯上是存儲在表空間中的,但真正落地是在某一個或者多個數據文件中。而一個表空間能夠由一個或多個數據文件組成,一個數據文件只能屬於一個表空間。一旦數據文件被加入到某個表空間後,就不能刪除這個文件,若是要刪除某個數據文件,只能刪除其所屬於的表空間才行。
   表的數據,是由用戶放入某一個表空間的,而這個表空間會隨機把這些表數據放到一個或者多個數據文件中。
  因爲oracle的數據庫不是普通的概念,oracle是有用戶和表空間對數據進行管理和存放的。可是表不是有表空間去查詢的,而是由用戶去查的。由於不一樣用戶能夠在同一個表空間創建同一個名字的表!這裏區分就是用戶了!
  下圖也許有助於理解上述名稱之間的關係:
 
參考:
相關文章
相關標籤/搜索