在前面學習Oracle數據庫基礎架構時,已經瞭解了Oracle的存儲結構,邏輯上,Oracle的數據存放在tablespaces中,物理上存放在datafiles中。一個tablespace只能屬於一個數據庫(一個數據庫可包括多個tablespace),包括了1個或多個數據文件。Tablespace可進一步分爲segments、extents和blocks。一個datafile只屬於一個數據庫的一個tablespace。
Tablespace的分類有2種,一種分爲SYSTEM tablespace和Non-SYSTEM tablespace。
SYSTEM tablespace是隨數據庫的創建而創建的,包含了數據字典和SYSTEM undo segment;Non-SYSTEM tablespace包括了分配給用戶的空間便於數據庫的空間管理。
另一種分爲permanent、undo、temporary三種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_tablespaces、v$tablespace、dba_data_files、v$datafile、dba_temp_files、v$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,也可以指定on爲off,就沒有後面的遞增和最大尺寸了,也可以在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_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種:ONLINE、OFFLINE、READ ONLY。ONLINE是正常工作的狀態,OFFLINE狀態下,是不允許訪問數據的,SYSTEM tablespace和DEFAULT temp tablespace是不能被OFFLINE的,且帶有active undo segments的tablespace也不能被OFFLINE。切換ONLINE和OFFLINE狀態的命令是alter tablespace <ts_name> offline/online。當狀態變成READ-ONLY時,會產生一個checkpoint,此時數據只能讀不能寫,但是可以drop對象,相關命令是alter tablespace <ts_name> read only和alter tablespace <ts_name> 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 <ts_name>。但是有3個選項需要注意:
INCLUDING CONTENTS:指示刪除表空間中的segments;
INCLUDING CONTENTS AND DATAFILES:指示刪除segments和datafiles;
CASCADE CONSTRAINTS:刪除所有與該空間相關的完整性約束條件。
Drop tablespace test INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
需要注意的是SYSTEM表空間以及具有active segments的表空間是無法刪除的。