Skip to content

Oracle 表空间设计优化

表空间类型

永久表空间

适用场景

  • 存储永久数据:存储表、索引、存储过程等永久数据库对象
  • 常规应用:大多数业务应用的数据存储
  • 默认表空间:数据库默认的表空间类型

设计要点

  • 空间管理:使用本地管理表空间(LMT)
  • 段空间管理:使用自动段空间管理(ASSM)
  • 块大小:根据数据类型和访问模式选择合适的块大小
  • 扩展管理:使用自动扩展或统一扩展大小

临时表空间

适用场景

  • 存储临时数据:存储排序、分组、连接等操作产生的临时数据
  • 大型查询:需要大量临时空间的大型查询
  • 索引创建:创建大型索引时使用

设计要点

  • 临时表空间组:为不同类型的工作负载创建多个临时表空间组
  • 大小设置:根据最大并发查询的临时空间需求设置大小
  • 自动扩展:启用自动扩展,避免临时空间不足
  • 文件分布:将临时文件分布到不同的物理磁盘,提高 I/O 并行度

UNDO 表空间

适用场景

  • 存储回滚数据:存储事务回滚所需的数据
  • 一致性读取:支持数据库的一致性读取
  • 事务回滚:支持事务的回滚操作

设计要点

  • 大小设置:根据最大事务的回滚数据需求设置大小
  • 保留策略:根据业务需求设置合适的保留策略
  • 自动扩展:启用自动扩展,避免 UNDO 空间不足
  • 多文件:使用多个 UNDO 文件,分布到不同的物理磁盘

大文件表空间

适用场景

  • 大型数据库:存储大量数据的大型数据库
  • 简化管理:减少数据文件数量,简化管理
  • ASM 环境:在 ASM 环境中使用,充分利用 ASM 的优势

设计要点

  • 大小设置:根据存储需求设置合适的大小
  • 自动扩展:启用自动扩展,避免空间不足
  • 文件系统:确保文件系统支持大文件
  • 备份策略:为大文件表空间制定合适的备份策略

表空间存储参数

块大小

选择原则

  • 默认块大小:8KB,适用于大多数应用
  • 小型块:4KB,适用于小型数据和频繁访问的数据
  • 大型块:16KB、32KB,适用于大型数据和批量操作

最佳实践

  • 一致性:保持数据库中块大小的一致性
  • 特殊需求:只为特殊需求创建非标准块大小的表空间
  • 缓存设置:为不同块大小的表空间设置相应的缓冲区缓存

区管理

本地管理表空间(LMT)

  • 优点:减少字典争用,提高性能,管理简单
  • 适用场景:所有新创建的表空间
  • 设置方法
    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL;

统一区大小

  • 适用场景:存储大小相近的对象
  • 设置方法
    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

自动区大小

  • 适用场景:存储大小不一的对象
  • 设置方法
    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

段空间管理

自动段空间管理(ASSM)

  • 优点:减少段头部争用,提高并发性,管理简单
  • 适用场景:大多数表空间
  • 设置方法
    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M SEGMENT SPACE MANAGEMENT AUTO;

手动段空间管理(MSSM)

  • 适用场景:特殊场景,如需要精确控制空间使用的场景
  • 设置方法
    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M SEGMENT SPACE MANAGEMENT MANUAL;

压缩设置

表压缩

  • 适用场景:不经常更新的表,如历史数据、归档数据
  • 设置方法
    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M DEFAULT COMPRESS;

高级压缩

  • 适用场景:需要更高压缩率的场景
  • 设置方法
    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M DEFAULT COMPRESS FOR OLTP;

表空间布局

按功能分离

  • 系统表空间:存储系统数据字典和系统对象
  • 用户表空间:存储用户数据和对象
  • 索引表空间:存储索引数据
  • LOB 表空间:存储 LOB 数据
  • 临时表空间:存储临时数据
  • UNDO 表空间:存储回滚数据

按访问模式分离

  • 高频访问表空间:存储频繁访问的数据,放在高速存储上
  • 低频访问表空间:存储不频繁访问的数据,放在普通存储上
  • 归档表空间:存储归档数据,放在低成本存储上

按数据类型分离

  • 小型数据表空间:存储小型数据表
  • 大型数据表空间:存储大型数据表
  • 索引表空间:存储索引
  • LOB 表空间:存储 LOB 数据

