1.1、表空间类型
类型 | 用途 | 说明 |
永久表空间 | 存储用户数据 | SYSTEM, SYSAUX, USERS, 自定义 |
UNDO表空间 | 事务回滚和读一致性 | 自动管理,12c+支持多UNDO |
临时表空间 | 排序、哈希等临时操作 | TEMP,不产生redo |
大文件表空间 | 单个数据文件可达128TB | Bigfile Tablespace |
加密表空间 | 数据透明加密(TDE) | 12c+原生支持 |
1.2、创建表空间
创建标准小文件表空间:
CREATE TABLESPACE app_data DATAFILE '+DATA' SIZE 10G AUTOEXTEND ON NEXT 1G MAXSIZE 50G EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;创建大文件表空间(12c+推荐):
CREATE BIGFILE TABLESPACE big_data DATAFILE '+DATA' SIZE 100G AUTOEXTEND ON NEXT 10G MAXSIZE 128T EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO;1.3、表空间管理操作
- 扩容:调整数据文件大小
- 扩展:添加新的数据文件
- 状态切换:设置只读/读写模式
- 重命名:重命名表空间
- 删除:DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES
-- 扩容:调整数据文件大小 ALTER DATABASE DATAFILE '+DATA/app_data01.dbf' RESIZE 20G; -- 扩展:添加新数据文件 ALTER TABLESPACE app_data ADD DATAFILE '+DATA/app_data02.dbf' SIZE 10G; -- 设为只读 ALTER TABLESPACE app_data READ ONLY; -- 重命名 ALTER TABLESPACE app_data RENAME TO app_data_v2;实例:表空间容量规划与扩展
S — Situation(场景):某金融系统核心交易表空间TS_TRADE使用率达到92%,数据文件总大小200GB,业务高峰期频繁报ORA-01653(无法扩展区)。
T — Task(任务):在不停机的情况下将表空间扩容至500GB,并优化空间管理策略。
A — Action(行动):
1、首先查询DBA_DATA_FILES和DBA_FREE_SPACE确认当前空间分布;
2、评估后采用两种方式并行:
--将现有数据文件从200GB扩容至300GB(ALTER DATABASE DATAFILE ... RESIZE);
--新增一个200GB数据文件分散I/O(ALTER TABLESPACE ADD DATAFILE);
3、设置AUTOEXTEND ON NEXT 5G MAXSIZE 500G防止未来空间不足;
4、配合监控脚本设置80%使用率预警。
R — Result(结果):表空间可用空间扩展至500GB,使用率降至40%,ORA-01653错误消除。新增数据文件分布在不同ASM磁盘组,I/O负载更均衡,写入性能提升约15%。
1.4、Oracle 12c+ 新特性:多租户架构下的表空间
12c引入CDB/PDB多租户架构后,表空间管理发生了重要变化:
- 容器结构:CDB级别包含CDB$ROOT、PDB$SEED和多个PDB
- PDB表空间:每个PDB拥有独立的SYSTEM、SYSAUX、TEMP、UNDO表空间(12.1中UNDO共享,12.2+可独立)
- 隔离性:PDB之间表空间完全隔离,互不影响
-- 在PDB中创建表空间 ALTER SESSION SET CONTAINER = pdb_sales; CREATE TABLESPACE pdb_sales_data DATAFILE '+DATA' SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 20G; -- 跨PDB查询表空间使用率 SELECT p.name pdb_name, t.tablespace_name, ROUND(t.bytes/1024/1024, 0) total_mb, ROUND(NVL(f.free_bytes,0)/1024/1024, 0) free_mb, ROUND((t.bytes - NVL(f.free_bytes,0)) / t.bytes * 100, 1) used_pct FROM cdb_tablespaces t JOIN v$containers p ON t.con_id = p.con_id LEFT JOIN (SELECT con_id, tablespace_name, SUM(bytes) free_bytes FROM cdb_free_space GROUP BY con_id, tablespace_name) f ON t.con_id = f.con_id AND t.tablespace_name = f.tablespace_name ORDER BY p.name, t.tablespace_name;