下面是我整理(抄襲)的一些Oracle數據庫相關概念對象的理解,如有疏漏,歡迎指正。至于整理這篇文章的目的:主要是網上的內容太散了,這樣整理一遍可以加深理解,也便于后續查閱。就我的理解:下述內容應該可對10g,11g,12c都適用。更新的版本沒用過。 Oracle DataBase是一款關系型數據庫管理系統,很多時候,我們會把那個承載我們核心數據的系統籠統地成為數據庫服務器,但從嚴格意義上來講Oracle DataBase是由兩個部分組成: 其中: 數據庫指的是用戶存儲數據的一些物理文件,數據庫 = 物理結構+邏輯結構 實例是數據庫啟動時初始化的一組進程和內存結構,實例 = 后臺進程 + 內存 正因為如此我們一般才會說關閉和啟動實例,加載和卸載數據庫,就是這個道理。從實例和數據庫的概念上來看,我們能知道,實例是暫時的,它不過是一組邏輯劃分的內存結構和進程結構,它會隨著數據庫的關閉而消失,而數據庫它其實就是一堆物理文件,它是永久存在的(除非磁盤損壞)。數據庫和實例通常是一對一的,這種結構我們稱為單實例體系結構;當然還有一些復雜的分布式的結構,一個數據庫可以對多個實例,像Oracle的RAC(請自行google或者baidu),即集群模式。 下圖是對一個oracle數據庫服務,更具體的結構展示: 當在計算機服務器上啟動Oracle數據庫后,稱服務器上啟動了一個Oracle實例(Instance)。Oracle 實例(Instance)是存取和控制數據庫的軟件機制,它包含系統全局區(SGA)和Oracle進程兩部分。SGA是系統為實例分配的一組共享內存緩沖區,用于存放數據庫實例和控制信息,以實現對數據庫中數據的治理和操作。
進程是操作系統中一個極為重要的概念。一個進程執行一組操作,完成一個特定的任務。對Oracle數據庫治理系統來說,進程由用戶進程、服務器進程和后臺進程所組成。
當用戶運行一個應用程序時,系統就為它建立一個用戶進程。服務器進程處理與之相連的用戶進程的請求,它與用戶進程相通訊,為相連的用戶進程的Oracle請求服務。
為了提高系統性能,更好地實現多用戶功能,Oracle還在系統后臺啟動一些后臺進程,用于數據庫數據操作。
下面具體說明Oracle數據庫的相關概念
一、Oracle數據庫實例
這一部分主要參考(抄襲):
1、 用戶與Oracle數據庫的交互流程
下面這張圖,描述了單實例體系結構大致的交互流程
![]() 用戶進程可以是一般的客戶端軟件,像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基礎的內存結構和進程結構我們已大概了解,來看下完成的進程和內存的交互情況,可以根據前面的理解將整個交互流程串聯一下。
![]() 二、Oracle數據庫存儲結構
這一部分主要參考(抄襲):
根據上文描述,Oracle數據庫服務,由實例+數據庫構成。上面講了實例,下面開始介紹數據庫對象(存儲結構——邏輯結構和物理結構)
Oracle數據庫的存儲結構可以分為邏輯存儲結構和物理存儲結構,對于這兩種存儲結構,Oracle是分別進行管理的。
邏輯存儲結構:Oracle內部的組織和管理數據的方式。
物理存儲結構:Oracle外部(操作系統)組織和管理數據的方式——真實存儲數據的地方。
![]() 1.邏輯存儲結構:
Oracle在邏輯上將保存的數據劃分為一個個小單元來進行存儲和維護,更高一級的邏輯存儲結構都是由這些基本的小單元組成的。
邏輯結構類型按照尺寸從小到大分可分為:塊(block)-->區(extent)-->段(segment)-->表空間(tablespace)。
圖示如下:
![]() 我們可以用下面的比喻來描述邏輯結構關系:
塊 :一張張白紙 ---> 區:白紙組成的本子---> 段:多個本子放到一個文件袋中---> 表空間:文件柜(存放多個文件袋)
下面對每一個概念具體介紹:
(1)塊(block):
Oracle用來管理存儲的最小單元,也是最小的邏輯存儲結構。Oracle數據庫在進行輸入輸出時,都是以塊為單位進行讀寫操作的。塊的大小由參數DB_BLOCK_SIZE設置,不同的Oracle版本DB_BLOCK_SIZE的默認值是不同的。我們建議數據塊的尺寸為操作系統塊尺寸的整數倍(1、2、4等)。另外,塊的大小是在創建數據庫的時候決定的,之后不能修改。當然,oracle同時也支持不同的表空間擁有不同的數據塊尺寸。下面,我們對塊的結構進行一些介紹。
1)塊的頭部信息區:
塊頭:包含塊的一般屬性信息,如,塊的物理地址、塊所屬的段的類型
表目錄:如果塊中存儲的數據是表數據, 則在表目錄中保存塊中所包含的表的相關信息
行目錄:行記錄的相關信息 如,ROWID
2)塊的存儲區:主要包含空閑空間和已經使用的空間。Oracle主要是通過下面的兩個參數對這部分空間進行管理的
注意:以上兩個參數(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等存儲參數,以指定其中區的分配方式。如果沒有為段指定這些參數,段將自動繼承表空間的相應參數。不同類型的數據庫對象擁有不同類型的段:
概括來說:每建立一張表,往往對應一個段,如果是分區表,那么各個分區又獨立成段。在表上建一個索引,則又會有一個對應的索引段。
1 --相關表:DBA_SEGMENTS 、 USER_SEGMENTS 2 select * from dba_segments; 3 select * from user_segments; (4)表空間(tablespace):
最高級的邏輯存儲結構,一個Oracle數據庫是由多個表空間組成的, 但一個表空間只隸屬于一個數據庫,一個表空間可以有多數據文件,但是一個數據文件只能屬于一個表空間。一個表空間就是一片磁盤區域,他由一個或者多個磁盤文件組成,一個表空間可以容納許多表、索引或者簇等。每個表空間有一個預制的磁盤區域稱為初始區間(initial extent)用完這個區間后再用下一個,直到用完表空間,這時候需要對表空間進行擴展,增加數據文件或者擴大已經存在的數據文件。在創建數據庫時會自動創建一些默認的表空間,例如 SYSTEM表空間,SYSAUX表空間等。通過使用表空間,Oracle將所有相關的邏輯結構和對象組合在一起。我們可以在表空間級別指定存儲參數,也可以在段級別指定。下面我們列出常見的表空間,和他們所存儲的信息:
1)事務回滾,我們對數據進行DML操作的時候,如果撤銷修改,就會通過undo表空間記錄的修改前數據把數據恢復到修改前。有些存儲過程中通過exception捕捉異常的時候經常會有一句rollback,也是這個作用,對當前事務的數據操作進行回滾恢復。
2)數據庫恢復,數據庫異常關閉,重新啟動的時候依據undo表空間的記錄回退未提交的事務,將數據庫恢復。
3)讀一致性,在一個會話操作數據未提交的時候,通過undo表空間保證其他人訪問的數據的一致性(就是未修改的樣子)。
4)閃回查詢,這是個很有趣的功能。可以查看某個時間點時候的數據,經常,算了,也不經常,主要用于誤操作、誤刪數據等的恢復。
綜上所述,這些東西日常來說基本都不用管。
表空間的模式,也可以稱為狀態,可以設置表空間的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將聯機重做日志文件會備份歸檔到這類文件中去,歸檔日志文件保留了數據更改的完整歷史信息。
三、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
四、ORACLE 的用戶、SCHEMA、數據庫、表空間、數據文件的相互關系
這一部分主要參考(抄襲):
這些Oracle數據庫中具體的概念在前面已經介紹過了,下面再簡述一下:
(1)數據庫:
Oracle數據庫是數據的物理存儲。這就包括(數據文件ORA或者DBF、控制文件、聯機日志、參數文件)。其實Oracle數據庫的概念和其它數據庫不一樣,這里的數據庫是一個操作系統只有一個庫。可以看作是Oracle就只有一個大數據庫。
(2)實例:
一個Oracle實例(Oracle Instance)有一系列的后臺進程(Backguound Processes)和內存結構(Memory Structures)組成。一個數據庫可以有n個實例。
(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相關參數內容以便于參考:
(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):
數據文件是數據庫的物理存儲單位。數據庫的數據在邏輯上是存儲在表空間中的,但真正落地是在某一個或者多個數據文件中。而一個表空間可以由一個或多個數據文件組成,一個數據文件只能屬于一個表空間。一旦數據文件被加入到某個表空間后,就不能刪除這個文件,如果要刪除某個數據文件,只能刪除其所屬于的表空間才行。
下圖也許有助于理解上述名稱之間的關系:
![]() 參考:
|
|