电竞比分网-中国电竞赛事及体育赛事平台

分享

ORACLE各種對(duì)象、概念及關(guān)系整理(一文讀懂)

 小樣樣樣樣樣樣 2022-04-23

 

下面是我整理(抄襲)的一些Oracle數(shù)據(jù)庫(kù)相關(guān)概念對(duì)象的理解,如有疏漏,歡迎指正。至于整理這篇文章的目的:主要是網(wǎng)上的內(nèi)容太散了,這樣整理一遍可以加深理解,也便于后續(xù)查閱。就我的理解:下述內(nèi)容應(yīng)該可對(duì)10g,11g,12c都適用。更新的版本沒用過。

  Oracle DataBase是一款關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),很多時(shí)候,我們會(huì)把那個(gè)承載我們核心數(shù)據(jù)的系統(tǒng)籠統(tǒng)地成為數(shù)據(jù)庫(kù)服務(wù)器,但從嚴(yán)格意義上來講Oracle DataBase是由兩個(gè)部分組成: 

其中:

  數(shù)據(jù)庫(kù)指的是用戶存儲(chǔ)數(shù)據(jù)的一些物理文件,數(shù)據(jù)庫(kù) = 物理結(jié)構(gòu)+邏輯結(jié)構(gòu)

  實(shí)例是數(shù)據(jù)庫(kù)啟動(dòng)時(shí)初始化的一組進(jìn)程和內(nèi)存結(jié)構(gòu),實(shí)例 = 后臺(tái)進(jìn)程 + 內(nèi)存

  正因?yàn)槿绱宋覀円话悴艜?huì)說關(guān)閉和啟動(dòng)實(shí)例,加載和卸載數(shù)據(jù)庫(kù),就是這個(gè)道理。從實(shí)例和數(shù)據(jù)庫(kù)的概念上來看,我們能知道,實(shí)例是暫時(shí)的,它不過是一組邏輯劃分的內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu),它會(huì)隨著數(shù)據(jù)庫(kù)的關(guān)閉而消失,而數(shù)據(jù)庫(kù)它其實(shí)就是一堆物理文件,它是永久存在的(除非磁盤損壞)。數(shù)據(jù)庫(kù)和實(shí)例通常是一對(duì)一的,這種結(jié)構(gòu)我們稱為單實(shí)例體系結(jié)構(gòu);當(dāng)然還有一些復(fù)雜的分布式的結(jié)構(gòu),一個(gè)數(shù)據(jù)庫(kù)可以對(duì)多個(gè)實(shí)例,像Oracle的RAC(請(qǐng)自行g(shù)oogle或者baidu),即集群模式。

  下圖是對(duì)一個(gè)oracle數(shù)據(jù)庫(kù)服務(wù),更具體的結(jié)構(gòu)展示:

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

 

