首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 表空間操作全攻略:建立、擴充、移動與狀態控制

     編輯:Oracle 資料庫基礎

表空間類型與建立語法

永久表空間

CREATE TABLESPACE data01
DATAFILE '/u01/oradata/db/data01.dbf' SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K  -- 或 AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;            -- ASSM, 推薦
  • UNIFORM SIZE:固定區塊大小 (此例 128K),預設 64K
  • AUTOALLOCATE:系統自動管理區塊大小 (64K/1M/64M)
  • ASSM (AUTO) 取代傳統 freelist,高併發效能更佳

UNDO 表空間

CREATE UNDO TABLESPACE undotbs02
DATAFILE '/u01/oradata/db/undotbs02.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G;

-- 切換啟用 (僅能有一個作用中)
ALTER SYSTEM SET undo_tablespace = undotbs02 SCOPE=BOTH;

暫存表空間

CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/u01/oradata/db/temp_data.dbf' SIZE 200M
AUTOEXTEND ON NEXT 50M MAXSIZE 5G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

表空間狀態控制

操作語法說明
離線 (正常)ALTER TABLESPACE tbs OFFLINE NORMAL;檢查點完成後離線,無需恢復
離線 (需恢復)ALER TABLESPACE tbs OFFLINE IMMEDIATE;檔案遺失時使用,上線需媒體恢復
上線ALTER TABLESPACE tbs ONLINE;
單一資料檔離線ALTER DATABASE DATAFILE 'path' OFFLINE;不影響同表空間其他檔案
唯讀ALTER TABLESPACE tbs READ ONLY;適合歷史歸檔、備份一致性
讀寫ALTER TABLESPACE tbs READ WRITE;

空間擴充三大招

1. 新增資料檔 (推薦,無停機)

ALTER TABLESPACE tbs
ADD DATAFILE '/u01/oradata/db/tbs02.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;

2. 手動調整既有檔案大小

ALTER DATABASE DATAFILE '/u01/oradata/db/tbs.dbf' RESIZE 5G;

3. 啟用自動擴展

ALTER DATABASE DATAFILE '/u01/oradata/db/tbs.dbf'
AUTOEXTEND ON NEXT 200M MAXSIZE 10G;

物件遷移表空間

物件類型語法備註
表ALTER TABLE t MOVE TABLESPACE new_tbs;會導致 ROWID 變更,索引失效需 REBUILD
索引ALTER INDEX idx REBUILD TABLESPACE new_tbs;ONLINE 選項可避免鎖表
LOBALTER TABLE t MOVE LOB(col) STORE AS (TABLESPACE new_tbs);
分區表ALTER TABLE t MOVE PARTITION p TABLESPACE new_tbs;逐分區遷移減少鎖定時間

刪除表空間

-- 僅刪除空表空間
DROP TABLESPACE tbs;

-- 含物件與資料檔 (謹慎!)
DROP TABLESPACE tbs INCLUDING CONTENTS AND DATAFILES;

監控查詢腳本

-- 表空間使用率總覽
SELECT t.tablespace_name,
       ROUND(t.total_mb,2) total_mb,
       ROUND(t.total_mb - NVL(f.free_mb,0),2) used_mb,
       ROUND(NVL(f.free_mb,0),2) free_mb,
       ROUND(100 * NVL(f.free_mb,0) / t.total_mb,2) pct_free
FROM (
    SELECT tablespace_name, SUM(bytes)/1024/1024 total_mb
    FROM dba_data_files GROUP BY tablespace_name
) t
LEFT JOIN (
    SELECT tablespace_name, SUM(bytes)/1024/1024 free_mb
    FROM dba_free_space GROUP BY tablespace_name
) f USING (tablespace_name)
ORDER BY pct_free;

-- 最大連續可用空間 (判斷能否滿足 NEXT EXTENT)
SELECT tablespace_name, MAX(bytes)/1024/1024 max_free_mb
FROM dba_free_space GROUP BY tablespace_name;

最佳實踐原則

  1. 採用 LMT + ASSM (LOCAL + AUTO),避免 Dictionary Managed 與 Manual Segment Space
  2. 資料檔預留 AUTOEXTEND,MAXSIZE 設定上限防止撐爆磁碟
  3. 依業務分離表空間:DATA / INDEX / LOB / ARCHIVE / TEMP / UNDO
  4. 大表採用分區,分區級遷移/維護不影響整表
  5. 定期 COALESCE (僅 Dictionary Managed 需要) 或 ALTER TABLESPACE ... SHRINK SPACE (11g+)
  6. 監控告警閾值:Warning 75%、Critical 90%
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved