Oracle存储结构

Oracke存储结构

块中表行数据的存储

在Oracle数据库块中,表行数据的存储主要涉及以下几个结构:

  1. 数据块头部
  • 包含块的元数据,如块号,空闲空间指针等。
  1. 行目录
  • 存储每个块内所有行的起始偏移地址。
  1. 表行数据
  • 实际存储表行数据的区域。
  1. 空闲列表指针
  • 指向块内未使用区域的链表。
  1. 行冗余信息
  • 一些行存额外冗余信息的可选结构。
  1. 表行目录
  • 每个表有单独的行目录,允许快速访问行。
  1. 碎片化的空闲空间
  • 块中的碎片化空闲空间无法直接重用。
  1. 仅完整块写入磁盘
  • 修改会产生脏块,直到刷新前仍在缓冲区中。
  1. 控制文件记录文件和块
  • 控制文件中维护每个块的使用信息。

了解这些结构可以帮助分析和诊断存储问题。

数据存储模型

Oracle数据库采用了一种分层的数据逻辑存储模型,主要包括以下结构:

  • 数据块:磁盘上存储的最小物理单元。

  • 扩展区:多个连续数据块组成的存储分配单元。

  • 段:具有共同属性的存储对象的逻辑存储单元。

  • 数据文件:操作系统上的物理文件,存储数据库数据块。

  • 表空间:由一个或多个数据文件组成,是逻辑存储区域。

  • 分区:大对象在表空间内的逻辑分组。

  • 块:操作系统读写的最小物理单位。

  • 缓冲区高速缓存:缓存数据块,加速访问速度。

  • 内存结构:存储共享数据的SGA和会话数据的PGA。

  • 进程:访问存储结构的数据库进程。

这种模型实现了数据的有效存储和访问。

段、区间、块和行

在Oracle 数据库的物理存储结构中,段、区间、块和行的关系是:

  • 段(Segment):
    存储有相同属性的数据库对象的逻辑存储单元。一个段由一个或多个扩展区组成。

  • 扩展区(Extent):
    由多个连续的数据块组成的区间。扩展区是Oracle分配空间的基本单位。

  • 数据块(Data Block):
    数据库物理存储的基本单元,每个块对应一个OS块。块是Oracle进行I/O的基本单位。

  • 行(Row):
    存储在数据块内的表记录或索引记录。每个块可以存储多个行数据。

段是逻辑存储结构,由一个或多个物理存储的扩展区组成。扩展区将数据块进行聚集存储,而块中存储数据库对象的实际数据行记录。这个分层模型支持了Oracle的存储管理。

创建和管理表空间

创建表空间

在Oracle数据库中可以通过以下步骤创建一个新的表空间:

  1. 以SYSDBA系统权限登录SQLPlus。

  2. 创建包含表空间的datafile数据文件。

create datafile '/ora_data/ts_1.dbf' size 100M;

  1. 创建表空间,并指定datafile文件。

create tablespace ts_1 datafile '/ora_data/ts_1.dbf' size 100M;

  1. 设置表空间的关键属性,如日志模式、区块大小等。

alter tablespace ts_1 logging;

alter tablespace ts_1 add datafile '/ora_data/ts_2.dbf' size 100M;

  1. 创建用户并指定默认表空间为新建的表空间。

create user test identified by test default tablespace ts_1;

  1. 向用户授予必要的访问权限。

grant create session, create table to test;

  1. 可以使用SQL语句查询DBA_TABLESPACES和DBA_DATA_FILES等数据字典视图确认表空间创建情况。

新建表空间后,用户可以在其中创建数据库对象如表、索引等。

更改表空间

在Oracle数据库中可以通过以下方式更改存在的表空间:

  1. 增加数据文件 - 使用ALTER TABLESPACE ADD DATAFILE命令增加表空间的新的数据文件。

  2. 删除数据文件 - 使用ALTER TABLESPACE DROP DATAFILE命令删除表空间的某个数据文件。

  3. 修改表空间属性 - 使用ALTER TABLESPACE命令修改表空间的关键属性,如表空间类型、日志模式等。

  4. 重新命名表空间 - 使用RENAME命令重命名表空间的名称。

  5. 变更表空间状态 - 使用ONLINE/OFFLINE命令设置表空间是否可访问。

  6. 移动表空间 - 使用MOVE命令移动表空间所关联的数据文件位置。

  7. 压缩表空间 - 使用ALTER TABLESPACE...COMPRESS命令压缩表空间节省空间。

  8. 读写模式 - 使用READ ONLY设置表空间只读,或READ WRITE设置可读写。

  9. 块大小 - 使用ALLOCATION UNIT大小设置表空间的块大小。

  10. 自动扩展 - 设置表空间自动扩展的文件增量大小。

合理调整表空间的配置,可以优化空间使用、性能以及管理效率。

删除表空间

在Oracle数据库中可以通过以下步骤安全删除一个表空间:

  1. 将表空间设置为脱机模式:
    alter tablespace tablespace_name offline;

  2. 将表空间中的所有对象删除或转移到其他表空间。

  3. 将表空间设置为只读模式:
    alter tablespace tablespace_name read only;

  4. 再次将表空间设置为脱机模式以确保无连接:
    alter tablespace tablespace_name offline;

  5. 删除表空间的数据库文件:
    drop datafile 'datafile_name';

  6. 当表空间没有任何数据文件后,可以删除表空间:
    drop tablespace tablespace_name;

  7. 在执行完整的删除过程后,确认相关系统表中不存在表空间信息。

  8. 不要删除SYSTEM和其他系统表空间。

正确删除不再使用的表空间,可以释放存储空间,并简化数据库的管理。

区间管理

Oracle数据库通过区间(Extent)来进行存储分配和管理,主要涉及以下方面:

  1. 初始化参数EXTENT_MANAGEMENT - 确定存储分配使用字典管理或本地管理。

  2. EXTENT大小 - 创建表空间时通过设置EXTENT大小控制区间大小。

  3. 本地BITMAP - 本地位图记录表空间的extent使用情况。

  4. 区间分配 - 对象扩张时以extent为单位分配存储空间。

  5. 统一空间管理 - 通过extent实现表空间内部的统一空间管理。

  6. 空间请求与分配 - 段向表空间的extent申请与分配请求。

  7. 块读取 - 区间管理不会影响以块为单位的读取。

  8. 快照TOO_MANY_EXTENTS - 可以监控异常过多的extent情况。

  9. PCTINCREASE - 段自动扩展的百分比。

  10. 碎片整理 - 重建段可以减少因自动扩展产生的碎片。

合理利用区间机制,可以有效实现Oracle的空间管理。

管理段空间

在Oracle数据库中可以通过以下方式管理段空间:

  1. 监控空间使用情况 - 查询DBA_SEGMENTS视图获取段空间信息。

  2. 设置自动扩展 - 使用PCTINCREASE自动扩展段空间。

  3. 手动扩展 - 使用ALTER TABLE XXX ALLOCATE EXTENT指定扩展大小。

  4. 收缩段空间 - 使用ALTER TABLE XXX DEALLOCATE UNUSED SPACE收回未使用空间。

  5. 重建段 - 使用ALTER TABLE XXX MOVE进行碎片整理,释放空间。

  6. 分区 - 通过分区大对象减少单个段的空间占用。

  7. 压缩表 - 使用表压缩特性减少存储需求。

  8. 增加文件 - 为表空间增加数据文件扩充总空间。

  9. 调整PCTFREE、PCTUSED - 适当调节数据块中空闲空间比例。

  10. 删除过期数据 - 清理不再需要的历史数据释放空间。

合理管理段的存储空间,可以优化数据库空间使用和系统性能。

OMF