四、ORACLE 的用戶、SCHEMA、數(shù)據(jù)庫(kù)、表空間、數(shù)據(jù)文件的相互關(guān)系
  這一部分主要參考(抄襲):
 
  在進(jìn)入抽象的概念之前,可以先看下網(wǎng)上的這段比喻:
  “我們可以把Database(這里應(yīng)該指的是某一個(gè)sid對(duì)應(yīng)的數(shù)據(jù)庫(kù))看作是一個(gè)大倉(cāng)庫(kù),倉(cāng)庫(kù)分了很多很多的房間,Schema就是其中的房間,一個(gè)Schema代表一個(gè)房間,Table可以看作是每個(gè)Schema中的床,Table(床)被放入每個(gè)房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一樣,數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)的基本單元是Table,現(xiàn)實(shí)中每個(gè)倉(cāng)庫(kù)放置物品的基本單位就是床, User就是每個(gè)Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一對(duì)應(yīng)的,每個(gè)user在沒有特別指定下只能使用自己schema(房間)的東西,如果一個(gè)user想使用其他schema(房間)的東西,那就要看那個(gè)schema(房間)的user(主人)有沒有給你這個(gè)權(quán)限了,或者看這個(gè)倉(cāng)庫(kù)的老大(DBA)有沒有給你這個(gè)權(quán)限了。換句話說,如果你是某個(gè)倉(cāng)庫(kù)的主人,那么這個(gè)倉(cāng)庫(kù)的使用權(quán)和倉(cāng)庫(kù)中的所有東西都是你的(包括房間),你有完全的操作權(quán),可以扔掉不用的東西從每個(gè)房間,也可以放置一些有用的東西到某一個(gè)房間,你還可以給每個(gè)User分配具體的權(quán)限,也就是他到某一個(gè)房間能做些什么,是只能看(Read-Only),還是可以像主人一樣有所有的控制權(quán)(R/W),這個(gè)就要看這個(gè)User所對(duì)應(yīng)的角色Role了?!?/div>
 
  這些Oracle數(shù)據(jù)庫(kù)中具體的概念在前面已經(jīng)介紹過了,下面再簡(jiǎn)述一下:
 ?。?)數(shù)據(jù)庫(kù):
  Oracle數(shù)據(jù)庫(kù)是數(shù)據(jù)的物理存儲(chǔ)。這就包括(數(shù)據(jù)文件ORA或者DBF、控制文件、聯(lián)機(jī)日志、參數(shù)文件)。其實(shí)Oracle數(shù)據(jù)庫(kù)的概念和其它數(shù)據(jù)庫(kù)不一樣,這里的數(shù)據(jù)庫(kù)是一個(gè)操作系統(tǒng)只有一個(gè)庫(kù)??梢钥醋魇荗racle就只有一個(gè)大數(shù)據(jù)庫(kù)。
 ?。?)實(shí)例:  
  一個(gè)Oracle實(shí)例(Oracle Instance)有一系列的后臺(tái)進(jìn)程(Backguound Processes)和內(nèi)存結(jié)構(gòu)(Memory Structures)組成。一個(gè)數(shù)據(jù)庫(kù)可以有n個(gè)實(shí)例。
  
 
  數(shù)據(jù)庫(kù)和實(shí)例的關(guān)系:
  ORACLE實(shí)例與ORACLE數(shù)據(jù)庫(kù),這個(gè)是比較混淆的一個(gè)概念,在很多觀念下,包括我以前也會(huì)認(rèn)為一個(gè)實(shí)例等價(jià)于一個(gè)數(shù)據(jù)庫(kù),其實(shí)這個(gè)應(yīng)該說是在大部分情況下可以認(rèn)為:一個(gè)實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù), 實(shí)例是一個(gè)Instance,而數(shù)據(jù)是對(duì)外屏蔽的一些轉(zhuǎn)換后文件組合(學(xué)習(xí)過第四代數(shù)據(jù)庫(kù)就知道,如果你做過裸機(jī)文件也會(huì)明白原理),數(shù)據(jù)庫(kù)不是對(duì)外直接開放的,開放的規(guī)則是通過實(shí)例(Instance),Instance是一段內(nèi)存,這個(gè)內(nèi)存中包含很多個(gè)不同的版塊(主體上的分就是SGA和PGA了), 我們一切操作都是交給實(shí)例的,而不是直接操作數(shù)據(jù)庫(kù)文件系統(tǒng),為什么要有中間這個(gè)過程,ORACLE考慮到:安全、緩沖、效率、擴(kuò)展性等問題;而為什么是大部分情況下這樣說, 因?yàn)镺RACLE還有集群的概念,對(duì)于ORACLE RAC真正集群使用后你會(huì)更加深刻認(rèn)識(shí)實(shí)例和數(shù)據(jù)庫(kù)之間的關(guān)系,它使用多個(gè)分布于不同主機(jī)上的實(shí)例,對(duì)同一個(gè)裸機(jī)文件系統(tǒng)上的數(shù)據(jù)庫(kù)進(jìn)行操作,所以此時(shí)實(shí)例和數(shù)據(jù)庫(kù)就不是一對(duì)一了,而是多對(duì)一,但是一個(gè)實(shí)例只能用一個(gè)數(shù)據(jù)庫(kù)這是肯定的。
 
 ?。?)用戶(user)
  用戶是在實(shí)例下建立的。不同實(shí)例可以建相同名字的用戶。
       具體的創(chuàng)建用戶的方法是這樣的(再寫一遍):
1 --創(chuàng)建新用戶,同時(shí)指定表空間和臨時(shí)表空間(建議創(chuàng)建的時(shí)候指明表空間名)
2 CREATE USER testuser         --創(chuàng)建用戶testuser
3     PROFILE "DEFAULT"            --忽略對(duì)profile中的一些資源限制(什么鬼,不明白)
4     IDENTIFIED BY "pwd123456"       --密碼為weixin
5     default tablespace ts_test  --默認(rèn)表空間ts_test,即數(shù)據(jù)默認(rèn)存此表空間
6     temporary tablespace tmp_ts_test  --臨時(shí)表空間
7     QUOTA 500m ON ts_test    --用戶在表空間中的限額
8     ACCOUNT UNLOCK;              --解鎖用戶
 
  ※關(guān)于profile的說明(使用profile文件實(shí)現(xiàn)用戶口令限制與資源限制)
  Proflie是口令限制,資源限制的命名集合.建立oracle數(shù)據(jù)庫(kù)時(shí),oracle會(huì)自動(dòng)建立名為DEFAULT的PROFILE,初始化的DEFAULT沒有進(jìn)行任何口令和資源限制.使用PROFILE有以下一些主要事項(xiàng):
  a,建立PROFILE時(shí),如果只設(shè)置了部分口令或資源限制選項(xiàng),其他選項(xiàng)會(huì)自動(dòng)使用默認(rèn)值(DEFAULT的相應(yīng)選項(xiàng))
  b,建立用戶時(shí),如果不指定PROFILE選項(xiàng),oracle會(huì)自動(dòng)將DEFAULT分配給相應(yīng)的數(shù)據(jù)庫(kù)用戶.
  c,一個(gè)用戶只能分配一個(gè)PROFILE.如果要同時(shí)管理用戶的口令和資源,那么在建立PROFILE時(shí)應(yīng)該同時(shí)指定口令和資源選項(xiàng).
  d,使用PROFILE管理口令時(shí),口令管理選項(xiàng)總是處于被激活狀態(tài),但如果使用PROFILE管理資源,必須要激活資源限制.
  
  ※關(guān)于profile使用的實(shí)踐
  1)查看當(dāng)前存在的profile文件
1 select distinct profile from dba_profiles;
2 --查看指定profile文件中各資源的限制情況:
3 select resource_name,limit from dba_profiles where profile='DEFAULT';
  2)修改現(xiàn)在profile文件中資源選項(xiàng):
1 alter profile default limit FAILED_LOGIN_ATTEMPTS 1 PASSWORD_LOCK_TIME 3;
  3)創(chuàng)建一個(gè)新的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)查看用戶當(dāng)前使用的profile文件
select username,profile from dba_users;
  6)使用profile文件限制用戶對(duì)資源的使用;
1 --必須先激活資源限制:
2 alter system set resource_limit=TRUE scope=memory;
3 --對(duì)資源限制做修改:
4 alter profile lock_accout limit cpu_per_session 5000;
  7)刪除profile
1 drop profile lock_accout;
  8)刪除profile并將使用當(dāng)前profile的用戶profile改為default
1 drop profile lock_accout cascade;
  9)以下列出所有profile相關(guān)參數(shù)內(nèi)容以便于參考:
FAILED_LOGIN_ATTEMPTS:用于指定聯(lián)系登陸的最大失敗次數(shù).
 