最佳实践

  • 物理分离:将不同表空间的数据文件分布到不同的物理磁盘
  • I/O 均衡:平衡不同表空间的 I/O 负载
  • 备份策略:根据表空间的重要性和访问模式制定不同的备份策略
  • 恢复时间:考虑表空间的恢复时间目标(RTO)

表空间大小规划

容量估算

  • 历史数据:分析历史数据增长趋势
  • 业务需求:根据业务增长预测未来数据量
  • 索引开销:考虑索引占用的空间(一般为数据大小的 20-30%)
  • 临时空间:考虑最大并发查询的临时空间需求
  • UNDO 空间:考虑最大事务的回滚数据需求

扩展策略

  • 自动扩展

    • 优点:避免空间不足导致的故障
    • 缺点:可能导致数据文件碎片
    • 最佳实践:设置合理的初始大小和扩展增量,设置最大大小限制
  • 手动扩展

    • 优点:更好地控制空间使用,减少碎片
    • 缺点:需要手动监控和管理
    • 最佳实践:定期监控空间使用,提前规划扩展

监控与预警

  • 空间监控:定期监控表空间使用情况
  • 预警设置:设置空间使用预警阈值(如 80%)
  • 自动化:使用脚本或工具自动化空间监控和预警
  • 报告生成:定期生成空间使用报告,分析增长趋势

表空间优化

碎片整理

表碎片整理

  • 移动表

    sql
    ALTER TABLE table_name MOVE;
  • 重建索引

    sql
    ALTER INDEX index_name REBUILD;

表空间碎片整理

  • 导出/导入:使用数据泵导出/导入表空间
  • 表空间重组:创建新表空间,移动对象到新表空间
  • 收缩数据文件
    sql
    ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' RESIZE 500M;

存储优化

  • 压缩:对不经常更新的表启用压缩
  • 分区:对大型表使用分区,提高查询性能和管理效率
  • 段 Advisor:使用段 Advisor 分析和优化段空间使用
  • 自动段空间管理:使用自动段空间管理,减少空间碎片

性能优化

  • I/O 分布:将数据文件分布到不同的物理磁盘,提高 I/O 并行度
  • 异步 I/O:启用异步 I/O,提高 I/O 性能
  • 直接 I/O:对于大型数据操作,使用直接 I/O
  • 缓存设置:根据表空间的访问模式设置合适的缓存参数

表空间管理

创建表空间

  • 基本语法

    sql
    CREATE TABLESPACE tablespace_name 
    DATAFILE 'file_path' SIZE size 
    [AUTOEXTEND ON NEXT next_size MAXSIZE max_size] 
    [EXTENT MANAGEMENT LOCAL [UNIFORM SIZE size | AUTOALLOCATE]] 
    [SEGMENT SPACE MANAGEMENT AUTO | MANUAL];
  • 示例

    sql
    CREATE TABLESPACE users 
    DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M 
    AUTOEXTEND ON NEXT 100M MAXSIZE 2048M 
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE 
    SEGMENT SPACE MANAGEMENT AUTO;

修改表空间

  • 添加数据文件

    sql
    ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 2048M;
  • 调整数据文件大小

    sql
    ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' RESIZE 1000M;
  • 启用/禁用自动扩展

    sql
    ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 2048M;

删除表空间

  • 删除表空间及数据文件

    sql
    DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
  • 删除空表空间

    sql
    DROP TABLESPACE users;

表空间状态管理

  • 在线/离线

    sql
    ALTER TABLESPACE users OFFLINE;
    ALTER TABLESPACE users ONLINE;
  • 只读/可读写

    sql
    ALTER TABLESPACE users READ ONLY;
    ALTER TABLESPACE users READ WRITE;

表空间设计案例

小型应用表空间设计

  • 业务需求:小型应用,数据量不大,并发访问较少
  • 表空间设计
    • SYSTEM 表空间:默认大小
    • SYSAUX 表空间:默认大小
    • USERS 表空间:500M,存储用户数据和索引
    • TEMP 表空间:200M,存储临时数据
    • UNDO 表空间:300M,存储回滚数据

