Oracle下資料表空間收縮深入理解
在Oracle下在建立資料表空間時一般沒有特殊的需求時都是使用可自動擴充的資料表空間以便於日常的管理,這樣在日常情況下就不用監控資料表空間大小,在沒有使用自動成長的資料表空間建議在80%左右的時候就要增加新的物理檔案已保障其穩定,而在Oracle中使用自動成長的資料表空間,在使用中其物理檔案會隨著資料表空間的增加而增加而在實際情況中可能會因為業務的改變而沒有使用那麼多的資料表空間,這時我們就可以通過Oracle下的資料表空間縮減回收來回收未使用的資料表空間物理檔案所使用的磁碟資源,在Oracle下回收資料表空間很簡單,在Oracle的系統下除了使用者自行定義的資料表空間還有如下幾個預設資料表空間:
資料表空間 |
說明 |
EXAMPLE |
如果在安裝時有選擇“執行個體方案”選項,則在Oracle中會有該資料表空間,如未選擇則沒有,此資料表空間中存放的是各範例的資料 |
SYSAUX |
SYSTEM資料表空間的輔助空間。主要用於儲存資料字典的其他資料對象,這可以減少SYSTEM資料表空間的負荷 |
SYSTEM |
存放資料字典,其中包括表、視圖、預存程序等等相關資料 |
TEMP |
存放SQL語句處理的表和索引的資訊,如:在資料排序時就會佔用此資料表空間 |
UNDOTBS1 |
存放撤銷資料的資料表空間 |
USERS |
一般用於存放Oracle的使用者資料 |
而預設的資料表空間的相關詳細資料可以通過sys使用者下的DBA_DATA_FILES、DBA_FREE_SPACE、DBA_SEGMENTS這3張字典表查到相關資料表空間所存放的資料對象、類型及資料表空間的相關物理檔案和擁有者的相關記錄,如下用於查詢Oracle下資料表空間的使用詳細情況
SELECT
F.TABLESPACE_NAME
"資料表空間名"
,
D.TOT_GROOTTE_MB
"資料表空間大小(M)"
,
D.TOT_GROOTTE_MB - F.TOTAL_BYTES
"已使用空間(M)"
,
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),
'990.99'
) ||
'%'
"使用比"
,
F.TOTAL_BYTES
"空閑空間(M)"
,
F.MAX_BYTES
"最大塊(M)"
FROM
(
SELECT
TABLESPACE_NAME,
ROUND(
SUM
(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(
MAX
(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM
SYS.DBA_FREE_SPACE
GROUP
BY
TABLESPACE_NAME) F,
(
SELECT
DD.TABLESPACE_NAME,
ROUND(
SUM
(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM
SYS.DBA_DATA_FILES DD
GROUP
BY
DD.TABLESPACE_NAME) D
WHERE
D.TABLESPACE_NAME = F.TABLESPACE_NAME
AND
F.TABLESPACE_NAME <>
'EXAMPLE'
AND
F.TABLESPACE_NAME <>
'SYSAUX'
AND
F.TABLESPACE_NAME <>
'SYSTEM'
AND
F.TABLESPACE_NAME <>
'UNDOTBS1'
AND
F.TABLESPACE_NAME <>
'USERS'
AND
F.TABLESPACE_NAME <>
'EXAMPLE'
ORDER
BY
1;
而在使用資料表空間收縮也很簡單:
SELECT
FILE_NAME
FROM
SYS.DBA_DATA_FILES
WHERE
TABLESPACE_NAME =
'TEST'
;#查詢出TEST資料表空間的物理檔案路徑
ALTER
TABLESPACE TEST
COALESCE
;#回收資料表空間片段
ALTER
DATABASE
DATAFILE
'/usr/local/u01/oracle/oradata/oracle/test.dbf'
RESIZE 2M;#回收資料表空間