PASSWORD_LOCK_TIME:用于指定帳戶被鎖定的天數(shù).
PASSWORD_LIFE_TIME:用于指定口令有效期
PASSWORD_GRACE_TIME:用于指定口令寬限期.
PASSWORD_REUSE_TIME:用于指定口令可重用時(shí)間.
PASSWORD_REUSE_MAX;用于指定在重用口令之前口令需要改變的次數(shù).
PASSWORD_VERIFY_FUNCTION;是否校驗(yàn)口令(校驗(yàn)將值改為VERIFY_FUNCTION)
CPU_PER_SESSION:用于指定每個(gè)會(huì)話可以占用的最大CPU時(shí)間.
LOGICAL_READS_PER_SESSON:用于指定會(huì)話的最大邏輯讀取次數(shù).
PRIVATE_SGA:用于指定會(huì)話在共享池中可以分配的最大總計(jì)私有空間.需要注意,該選項(xiàng)只使用與共享服務(wù)器模式.
COMPOSITE_LIMIT:用于指定會(huì)話的總計(jì)資源消耗(單位:服務(wù)單元).
CPU_PER_CALL:限制每次調(diào)用(解析,執(zhí)行或提取數(shù)據(jù))可占用的最大CPU時(shí)間(單位:百分之一秒)
LOGICAL_READS_PER_CALL:用于限制每次調(diào)用的最大邏輯I/O次數(shù).
SESSIONS_PER_USER:用于指定每個(gè)用戶的最大并發(fā)會(huì)話個(gè)數(shù).
CONNECT_TIME:用于指定會(huì)話的最大連接時(shí)間.
IDLE_TIME:用于指定會(huì)話的最大空閑時(shí)間.
 ?。?)schema:
      在Oracle中,一般一個(gè)用戶就對(duì)應(yīng)一個(gè)schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema,用戶是不能創(chuàng)建schema的,schema在創(chuàng)建用戶的時(shí)候創(chuàng)建,并可以指定用戶的各種表空間(這點(diǎn)與PostgreSQL是不同,PostgreSQL是可以創(chuàng)建schema并指派給某個(gè)用戶)。當(dāng)前連接到數(shù)據(jù)庫(kù)上的用戶創(chuàng)建的所有數(shù)據(jù)庫(kù)對(duì)象默認(rèn)都屬于這個(gè)schema(在不指明schema的情況下),比如若用戶scott連接到數(shù)據(jù)庫(kù),然后create table test(id int not null)創(chuàng)建表,那么這個(gè)表被創(chuàng)建在了scott這個(gè)schema中;但若這樣create table testuser.test(id int not null)的話,這個(gè)表被創(chuàng)建在了testuser這個(gè)schema中,當(dāng)然前提是權(quán)限允許(即testuser用戶給scott用戶在其schema下創(chuàng)建數(shù)據(jù)表的權(quán)限)。由此來看,schema是一個(gè)邏輯概念。
      但一定要注意一點(diǎn):schema并不是在創(chuàng)建user時(shí)就創(chuàng)建的,而是在該用戶創(chuàng)建了第一個(gè)對(duì)象之后才將schema真正創(chuàng)建的,只有user下存在對(duì)象,他對(duì)應(yīng)的schema才會(huì)存在,如果user下不存在任何對(duì)象了,schema也就不存在了;
 
 ?。?)表空間:
  表空間是一個(gè)用來管理數(shù)據(jù)存儲(chǔ)邏輯概念,表空間只是和數(shù)據(jù)文件(ORA或者DBF文件)發(fā)生關(guān)系,數(shù)據(jù)文件是物理的,一個(gè)表空間可以包含多個(gè)數(shù)據(jù)文件,而一個(gè)數(shù)據(jù)文件只能隸屬一個(gè)表空間。
 
 ?。?)數(shù)據(jù)文件(dbf、ora):
  數(shù)據(jù)文件是數(shù)據(jù)庫(kù)的物理存儲(chǔ)單位。數(shù)據(jù)庫(kù)的數(shù)據(jù)在邏輯上是存儲(chǔ)在表空間中的,但真正落地是在某一個(gè)或者多個(gè)數(shù)據(jù)文件中。而一個(gè)表空間可以由一個(gè)或多個(gè)數(shù)據(jù)文件組成,一個(gè)數(shù)據(jù)文件只能屬于一個(gè)表空間。一旦數(shù)據(jù)文件被加入到某個(gè)表空間后,就不能刪除這個(gè)文件,如果要?jiǎng)h除某個(gè)數(shù)據(jù)文件,只能刪除其所屬于的表空間才行。
   表的數(shù)據(jù),是由用戶放入某一個(gè)表空間的,而這個(gè)表空間會(huì)隨機(jī)把這些表數(shù)據(jù)放到一個(gè)或者多個(gè)數(shù)據(jù)文件中。
  由于oracle的數(shù)據(jù)庫(kù)不是普通的概念,oracle是有用戶和表空間對(duì)數(shù)據(jù)進(jìn)行管理和存放的。但是表不是有表空間去查詢的,而是由用戶去查的。因?yàn)椴煌脩艨梢栽谕粋€(gè)表空間建立同一個(gè)名字的表!這里區(qū)分就是用戶了!
  下圖也許有助于理解上述名稱之間的關(guān)系:
 
參考:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多