表空間和資料檔案
Oracle 資料庫在邏輯上将資料存儲在表空間中,在實體上将資料存儲在資料檔案中。
<b>表空間:</b>
隻能屬于一個資料庫
包括一個或多個資料檔案
可進一步劃分為邏輯存儲單元
是存儲方案對象資料的資料檔案庫
<b>資料檔案:</b>
隻能屬于一個表空間和一個資料庫
是構成表空間的基礎檔案
存儲結構
資料庫、表空間、段(segment)、區間(extent)、資料塊(block)
1、一個表空間隻能屬于一個資料庫、一個表空間可以包括多個資料檔案、一個資料檔案隻能屬于一個表空間
2、一個段可以跨越多個資料檔案,普通表就是一個segment、索引也是一個segment
3、segment配置設定空間的最小機關就是extent,每個segment由一個或者多個extent組成
4、一個extent不能跨越多個資料檔案因為一個extent是實體上連續的存儲空間
5、一個extent由多個連續的block組成
6、block是oracle I/O的最小機關
建立永久表空間
表空間通過資料量的大小通常分為三類:大表、中表、小表,我們來簡單看一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_13297032280GDm.jpg"></a>
上圖指令建立了一個标準表空間,接下來我們建立一個小表表空間
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229cwRV.jpg"></a>
接下來我們再建立一個大表表空間
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229vlVO.jpg"></a>
通過追加不同的參數值,可以建立不同區大小的表空間,我們來看一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229vteW.jpg"></a>
上圖中我們建立了一個區大小為1M的表空間,接下來我們再看看另一種建立方式
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229jV7s.jpg"></a>
可以看到,我們指定了預設的存儲方式(初始化區大小為512k、下一個區大小為512k)
我們也可以通過ASSM技術建立一個自動段空間管理的表空間,下面詳細看一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229v7aX.jpg"></a>
對于建立的Oracle表空間來講,Oracle9i以後版本為其準備了幾種不同的塊模式,分别為2k、4k、8k、16k和32k,其中預設建立的表空間為8k,若想使用不同塊的表空間,則需要激活不同塊的db_cache大小。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229VTAA.png"></a>
我們來具體建立一個4k塊大小的表空間,親自感受一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229MbtY.png"></a>
首先為4K塊大小的表空間配置設定空間大小(注意:db_Nk_cache_size的大小不能超過其配置的SGA記憶體總和,且通常為2的N次方倍。)
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703229WcqL.jpg"></a>
臨時表空間和臨時表空間組
臨時表空間主要用來存放使用者的臨時資料,例如排序資料
Oracle10g中引入了臨時表空間組的概念
1、臨時表空間組是一組臨時表空間
2、臨時表空間組和臨時表空間的名字不能相同
3、不能顯式的建立和删除臨時表空間組,因為臨時表空間組中必須要有成員,當第一個臨時表空間被配置設定給臨時表空間組的時候,臨時表空間組自動的建立,當最後一個臨時表空間從臨時表空間組退出的時候,臨時表空間組自動删除,這樣保證了臨時表空間組總是有成員。
使用臨時表空間組的好處
1、同一個使用者,在不同的session裡可以使用不同的臨時表空間
每一個使用者有一個預設的臨時表空間,同一個使用者登陸多個session的時候,如果不使用臨時表空間組,那麼所有的session使用同一個臨時表空間,容易産生瓶頸問題。
2、在并行操作中,不同的從屬程序可以使用不同的臨時表空間
3、在資料庫層面可以同時指定多個預設臨時表空間
預設臨時表空間組的出現,主要是為了分散使用者對預設臨時表空間的集中使用,通過将對臨時表空間的使用分散到多個臨時表空間上,提高了性能
建立臨時表空間組
下面我們通過指令來建立一個臨時表空間組
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703230oXLQ.jpg"></a>
通過上圖可以看到,我們在原有臨時表空間temp01的基礎上又建立了三個臨時表空間,并将所有的臨時表空間配置設定到臨時表空間組tmp_grp中,現在我們來查詢一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703230Siq1.png"></a>
可以看到,現在的臨時表空間組中已經有了四個臨時表空間,我們将其配置為資料庫的臨時表空間
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703230XoU2.png"></a>
删除表空間
在生産環境中,我們有時候需要删除多餘的表空間來回收資源,下面簡單看一下基本指令
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703230frn0.png"></a>
表空間已經被删除,但是我們通過系統中查詢,表空間的資料檔案并沒有被系統回收并釋放,還需要由我們手工删除它
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703230FPf4.png"></a>
那麼,有沒有辦法直接在删除表空間的時候自動删除資料檔案呢,我們來看一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703230FYgE.png"></a>
我們再來查詢一下資料檔案,看看磁盤空間是否已經被釋放。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703231HDY8.png"></a>
可以看到small_tbs表空間對應的資料檔案已經被删除,磁盤空間已經被回收。
轉移表空間
1、隻能使用指令行,不能使用OEM工具
2、分為兩種(轉移非system表空間、轉移system表空間)
現在我們先來看一下轉移非system表空間
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703231kT75.jpg"></a>
可以看到,我們已經将example表空間進行了轉移,接下來我們看一下system表空間的轉移
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703231t9sK.jpg"></a>
由上圖可以看到,所有與system表空間有關的操作,都必須在資料庫mount但未open的狀态下操作。
聯機日志檔案
1、聯機重做日志檔案記錄的都是資料塊的變化,例如資料塊頭部的變化也會産生重做記錄
2、commit的時候會觸發LGWR,因為LGWR是順序寫入的,這相對DBWR來說,速度就快得多,是以送出的時候,隻要保證LGWR寫完即可,這樣提高了送出的速度
3、聯機重做日志檔案最主要的功能是為了進行恢複
建立聯機日志檔案組
在建立資料庫的時候,我們已經建立了三個聯機日志檔案組,現在我們将每個組添加新的聯機日志檔案。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703231A4lP.jpg"></a>
接下來讓我們建立兩個新的聯機日志檔案組,并進行一次手工的日志切換
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703231QIsr.jpg"></a>
Oracle Managed Files(OMF)
如果使用Oracle Managed Files (OMF),則不需要直接管理構成Oracle 資料庫的作業系統檔案。可以根據資料庫對象而不是檔案名指定操作。對于以下資料庫結構,可以按需要在資料庫内部使用标準檔案系統接口來建立和删除檔案:
l 表空間
l 重做日志檔案
l 控制檔案
l 歸檔日志
l 塊更改跟蹤檔案
l 閃回日志
l RMAN 備份
資料庫可以混合包含Oracle Managed Files 和非Oracle Managed Files。由上面任一參數指定的檔案系統目錄必須已經存在:資料庫不會建立檔案系統目錄。該目錄還必須擁有允許資料庫在其中建立檔案的權限。
建立OMF表空間需要首先設定幾個重要的參數檔案,讓我們分别來看一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703231XEcj.png"></a>
首先擁有五個空的聯機日志檔案存放路徑
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703232GFJP.jpg"></a>
其次設定閃回區的路徑與閃回區空間大小
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703232jEck.png"></a>
最後設定OMF的資料檔案存儲路徑,重新開機資料庫後,讓我們來嘗試建立一個OMF表空間
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703232Gocm.png"></a>
可以看到,在我們沒有指定檔案的路徑和名稱的時候,Oracle會自動為我們建立一個OMF表空間。
如果我們設定了上面的三個參數,那麼在建立表空間、建立聯機重做日志檔案、使用恢複區的時候,Oracle自動的管理這些檔案的路徑、大小、名稱。
表空間中的空間管理
<b>本地管理的表空間:</b>
在表空間中管理空閑區。
使用位圖記錄空閑區。
每一位對應于一個塊或一組塊。
位值訓示空閑區或占用區。
建議使用本地管理的表空間。
<b>字典管理的表空間:</b>
由資料字典管理空閑區。
配置設定或取消配置設定區後會更新相應的表。
支援這些表空間僅僅是為了向後相容。
查詢表空間資訊:
DBA_TABLESPACES
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703232D9NH.png"></a>
V$TABLESPACE
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703232aLSP.png"></a>
查詢資料檔案資訊:
DBA_DATA_FILES
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703232lkKj.png"></a>
V$DATAFILE
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703233452W.png"></a>
查詢臨時檔案資訊:
DBA_TEMP_FILES
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703233Iivo.png"></a>
V$TEMPFILE
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703233Bsev.png"></a>
表空間的脫機與聯機
對于表空間,根據生産環境的需請求,可能經常需要對其進行各種操作,在對表空間操作時,有很多情況需要表空間處于脫機狀态,我們來簡單看一下。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703233rmcq.png"></a>
現在我們重新将tbs表空間聯機
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703233S1nW.png"></a>
那麼如果tbs表空間的資料檔案被誤删除,又該如何讓他脫機呢,我們來看一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703233ESwR.png"></a>
如上圖所示,我們現在已經删除了tbs表空間的資料檔案,現在重新開機一下資料庫,看看發生什麼情況
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703234xlcX.png"></a>
可以看到,由于無法找到tbs表空間的資料檔案,是以當打開資料庫的時候,Oracle會報告錯誤,那麼如何來解決呢,我們來看一下
如上圖所示,Oracle會報告無法找到tbs表空間對應的資料檔案,那麼,我們就需要将此資料檔案先進行脫機
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703234Bh21.png"></a>
注意:在非歸檔模式下脫機資料檔案,需要加上drop參數。
可以看到資料檔案已經脫機,我們再來啟動一下資料庫看一下。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_13297032348tuU.png"></a>
資料庫已經開啟,我們現在可以重新将表空間tbs脫機。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703234GSRs.png"></a>
注意:當資料檔案被誤删除時,表空間的脫機指令需要加上for recover參數。
隻讀與讀寫表空間
有時,當我們不希望使用者對表空間中的資料進行改動時,就可以将其變更為隻讀模式。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_13297032349eWM.png"></a>
可以看到,prod表空間已經被設定為隻讀模式。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703235UOXx.jpg"></a>
可以看到,我們無法為隻讀表空間配置設定空間(11g可以配置設定空間,無法寫入資料,有興趣的朋友可以對比一下)。如果想對表空間的資料進行改動,則需重新将表空間設定為可讀寫狀态。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703235n9Cx.png"></a>
改為讀寫狀态後,可以往表中插入資料。
擴充表空間
在生産環境中,随着表中資料的不斷增加,如果表空間在之前定義的時候沒有設定自動增長模式,或者設定了固定的表空間大小,我們可能會需要擴充表空間,來具體看一下
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703235bsGf.jpg"></a>
如圖所示,我們将data表空間的資料檔案大小擴充到500M,那麼,如果有時候一個資料檔案無法滿足表空間的存儲容量,或者磁盤已滿,需要存儲于其他地方,那麼就需要為表空間再增加一個資料檔案。
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703235C60o.jpg"></a>
如圖所示,我們又為data表空間增加了一個資料檔案data02.dbf
<a href="http://bearlovecat.blog.51cto.com/attachment/201202/20/1293914_1329703235Wjvj.jpg"></a>
查詢視圖可以看到,表空間data下已經有了兩個資料檔案。
本文轉自bear_cat51CTO部落格,原文連結:http://blog.51cto.com/bearlovecat/784402 ,如需轉載請自行聯系原作者