OMF(Oracle 管理文件)是Oracle自动管理表空间、数据文件及其命名的特性,具有以下主要优点:

  1. 自动管理命名 - OMF自动基于模板命名文件。

  2. 简化管理 - DBA无需手动管理文件。

  3. 支持大量文件 - OMF可轻松管理数千个数据文件。

  4. 自动扩展 - 数据文件可以自动增加大小。

  5. 方便表空间添加文件 - 易于扩展表空间的文件。

  6. 逻辑管理 - 以表空间为中心进行管理。

  7. 增强可靠性 - 丢失的数据文件可自动重新创建。

  8. 加快恢复 - OMF文件易于识别,利于恢复。

  9. IO均衡 - OMF实现数据文件均衡IO负载。

  10. 默认启用 - Oracle 12c默认启用OMF特性。

OMF大幅简化了Oracle数据库的文件和存储管理。

Oracle数据库服务器自动管理空间的方法

段空间的分配

在Oracle数据库中,段空间的分配主要遵循以下原则:

  1. 以EXTENT为单位分配 - 段向表空间申请空间时,以EXTENT为基本单位。

  2. 根据需求自动分配 - 当现有EXTENT用完,会自动分配新EXTENT。

  3. 字典管理或本地管理 - 通过数据字典或位图记录空间分配情况。

  4. 初次分配EXTENT个数 - 创建段时通过MINEXTENTS指定初始分配的EXTENT数。

  5. 自动扩展比例 - 通过PCTINCREASE设置自动扩展的百分比。

  6. 最大EXTENT限制 - 通过MAXEXTENTS设定段扩展的上限。

  7. 段类型不同 - 不同的段类型有不同的空间分配算法。

  8. 空间不足时报错 - 当表空间空间不足无法分配时会报错。

  9. 手动扩展分配 - 可以通过ALTER TABLE手动指定分配EXTENT。

  10. 回退保留空间 - 删除对象时,表空间不会立即回收空间。

空间分配直接影响存储管理的效率和性能。

自动管理段空间

在Oracle数据库中可以通过以下方式实现自动管理段空间:

  1. 设置PCTINCREASE参数 - 段扩展时的默认增长百分比。

  2. 设置SEGMENT_SPACE_MANAGEMENT为AUTO - 启用表空间的自动空间管理。

  3. 设置segment monitoring - 启用对段空间使用的监控。

  4. 启用自动扩展表 - 使用AUTOALLOCATE扩展表。

  5. 规划初始分配大小 - 根据预估合理配置初始空间分配。

  6. 设置合适的最大EXTENT数 - 避免不必要的扩展开销。

  7. 增加表空间数据文件 - 确保表空间有足够扩展空间。

  8. 配置警告阈值 - 达到阈值时警告或拒绝操作。

  9. 分区大对象 - 将对象拆分为多个分区独立管理。

  10. 定期检测空间使用情况 - 发现异常空间使用的段。

自动管理能大幅减轻DBA的工作量,并优化空间使用。

使用压缩节省空间

在Oracle数据库中,可以通过使用数据压缩技术节省存储空间,主要方式包括:

  1. 表压缩 - 在创建表时指定COMPRESS子句启用列级压缩。

  2. 分区压缩 - 对大表分区启用COMPRESS子句。

  3. 索引压缩 - 对索引对象启用压缩,减少索引空间。

  4. 存档日志压缩 - 设置数据库为ARCHIVELOG模式并启用日志压缩。

  5. RMAN备份压缩 - 在RMAN备份时指定压缩选项。

  6. 数据泵压缩 - 在导出/导入时启用数据泵的压缩功能。

  7. 未使用空间压缩 - 将缩短表中未使用的行空间。

  8. 碎片压缩 - 对表空间中的碎片空间进行压缩。

  9. OLTP表压缩 - 对频繁DML操作的表采用高级行压缩。

  10. 只读表压缩 - 对静态只读表启用高级COMPRESS。

合理应用压缩技术,可以显著降低存储成本。

积极监控和管理表空间的使用

