【Oracle】oracle tablespace&datafile -- oracle表空間 分享[轉]

zhouxianwang發表於2012-12-25
 在前面學習Oracle資料庫基礎架構時,已經瞭解了Oracle的儲存結構,邏輯上,Oracle的資料存放在tablespaces中,物理 上存放在datafiles中。一個tablespace只能屬於一個資料庫(一個資料庫可包括多個tablespace),包括了1個或多個資料檔案。 Tablespace可進一步分為segments、extents和blocks。一個datafile只屬於一個資料庫的一個tablespace。

Tablespace的分類有2種,一種分為SYSTEM tablespaceNon-SYSTEM tablespace

SYSTEM tablespace是隨資料庫的建立而建立的,包含了資料字典和SYSTEM undo segment;Non-SYSTEM tablespace包括了分配給使用者的空間便於資料庫的空間管理。

另一種分為permanentundotemporary三種tablespace。
一般不加特別說明時所建立的permanent tablespace,儲存永久性物件
undo tablespace用於儲存undo segments以便於回滾操作,而不能包含其他物件
temporary tablespace是用於進行排序操作,能夠被多個使用者共享,不能包含永久性物件.

    Temporary tablespace中有一個default temporary tablespace,指定了一個全域性的預設臨時表空間,如果沒有這個表空間,預設情況下,是使用SYSTEM tablespace來儲存臨時資料的,顯然,這是不好的,預設臨時表空間只有一個,可以從表database_properties中檢視 default temp tablespace,在新的default temp tablespace被建立之前,是不能被dropped的。

和tablespace以及datafile相關的資料字典有:dba_tablespacesv$tablespacedba_data_filesv$datafiledba_temp_filesv$tempfile

1、建立表空間
建立表空間的完整命令:

Create [undo] tablespace

datafile [,]

mininum extent k|m

blocksize [k]

logging clause

force logging

default storage_clause

online | offline

permanent | temporary

extent_manager_clause

segment_manager_clause

1)、undo指定系統將建立一個回滾表空間

2)、tablespace指定表空間名稱

3)、datafile指定資料檔案的路徑、名稱、大小及自增長狀況:具體形如 'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' size 50M autoextend on next 10M maxsize 500M,也可以指定on為off,就沒有後面的遞增和最大尺寸了,也可以在maxsize後面指定最大尺寸unlimited說明表空間無限大。

4)、mininum extent k|m指出在表空間的extent的最小值,這個引數可以減少空間碎片,保證在表空間的extent是這個數值的整數倍;

5)、blocksize [k]設定塊的大小,如果要設定這個引數,必須設定成db_block_size的整數倍;

6)、logging cluse指示這個表空間上所有使用者物件的日誌屬性,預設是logging;

7)、force logging指示表空間進入強制日誌模式。此時系統將記錄表空間上物件的所有改變,除了臨時段的改變。這個引數高於logging引數中的nologging選項;

8)、default storage_clause宣告預設的儲存子句;

9)、online|offline指定表空間狀態;

10)、permanent | temporary指出表空間的屬性,是永久表空間 還是臨時表空間。永久表空間存放的是永久物件,臨時表空間存放的是session生命期中存在的臨時物件。這個引數生成的臨時表空間建立後一直都是字典管 理,不能使用extent management local選項。如果要建立本地管理表空間,必須使用create temporary tablespace。宣告瞭這個引數就不能宣告block size。

11)、extent_manager_clause說明表空間如何管理 extent。一旦宣告瞭這個子句,就只能透過移植的方式改變這些引數。如果希望表空間本地管理的話,宣告local選項。本地管理表空間是透過點陣圖管理 的。Autoallocate說明表空間自動分配extent,使用者不能指定extent的大小。只有9.0以上的版本具有這個功能。Uniform說明 表空間的範圍的固定大小,預設是1M。不能將本地管理的資料庫的SYSTEM表空間設定成字典管理。ORACE推薦使用本地管理表空間。如果沒有設定這個 子句,oracle會進行預設設定。如果初始化引數compatible小於9.0.0,那麼系統建立字典管理表空間,如果大於9.0.0,那麼按如下設 置:

如果沒有指定default storage_clause,oracle建立一個自動分配的本地管理表空間;否則如果指定了mininum extent,那麼oracle判斷mininum extent、initial、next是否相等,以及pctincrease是否為0,如果滿足這2個條件,oracle吃醋昂就一個本地管理表空 間,extent size是initial,如果不滿足,那麼oracle將建立一個自動分配的本地管理表空間;如果沒有指定mininum extent,那麼oracle判斷initial和next是否相等,以及pctincrease是否為0,如果滿足這2個條件,那麼oracle建立 一個本地管理表空間並制定uniform,否則oracle將建立一個自動分配的本地管理表空間。(本地管理表空間只能儲存永久物件。如果你宣告瞭 local,則不能宣告default storage_clause,mininum extent,temporary);

12)、segment_management_clause : segment space management auto。