中型应用表空间设计

  • 业务需求:中型应用,数据量中等,有一定的并发访问
  • 表空间设计
    • SYSTEM 表空间:默认大小
    • SYSAUX 表空间:默认大小
    • USERS 表空间:2G,存储用户表数据
    • INDEXES 表空间:1G,存储索引
    • LOB_DATA 表空间:500M,存储 LOB 数据
    • TEMP 表空间:500M,存储临时数据
    • UNDO 表空间:800M,存储回滚数据

大型应用表空间设计

  • 业务需求:大型应用,数据量大,高并发访问
  • 表空间设计
    • SYSTEM 表空间:默认大小
    • SYSAUX 表空间:默认大小
    • USERS 表空间:10G,存储用户表数据
    • INDEXES 表空间:5G,存储索引
    • LOB_DATA 表空间:2G,存储 LOB 数据
    • ARCHIVE 表空间:20G,存储归档数据
    • TEMP 表空间组:多个临时表空间,共 2G
    • UNDO 表空间:2G,存储回滚数据

最佳实践

设计阶段

  • 需求分析:分析业务需求和数据特性,确定表空间设计方案
  • 容量规划:根据数据增长趋势,规划表空间大小
  • 存储规划:根据数据访问模式,规划存储布局
  • 性能考虑:考虑 I/O 性能和访问模式,优化表空间布局

实施阶段

  • 测试验证:在测试环境验证表空间设计的有效性
  • 性能测试:测试表空间设计对数据库性能的影响
  • 监控设置:设置表空间监控和预警
  • 文档记录:详细记录表空间设计和配置

维护阶段

  • 定期监控:定期监控表空间使用情况和性能
  • 空间管理:及时处理表空间空间不足的问题
  • 碎片整理:定期进行表空间碎片整理
  • 优化调整:根据业务变化和性能需求,调整表空间设计

常见问题(FAQ)

Q1: 如何选择合适的表空间类型?

A1: 选择合适的表空间类型的方法:

  • 永久表空间:存储永久数据,如表、索引等
  • 临时表空间:存储临时数据,如排序结果等
  • UNDO 表空间:存储回滚数据,支持事务回滚和一致性读取
  • 大文件表空间:存储大量数据,减少数据文件数量

Q2: 如何确定表空间的大小?

A2: 确定表空间大小的方法:

  • 历史数据分析:分析历史数据增长趋势
  • 业务需求:根据业务增长预测未来数据量
  • 索引开销:考虑索引占用的空间(一般为数据大小的 20-30%)
  • 临时空间:考虑最大并发查询的临时空间需求
  • UNDO 空间:考虑最大事务的回滚数据需求

Q3: 如何优化表空间的 I/O 性能?

A3: 优化表空间 I/O 性能的方法:

  • 数据文件分布:将不同表空间的数据文件分布到不同的物理磁盘
  • 文件系统选择:选择性能良好的文件系统
  • 异步 I/O:启用异步 I/O
  • 直接 I/O:对于大型数据操作,使用直接 I/O
  • 条带化:使用 RAID 条带化,提高 I/O 并行度

Q4: 如何处理表空间碎片?

A4: 处理表空间碎片的方法:

  • 表碎片整理:使用 ALTER TABLE MOVE 命令移动表
  • 索引重建:使用 ALTER INDEX REBUILD 命令重建索引
  • 表空间重组:创建新表空间,移动对象到新表空间
  • 段 Advisor:使用段 Advisor 分析和优化段空间使用
  • 自动段空间管理:使用自动段空间管理,减少空间碎片

Q5: 如何监控表空间使用情况?

A5: 监控表空间使用情况的方法:

  • SQL 查询:使用 SQL 查询监控表空间使用情况
  • Enterprise Manager:使用 OEM 监控表空间使用情况
  • 自动预警:设置表空间使用预警阈值
  • 脚本监控:使用脚本定期监控表空间使用情况
  • 报告生成:定期生成表空间使用报告,分析增长趋势

Q6: 如何规划表空间的备份策略?

A6: 规划表空间备份策略的方法:

  • 重要性:根据表空间的重要性,制定不同的备份策略
  • 访问模式:根据表空间的访问模式,选择合适的备份方法
  • 恢复时间:根据恢复时间目标(RTO),选择合适的备份频率
  • 备份类型:结合完整备份、增量备份和归档日志备份
  • 备份存储:选择合适的备份存储介质和位置
  • 备份验证:定期验证备份的有效性