【Oracle数据库指南】第21篇:Oracle表空间管理详解
上一篇【第20篇】命令行方式创建Oracle数据库——手动建库全流程详解
下一篇【第22篇】Oracle用户与权限管理详解
摘要
表空间(Tablespace)是Oracle数据库中用于存储数据库对象的逻辑存储容器,是数据库逻辑结构与物理结构之间的关键桥梁。本文详细讲解表空间的创建、修改、删除、监控与维护,涵盖数据文件管理、大文件表空间、表空间迁移等实用技能,帮助DBA掌握Oracle存储管理的核心。
一、表空间概述
1.1 什么是表空间
表空间是Oracle数据库中最高级别的逻辑存储结构,用于存储表、索引、视图等数据库对象。一个数据库可以包含多个表空间,每个表空间由一个或多个数据文件(Data File)组成。
数据库(Database) ├── SYSTEM 表空间(系统表空间) ├── SYSAUX 表空间(辅助系统表空间) ├── UNDOTBS1 表空间(撤销表空间) ├── TEMP 表空间(临时表空间) ├── USERS 表空间(用户数据表空间) └── INDEX_TS 表空间(索引表空间) ├── datafile01.dbf ├── datafile02.dbf └── datafile03.dbf1.2 表空间的类型
| 表空间类型 | 用途 | 是否必需 |
|---|---|---|
| SYSTEM | 存储数据字典、系统表、PL/SQL包 | 必需 |
| SYSAUX | 存储Oracle可选组件(AWR、EM等) | 必需(10g+) |
| UNDO | 存储撤销数据(回滚段) | 必需 |
| TEMP | 存储临时数据(排序、哈希连接) | 必需 |
| 用户表空间 | 存储用户数据 | 必需(自定义) |
| 只读表空间 | 存储历史数据,只读访问 | 可选 |
| 大文件表空间 | 单个大文件(最大128TB) | 可选 |
| 撤销表空间 | UNDO数据管理 | 必需 |
二、创建表空间
2.1 创建普通表空间
-- 基本语法CREATETABLESPACEtablespace_name DATAFILE'path/file_name.dbf'SIZE size[REUSE][AUTOEXTENDON[NEXTsize][MAXSIZE size|UNLIMITED]][EXTENT MANAGEMENTLOCAL[UNIFORM SIZE size|AUTOALLOCATE]][SEGMENT SPACE MANAGEMENT AUTO|MANUAL][BLOCKSIZE size][LOGGING|NOLOGGING][ONLINE|OFFLINE];-- 示例1:创建用户数据表空间CREATETABLESPACEusers_data DATAFILE'/u01/oradata/testdb/users01.dbf'SIZE500M AUTOEXTENDONNEXT100M MAXSIZE10G EXTENT MANAGEMENTLOCALSEGMENT SPACE MANAGEMENT AUTO LOGGING ONLINE;-- 示例2:创建索引表空间CREATETABLESPACEusers_index DATAFILE'/u01/oradata/testdb/users_idx01.dbf'SIZE300M AUTOEXTENDONNEXT50M MAXSIZE5G EXTENT MANAGEMENTLOCALUNIFORM SIZE1M SEGMENT SPACE MANAGEMENT AUTO;2.2 参数详解
| 参数 | 说明 |
|---|---|
DATAFILE | 指定数据文件路径和大小 |
AUTOEXTEND ON | 启用自动扩展 |
NEXT | 每次扩展的大小 |
MAXSIZE | 最大文件大小 |
EXTENT MANAGEMENT LOCAL | 本地管理的区(推荐) |
UNIFORM SIZE | 统一区大小(性能稳定) |
AUTOALLOCATE | 自动分配区大小(默认) |
SEGMENT SPACE MANAGEMENT AUTO | 自动段空间管理(ASSM,推荐) |
LOGGING | 记录重做日志(默认) |
NOLOGGING | 不记录重做日志(提高性能) |
三、修改表空间
3.1 添加数据文件
-- 为表空间添加新的数据文件ALTERTABLESPACEusers_dataADDDATAFILE'/u01/oradata/testdb/users02.dbf'SIZE500M AUTOEXTENDONNEXT100M MAXSIZE10G;-- 添加多个数据文件ALTERTABLESPACEusers_dataADDDATAFILE'/u02/oradata/testdb/users03.dbf'SIZE500M,'/u03/oradata/testdb/users04.dbf'SIZE500M;3.2 调整数据文件大小
-- 手动调整数据文件大小ALTERDATABASEDATAFILE'/u01/oradata/testdb/users01.dbf'RESIZE800M;-- 启用自动扩展ALTERDATABASEDATAFILE'/u01/oradata/testdb/users01.dbf'AUTOEXTENDONNEXT100M MAXSIZE20G;-- 禁用自动扩展ALTERDATABASEDATAFILE'/u01/oradata/testdb/users01.dbf'AUTOEXTENDOFF;3.3 修改表空间状态
-- 表空间脱机(维护时使用)ALTERTABLESPACEusers_data OFFLINE;-- 表空间联机ALTERTABLESPACEusers_data ONLINE;-- 表空间只读(用于历史数据)ALTERTABLESPACEusers_dataREADONLY;-- 表空间可读写ALTERTABLESPACEusers_dataREADWRITE;-- 重命名表空间ALTERTABLESPACEusers_dataRENAMETOuser_data_ts;四、删除表空间
-- 删除空表空间(不包含数据文件)DROPTABLESPACEusers_data;-- 删除表空间及其数据文件DROPTABLESPACEusers_data INCLUDING CONTENTSANDDATAFILES;-- 删除表空间,保留数据文件DROPTABLESPACEusers_data INCLUDING CONTENTS;-- 删除表空间,同时删除关联约束DROPTABLESPACEusers_data INCLUDING CONTENTSANDDATAFILESCASCADECONSTRAINTS;⚠️注意事项:
- 不能删除
SYSTEM、SYSAUX、TEMP、UNDO表空间 - 删除前确保表空间中没有活跃对象
- 建议先备份再删除
五、数据文件管理
5.1 查询数据文件信息
-- 查看所有数据文件SELECTfile_name,tablespace_name,bytes/1024/1024ASsize_mb,autoextensible,maxbytes/1024/1024ASmax_mbFROMdba_data_filesORDERBYtablespace_name;-- 查看数据文件使用率SELECTd.tablespace_name,d.bytes/1024/1024AStotal_mb,(d.bytes-f.bytes)/1024/1024ASused_mb,f.bytes/1024/1024ASfree_mb,ROUND((d.bytes-f.bytes)/d.bytes*100,2)ASused_pctFROM(SELECTtablespace_name,SUM(bytes)ASbytesFROMdba_data_filesGROUPBYtablespace_name)d,(SELECTtablespace_name,SUM(bytes)ASbytesFROMdba_free_spaceGROUPBYtablespace_name)fWHEREd.tablespace_name=f.tablespace_name(+);-- 查看数据文件I/O统计SELECTfile_name,phyrds,phywrts,readtim,writetimFROMv$filestat s,dba_data_files fWHEREs.file# = f.file_id;5.2 移动数据文件
-- 方法1:使用ALTER DATABASE(需要数据库MOUNT状态)-- 步骤1:关闭数据库SHUTDOWNIMMEDIATE;-- 步骤2:在操作系统中移动数据文件-- mv /u01/oradata/testdb/users01.dbf /u02/oradata/testdb/users01.dbf-- 步骤3:启动到MOUNT状态STARTUP MOUNT;-- 步骤4:重命名数据文件ALTERDATABASERENAMEFILE'/u01/oradata/testdb/users01.dbf'TO'/u02/oradata/testdb/users01.dbf';-- 步骤5:打开数据库ALTERDATABASEOPEN;-- 方法2:使用ALTER TABLESPACE(在线操作)-- 步骤1:表空间脱机ALTERTABLESPACEusers_data OFFLINE;-- 步骤2:在操作系统中移动数据文件-- mv /u01/oradata/testdb/users01.dbf /u02/oradata/testdb/users01.dbf-- 步骤3:重命名数据文件ALTERTABLESPACEusers_dataRENAMEDATAFILE'/u01/oradata/testdb/users01.dbf'TO'/u02/oradata/testdb/users01.dbf';-- 步骤4:表空间联机ALTERTABLESPACEusers_data ONLINE;六、大文件表空间(Bigfile Tablespace)
6.1 大文件表空间概述
大文件表空间(Bigfile Tablespace)是Oracle 10g引入的特性,单个数据文件最大可达128TB(使用8KB块大小)。
优点:
- 减少数据文件数量
- 简化存储管理
- 提高检查点性能
缺点:
- 单个文件损坏影响整个表空间
- 需要支持大文件的文件系统
6.2 创建大文件表空间
-- 创建大文件表空间CREATEBIGFILETABLESPACEbig_data DATAFILE'/u01/oradata/testdb/bigdata01.dbf'SIZE10G AUTOEXTENDONNEXT1G MAXSIZE UNLIMITED EXTENT MANAGEMENTLOCALSEGMENT SPACE MANAGEMENT AUTO;-- 查看大文件表空间SELECTtablespace_name,bigfileFROMdba_tablespacesWHEREbigfile='YES';七、临时表空间管理
7.1 创建临时表空间
-- 创建临时表空间CREATETEMPORARYTABLESPACEtemp2 TEMPFILE'/u01/oradata/testdb/temp02.dbf'SIZE500M AUTOEXTENDONNEXT100M MAXSIZE5G EXTENT MANAGEMENTLOCALUNIFORM SIZE1M;-- 创建大文件临时表空间CREATEBIGFILETEMPORARYTABLESPACEtemp_big TEMPFILE'/u01/oradata/testdb/temp_big01.dbf'SIZE10G;7.2 临时表空间组
-- 创建临时表空间组ALTERTABLESPACEtempTABLESPACEGROUPtemp_group1;ALTERTABLESPACEtemp2TABLESPACEGROUPtemp_group1;-- 查看临时表空间组SELECT*FROMdba_tablespace_groups;-- 将临时表空间从组中移除ALTERTABLESPACEtemp2TABLESPACEGROUP'';7.3 管理临时文件
-- 添加临时文件ALTERTABLESPACEtempADDTEMPFILE'/u02/oradata/testdb/temp03.dbf'SIZE500M;-- 调整临时文件大小ALTERDATABASETEMPFILE'/u01/oradata/testdb/temp01.dbf'RESIZE800M;-- 删除临时文件ALTERDATABASETEMPFILE'/u01/oradata/testdb/temp01.dbf'DROPINCLUDING DATAFILES;八、撤销表空间管理
8.1 创建撤销表空间
-- 创建撤销表空间CREATEUNDOTABLESPACEundotbs2 DATAFILE'/u01/oradata/testdb/undotbs02.dbf'SIZE500M AUTOEXTENDONNEXT100M MAXSIZE10G;-- 切换撤销表空间ALTERSYSTEMSETundo_tablespace=undotbs2 SCOPE=BOTH;8.2 监控撤销表空间
-- 查看撤销表空间信息SELECTtablespace_name,status,contentsFROMdba_tablespacesWHEREcontents='UNDO';-- 查看撤销数据使用情况SELECTTO_CHAR(begin_time,'HH24:MI')AStime,undoblks,txncount,maxquerylenFROMv$undostatORDERBYbegin_timeDESC;-- 查看当前撤销表空间配置SHOWPARAMETER undo;九、表空间监控与维护
9.1 空间使用率监控
-- 表空间空间使用率(详细版)SELECTa.tablespace_name,ROUND(a.total_bytes/1024/1024)AStotal_mb,ROUND(NVL(b.free_bytes,0)/1024/1024)ASfree_mb,ROUND((a.total_bytes-NVL(b.free_bytes,0))/1024/1024)ASused_mb,ROUND((a.total_bytes-NVL(b.free_bytes,0))/a.total_bytes*100,2)ASused_pctFROM(SELECTtablespace_name,SUM(bytes)AStotal_bytesFROMdba_data_filesGROUPBYtablespace_name)aLEFTJOIN(SELECTtablespace_name,SUM(bytes)ASfree_bytesFROMdba_free_spaceGROUPBYtablespace_name)bONa.tablespace_name=b.tablespace_nameORDERBYused_pctDESC;9.2 表空间碎片化检查
-- 检查表空间碎片化SELECTtablespace_name,COUNT(*)ASfragments,MAX(bytes)/1024/1024ASlargest_chunk_mb,MIN(bytes)/1024ASsmallest_chunk_kbFROMdba_free_spaceGROUPBYtablespace_nameHAVINGCOUNT(*)>10ORDERBYfragmentsDESC;9.3 表空间IO统计
-- 表空间I/O统计SELECTdf.tablespace_name,fs.phyrdsASreads,fs.phywrtsASwrites,ROUND(fs.readtim/DECODE(fs.phyrds,0,1,fs.phyrds),2)ASavg_read_time_ms,ROUND(fs.writetim/DECODE(fs.phywrts,0,1,fs.phywrts),2)ASavg_write_time_msFROMv$filestat fsJOINdba_data_files dfONfs.file# = df.file_idORDERBYfs.phyrds+fs.phywrtsDESC;十、表空间迁移与传输
10.1 可传输表空间(Transportable Tablespace)
-- 步骤1:检查表空间是否自包含EXECDBMS_TTS.TRANSPORT_SET_CHECK('USERS_DATA',TRUE);SELECT*FROMtransport_set_violations;-- 步骤2:将表空间设为只读ALTERTABLESPACEusers_dataREADONLY;-- 步骤3:导出表空间元数据expdp system/password DIRECTORY=dpump_dirDUMPFILE=users_meta.dmp TRANSPORT_TABLESPACES=users_data-- 步骤4:复制数据文件到目标服务器-- 步骤5:在目标数据库导入impdp system/password DIRECTORY=dpump_dirDUMPFILE=users_meta.dmp TRANSPORT_DATAFILES='/u01/oradata/testdb/users01.dbf'十一、最佳实践
11.1 表空间设计原则
- 分离不同类型数据:表数据、索引、LOB分别使用不同表空间
- 使用本地管理:
EXTENT MANAGEMENT LOCAL(默认) - 使用ASSM:
SEGMENT SPACE MANAGEMENT AUTO - 合理设置自动扩展:避免空间不足,但也要防止无限扩展
- 多数据文件:分散I/O,提高并行度
11.2 空间监控告警
-- 创建空间监控脚本-- 当表空间使用率超过90%时告警SELECTa.tablespace_name,ROUND((a.total_bytes-NVL(b.free_bytes,0))/a.total_bytes*100,2)ASused_pctFROM(SELECTtablespace_name,SUM(bytes)AStotal_bytesFROMdba_data_filesGROUPBYtablespace_name)aLEFTJOIN(SELECTtablespace_name,SUM(bytes)ASfree_bytesFROMdba_free_spaceGROUPBYtablespace_name)bONa.tablespace_name=b.tablespace_nameWHEREROUND((a.total_bytes-NVL(b.free_bytes,0))/a.total_bytes*100,2)>90;11.3 定期维护任务
-- 1. 定期检查表空间使用率(每天)-- 2. 定期收缩数据文件(每周)ALTERDATABASEDATAFILE'/u01/oradata/testdb/users01.dbf'RESIZE800M;-- 3. 定期重建索引(减少碎片)ALTERINDEXidx_emp_name REBUILDTABLESPACEusers_index;-- 4. 定期收集统计信息EXECDBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP');十二、总结
表空间管理的核心要点:
- 创建表空间:合理规划数据文件大小、自动扩展、区管理
- 修改表空间:添加数据文件、调整大小、修改状态
- 数据文件管理:移动、重命名、监控I/O
- 特殊表空间:大文件、临时、撤销表空间
- 监控维护:空间使用率、碎片化、I/O性能
- 最佳实践:分离数据、使用本地管理、定期监控
上一篇【第20篇】命令行方式创建Oracle数据库——手动建库全流程详解
下一篇【第22篇】Oracle用户与权限管理详解
参考资料
- 《Oracle 11g数据库管理员指南》— 刘宪军著
- Oracle官方文档:Database Administrator’s Guide - Managing Tablespaces
- Oracle官方文档:Database Concepts - Tablespaces