积极监控和管理表空间的使用情况,可以帮助提高Oracle数据库的性能和稳定性,主要措施包括:

  1. 定期查看表空间使用报告,包括数据文件、表空间空间使用率等。

  2. 设置表空间阈值报警,当使用率达到阈值时发送通知。

  3. 监控表空间的碎片状况,做碎片整理和重建操作。

  4. 根据应用高峰低峰周期合理调整表空间大小。

  5. 将不活跃和归档数据移到低成本存储。

  6. 避免单个表空间存放所有对象,按应用逻辑区分表空间。

  7. 将只读表空间设置为只读,避免无谓的redo日志。

  8. 设置表空间自动扩展避免不必要的维护工作。

  9. 采用分区技术避免单一大表空间产生的瓶颈。

  10. 采用OMF等自动管理机制减轻DBA管理工作量。

合理监控和管理对于优化表空间的使用至关重要。

使用Segment Advisor

在Oracle数据库中可以使用Segment Advisor进行段空间分析和优化,主要步骤包括:

  1. 启用段监控功能,跟踪段空间使用信息。

  2. 收集统计信息, updating staleness。

  3. 执行 Segment Advisor 分析任务:

EXEC DBMS_ADVISOR.QUICK_TUNE('SEGMENT_MANAGEMENT');

  1. 查看分析报告,识别空间使用异常的段。

  2. 根据建议,重建或压缩这些段来优化空间使用。

  3. 也可以自定义分析任务,指定分析的表空间或段 Schemas。

  4. 定期执行Segment Advisor任务,发现空间使用趋势。

  5. 将分析结果与AWR报告关联,辅助故障排查。

  6. 增加表空间数据文件,降低空间使用比例。

  7. 结合使用其他Advisor,如SQL Tuning Advisor。

Segment Advisor让优化存储管理变得更加智能化和自动化。

使用段收缩功能从表和索引中回收浪费了的空间

在Oracle数据库中,可以通过段收缩功能回收表和索引中的未使用和碎片化的空间,主要步骤包括:

  1. 启用表和索引的段收缩功能:
    ALTER TABLE table_name ENABLE ROW MOVEMENT;

  2. 收集表和索引统计信息,确保统计信息是最新的。

  3. 执行收缩操作:
    ALTER TABLE table_name SHRINK SPACE;

  4. 对索引执行收缩:
    ALTER INDEX index_name SHRINK SPACE;

  5. 设置触发自动段收缩的阈值,如空间使用率低于某值时自动收缩。

  6. 监控收缩操作是否出现失败或错误。

  7. 收缩后检查回收的空间大小,以及表和索引的空间使用率。

  8. 定期执行收缩,避免空间碎片和浪费。

  9. 将收缩操作integrate到维护脚本,自动化执行。

  10. 收缩互联网表后,对其统计信息采样以更新统计信息。

通过定期执行段收缩,可以持续优化Oracle数据库的空间使用效率。

管理可恢复空间的分配

在Oracle数据库中,可以通过以下方式管理可恢复空间的分配:

  1. 设置管理可恢复空间的表空间,如UNDOTBS。

  2. 根据事务需求,合理规划UNDOTBS的初始大小。

  3. 监控UNDOTBS的空间使用和扩展情况。

  4. 根据工作负载历史统计,计算UNDO空间的最佳大小。

  5. 设置自动扩展以防止由于空间不足造成的失败。

  6. 配置回退段的最佳大小,数量保证不会有过多争用。

  7. 利用staleness机制定期收集统计信息。

  8. 采用Automatic Memory Management自动管理内存。

  9. 配置警报阈值预警UNDO空间不足。

  10. 采用压缩等技术减少UNDO空间的消耗。

  11. 定期清理过期和不再需要的回退段。

合理的可恢复空间有助于保证事务完整性和一致性。

posted @ 2023-07-27 16:59  BBBone  阅读(88)  评论(0编辑  收藏  举报