orale tablespace&datafile -- oracle表空間

在前面學習Oracle數據庫基礎架構時,已經瞭解了Oracle的存儲結構,邏輯上,Oracle的數據存放在tablespaces中,物理上存放在datafiles中。一個tablespace只能屬於一個數據庫(一個數據庫可包括多個tablespace),包括了1個或多個數據文件Tablespace可進一步分爲segmentsextentsblocks。一個datafile只屬於一個數據庫的一個tablespace

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

SYSTEM tablespace是隨數據庫的創建而創建的,包含了數據字典和SYSTEM undo segmentNon-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 <ts_name>

datafile <file_spec1> [,<file_spec2>]

mininum extent <m> k|m

blocksize <n> [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,也可以指定onoff,就沒有後面的遞增和最大尺寸了,也可以在maxsize後面指定最大尺寸unlimited說明表空間無限大。

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

5)blocksize <n> [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_clauseoracle創建一個自動分配的本地管理表空間;否則如果指定了mininum extent,那麼oracle判斷mininum extentinitialnext是否相等,以及pctincrease是否爲0,如果滿足這2個條件,oracle喫醋昂就一個本地管理表空間,extent sizeinitial,如果不滿足,那麼oracle將創建一個自動分配的本地管理表空間;如果沒有指定mininum extent,那麼oracle判斷initialnext是否相等,以及pctincrease是否爲0,如果滿足這2個條件,那麼oracle創建一個本地管理表空間並制定uniform,否則oracle將創建一個自動分配的本地管理表空間。(本地管理表空間只能存儲永久對象。如果你聲明瞭local,則不能聲明default storage_clausemininum extenttemporary)

12)segment_management_clause : segment space management auto

 

2、表空間的狀態:

Tablespace的狀態有3種:ONLINEOFFLINEREAD ONLYONLINE是正常工作的狀態,OFFLINE狀態下,是不允許訪問數據的,SYSTEM tablespaceDEFAULT temp tablespace是不能被OFFLINE的,且帶有active undo segmentstablespace也不能被OFFLINE。切換ONLINEOFFLINE狀態的命令是alter tablespace <ts_name> offline/online。當狀態變成READ-ONLY時,會產生一個checkpoint,此時數據只能讀不能寫,但是可以drop對象,相關命令是alter tablespace <ts_name> read onlyalter tablespace <ts_name> read write

3、表空間的存儲設置

修改tablespacedatafiles的存儲設置。這項工作是指修改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的表空間—TESTcreate 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;然後啓動數據庫,啓動選項爲mountstartup 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 <ts_name>。但是有3個選項需要注意:

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

INCLUDING CONTENTS AND DATAFILES:指示刪除segmentsdatafiles

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

Drop tablespace test INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章