
下面是我整理(抄襲)的一些Oracle資料庫相關概念物件的理解,如有疏漏,歡迎指正,至于整理這篇文章的目的:主要是網上的內容太散了,這樣整理一遍可以加深理解,也便于后續查閱,就我的理解:下述內容應該可對10g,11g,12c都適用,更新的版本沒用過,
Oracle DataBase是一款關系型資料庫管理系統,很多時候,我們會把那個承載我們核心資料的系統籠統地成為資料庫服務器,但從嚴格意義上來講Oracle DataBase是由兩個部分組成:

其中:
資料庫指的是用戶存盤資料的一些物理檔案,資料庫 = 物理結構+邏輯結構
實體是資料庫啟動時初始化的一組行程和記憶體結構,實體 = 后臺行程 + 記憶體
正因為如此我們一般才會說關閉和啟動實體,加載和卸載資料庫,就是這個道理,從實體和資料庫的概念上來看,我們能知道,實體是暫時的,它不過是一組邏輯劃分的記憶體結構和行程結構,它會隨著資料庫的關閉而消失,而資料庫它其實就是一堆物理檔案,它是永久存在的(除非磁盤損壞),資料庫和實體通常是一對一的,這種結構我們稱為單實體體系結構;當然還有一些復雜的分布式的結構,一個資料庫可以對多個實體,像Oracle的RAC(請自行google或者baidu),即集群模式,
下圖是對一個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基礎的記憶體結構和行程結構我們已大概了解,來看下完成的行程和記憶體的互動情況,可以根據前面的理解將整個互動流程串聯一下,
二、Oracle資料庫存盤結構
這一部分主要參考(抄襲):
https://blogs.oracle.com/database4cn/oracle-v6
https://www.cnblogs.com/chengxiao/p/5904783.html
根據上文描述,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引數:指定塊中必須保留的最小空閑空間比例,當塊中的空閑存盤空間減少到PCTFREE所設定的比例后,Oracle將塊標記為不可用狀態,新的資料行將不能被加入到這個塊,
- PCTUSED引數:制定一個百分比,當塊中已經使用的存盤空間降低到這個百分比之下時,這個塊才被重新標記為可用狀態,
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個常見作用:
- 臨時表空間:存盤SQL執行程序中產生的臨時資料,創建Oracle資料庫的時候可以設定一個叫sort_area_size的引數,默認值為65536,排序的時候會首先使用這部分記憶體,如果不足就會使用臨時表空間,
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資料庫的啟動流程
這一部分主要參考(抄襲):
https://blog.csdn.net/huay_li/article/details/80545275
https://www.jianshu.com/p/4d388f148737
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 bytes2)加載(關聯)資料庫
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、資料庫、表空間、資料檔案的相互關系 這一部分主要參考(抄襲): https://blog.csdn.net/kanon_lgt/article/details/4269135
在進入抽象的概念之前,可以先看下網上的這段比喻: “我們可以把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是有用戶和表空間對資料進行管理和存放的,但是表不是有表空間去查詢的,而是由用戶去查的,因為不同用戶可以在同一個表空間建立同一個名字的表!這里區分就是用戶了!下圖也許有助于理解上述名稱之間的關系:
參考:
https://blog.csdn.net/kanon_lgt/article/details/4269135
https://blog.csdn.net/Huay_Li/article/details/80575538
https://blog.csdn.net/huay_li/article/details/80545275
https://blog.csdn.net/u013933870/article/details/51700979
https://blog.csdn.net/oChangWen/article/details/51171992
https://blogs.oracle.com/database4cn/oracle-v6
https://www.jianshu.com/p/4d388f148737
https://www.cnblogs.com/fnng/archive/2012/07/24/2607482.html
https://blog.51cto.com/tianzt/528873
https://wenku.baidu.com/view/047cd4621ed9ad51f01df24a?pcf=2
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/25073.html
標籤:Oracle
上一篇:RAC修改字符集