2、表空間的狀態:
Tablespace的狀態有3種:ONLINEOFFLINEREAD ONLY。ONLINE是正常工作的狀態,OFFLINE狀態下,是不允許訪問資料的,
SYSTEM tablespace和DEFAULT temp tablespace是不能被OFFLINE的,且帶有active undo segments的tablespace也不能被OFFLINE
切換ONLINE和OFFLINE狀態的命令是alter tablespace offline/online。當狀態變成READ-ONLY時,會產生一個checkpoint,此時資料只能讀不能寫,但是可以drop物件,相關命令是alter tablespace read onlyalter tablespace read write

3、表空間的儲存設定
修改tablespace和datafiles的儲存設定。這項工作是指修改tablespace的大小和datafile的存放位置。

在修改tablespace的大小之前,我們需要先知道tablespac的當前儲存情況。可以用下面的SQL語句實現:

SELECT a.tablespace_name,

      a.bytes bytes_used,

      b.largest,

      round(((a.bytes - b.bytes) / a.bytes)*100, 2) percent_used

 FROM

 (SELECT tablespace_name,

         SUM(bytes) bytes

    FROM Dba_Data_Files

   GROUP BY tablespace_name) a,

 (SELECT tablespace_name,

         SUM(bytes) bytes,

         MAX(bytes) largest

    FROM dba_free_space

   GROUP BY tablespace_name) b

 WHERE a.tablespace_name = b.tablespace_name

 ORDER BY ((a.bytes - b.bytes) / a.bytes) DESC;

上面這條SQL語句中,有2條子查詢,第一條取得的是表空間的總位元組數,第二條取得的是表空間中餘下的位元組數,最終得到的結果是已經使用的位元組數和百分比。

修改tablespace的大小,主要是透過datafile的大小來實現的,修改datafile的大小又有3種方法:
1)、使資料檔案自增長;
2)、改變資料檔案大小;
3)、新增資料檔案。

使資料檔案自增長:表DBA_DATA_FILES中有一個欄位AUTOEXTENSIBLE與這個方法對應,它指示資料檔案是否自增長,也就是數 據檔案不能滿足儲存需求時,是否自動增加大小來滿足需求。先執行下列命令建立一個datafile大小為5M的表空間—TEST:create tablespace test datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' size 5M;這個時候,AUTOEXTENSIBLE是no,也就是資料檔案的大小是固定的,不會自增長(當然,我們也可以在建立命令中加入指令設定自增長)。下面我們手動來修改資料檔案為自增長:alter database datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' autoextend on next 5M maxsize 50M;這條命令將TEST.DBF資料檔案設定為按5M大小進行自增長,最大為50M。

改變資料檔案大小:以前面的資料檔案為例,我想將資料檔案設定為100M大小,可以執行命令:alter database datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' resize 100M;

新增資料檔案:這應該是最好的一種方式,便於管理。以TEST表空間為例,新增資料檔案的命令如下:alter tablespace test add datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST01.DBF' size 5M autoextend on next 5M maxsize 50M;這條命令就直接指定了資料檔案自增長。

除了修改表空間的大小,儲存設定中還可以進行的一項工作就是移動資料檔案。
移動資料檔案有2種方法,一種是使用alter tablespace命令,一種是使用alter database命令。

使用alter tablespace移動資料檔案前,需要先將表空間OFFLINE,然後目標資料檔案必須存在(也就是將需要移動的資料檔案複製到目的地)。以將資料檔案TEST01.DBF移動到上一層目錄為例。先執行命令:alter tablespace test offline;然後將TEST01.DBF複製到上一級目錄,再執行命令:alter tablespace test rename datafile E:\oracle\product\10.2.0\oradata\orcl\TEST01.DBF' to 'E:\oracle\product\10.2.0\oradata\TEST01.DBF';然後再將表空間ONLINE就可以了:alter tablespace test online;

使用alter database移動資料檔案時,同樣,目標資料檔案必須存在(原檔案的副本),且資料庫需要處於MOUNTED狀態。第一種方法,已經將資料檔案移動到 了父一級目錄,下面再將它移回來。先關閉資料庫:shutdown immediate;然後啟動資料庫,啟動選項為mount:startup mount;然後執行移動命令:alter database rename file 'E:\oracle\product\10.2.0\oradata\TEST01.DBF' to 'E:\oracle\product\10.2.0\oradata\orcl\TEST01.DBF';再開啟資料庫:alter database open,報錯了:

ORA-01113:檔案7需要介質恢復

ORA-01110:資料檔案7:’E:ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF’,細節還 不明白,只知道資料庫認為這個資料檔案收到破壞,需要使用備份、日誌資訊來恢復。這本來是個比較嚴重的問題,但是在這個例項中,還是很好解決的,執行命 令:

recover datafile ’E:ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF’。提示完成介質恢復,再開啟資料庫:alter database open;一切就正常了。

4、刪除表空間
      刪除表空間,使用命令drop tablespace >。但是有3個選項需要注意

INCLUDING CONTENTS:指示刪除表空間中的segments;

INCLUDING CONTENTS AND DATAFILES:指示刪除segments和datafiles;

CASCADE CONSTRAINTS:刪除所有與該空間相關的完整性約束條件

Drop tablespace test INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

需要注意的是SYSTEM表空間以及具有active segments的表空間是無法刪除的。


source:http://dongyongjun.blog.sohu.com/169044317.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27036311/viewspace-751582/,如需轉載,請註明出處,否則將追究法律責任。