Oracle存储结构
Oracke存储结构
块中表行数据的存储
在Oracle数据库块中,表行数据的存储主要涉及以下几个结构:
- 数据块头部
- 包含块的元数据,如块号,空闲空间指针等。
- 行目录
- 存储每个块内所有行的起始偏移地址。
- 表行数据
- 实际存储表行数据的区域。
- 空闲列表指针
- 指向块内未使用区域的链表。
- 行冗余信息
- 一些行存额外冗余信息的可选结构。
- 表行目录
- 每个表有单独的行目录,允许快速访问行。
- 碎片化的空闲空间
- 块中的碎片化空闲空间无法直接重用。
- 仅完整块写入磁盘
- 修改会产生脏块,直到刷新前仍在缓冲区中。
- 控制文件记录文件和块
- 控制文件中维护每个块的使用信息。
了解这些结构可以帮助分析和诊断存储问题。
数据存储模型
Oracle数据库采用了一种分层的数据逻辑存储模型,主要包括以下结构:
-
数据块:磁盘上存储的最小物理单元。
-
扩展区:多个连续数据块组成的存储分配单元。
-
段:具有共同属性的存储对象的逻辑存储单元。
-
数据文件:操作系统上的物理文件,存储数据库数据块。
-
表空间:由一个或多个数据文件组成,是逻辑存储区域。
-
分区:大对象在表空间内的逻辑分组。
-
块:操作系统读写的最小物理单位。
-
缓冲区高速缓存:缓存数据块,加速访问速度。
-
内存结构:存储共享数据的SGA和会话数据的PGA。
-
进程:访问存储结构的数据库进程。
这种模型实现了数据的有效存储和访问。
段、区间、块和行
在Oracle 数据库的物理存储结构中,段、区间、块和行的关系是:
-
段(Segment):
存储有相同属性的数据库对象的逻辑存储单元。一个段由一个或多个扩展区组成。 -
扩展区(Extent):
由多个连续的数据块组成的区间。扩展区是Oracle分配空间的基本单位。 -
数据块(Data Block):
数据库物理存储的基本单元,每个块对应一个OS块。块是Oracle进行I/O的基本单位。 -
行(Row):
存储在数据块内的表记录或索引记录。每个块可以存储多个行数据。
段是逻辑存储结构,由一个或多个物理存储的扩展区组成。扩展区将数据块进行聚集存储,而块中存储数据库对象的实际数据行记录。这个分层模型支持了Oracle的存储管理。
创建和管理表空间
创建表空间
在Oracle数据库中可以通过以下步骤创建一个新的表空间:
-
以SYSDBA系统权限登录SQLPlus。
-
创建包含表空间的datafile数据文件。
create datafile '/ora_data/ts_1.dbf' size 100M;
- 创建表空间,并指定datafile文件。
create tablespace ts_1 datafile '/ora_data/ts_1.dbf' size 100M;
- 设置表空间的关键属性,如日志模式、区块大小等。
alter tablespace ts_1 logging;
alter tablespace ts_1 add datafile '/ora_data/ts_2.dbf' size 100M;
- 创建用户并指定默认表空间为新建的表空间。
create user test identified by test default tablespace ts_1;
- 向用户授予必要的访问权限。
grant create session, create table to test;
- 可以使用SQL语句查询DBA_TABLESPACES和DBA_DATA_FILES等数据字典视图确认表空间创建情况。
新建表空间后,用户可以在其中创建数据库对象如表、索引等。
更改表空间
在Oracle数据库中可以通过以下方式更改存在的表空间:
-
增加数据文件 - 使用ALTER TABLESPACE ADD DATAFILE命令增加表空间的新的数据文件。
-
删除数据文件 - 使用ALTER TABLESPACE DROP DATAFILE命令删除表空间的某个数据文件。
-
修改表空间属性 - 使用ALTER TABLESPACE命令修改表空间的关键属性,如表空间类型、日志模式等。
-
重新命名表空间 - 使用RENAME命令重命名表空间的名称。
-
变更表空间状态 - 使用ONLINE/OFFLINE命令设置表空间是否可访问。
-
移动表空间 - 使用MOVE命令移动表空间所关联的数据文件位置。
-
压缩表空间 - 使用ALTER TABLESPACE...COMPRESS命令压缩表空间节省空间。
-
读写模式 - 使用READ ONLY设置表空间只读,或READ WRITE设置可读写。
-
块大小 - 使用ALLOCATION UNIT大小设置表空间的块大小。
-
自动扩展 - 设置表空间自动扩展的文件增量大小。
合理调整表空间的配置,可以优化空间使用、性能以及管理效率。
删除表空间
在Oracle数据库中可以通过以下步骤安全删除一个表空间:
-
将表空间设置为脱机模式:
alter tablespace tablespace_name offline; -
将表空间中的所有对象删除或转移到其他表空间。
-
将表空间设置为只读模式:
alter tablespace tablespace_name read only; -
再次将表空间设置为脱机模式以确保无连接:
alter tablespace tablespace_name offline; -
删除表空间的数据库文件:
drop datafile 'datafile_name'; -
当表空间没有任何数据文件后,可以删除表空间:
drop tablespace tablespace_name; -
在执行完整的删除过程后,确认相关系统表中不存在表空间信息。
-
不要删除SYSTEM和其他系统表空间。
正确删除不再使用的表空间,可以释放存储空间,并简化数据库的管理。
区间管理
Oracle数据库通过区间(Extent)来进行存储分配和管理,主要涉及以下方面:
-
初始化参数EXTENT_MANAGEMENT - 确定存储分配使用字典管理或本地管理。
-
EXTENT大小 - 创建表空间时通过设置EXTENT大小控制区间大小。
-
本地BITMAP - 本地位图记录表空间的extent使用情况。
-
区间分配 - 对象扩张时以extent为单位分配存储空间。
-
统一空间管理 - 通过extent实现表空间内部的统一空间管理。
-
空间请求与分配 - 段向表空间的extent申请与分配请求。
-
块读取 - 区间管理不会影响以块为单位的读取。
-
快照TOO_MANY_EXTENTS - 可以监控异常过多的extent情况。
-
PCTINCREASE - 段自动扩展的百分比。
-
碎片整理 - 重建段可以减少因自动扩展产生的碎片。
合理利用区间机制,可以有效实现Oracle的空间管理。
管理段空间
在Oracle数据库中可以通过以下方式管理段空间:
-
监控空间使用情况 - 查询DBA_SEGMENTS视图获取段空间信息。
-
设置自动扩展 - 使用PCTINCREASE自动扩展段空间。
-
手动扩展 - 使用ALTER TABLE XXX ALLOCATE EXTENT指定扩展大小。
-
收缩段空间 - 使用ALTER TABLE XXX DEALLOCATE UNUSED SPACE收回未使用空间。
-
重建段 - 使用ALTER TABLE XXX MOVE进行碎片整理,释放空间。
-
分区 - 通过分区大对象减少单个段的空间占用。
-
压缩表 - 使用表压缩特性减少存储需求。
-
增加文件 - 为表空间增加数据文件扩充总空间。
-
调整PCTFREE、PCTUSED - 适当调节数据块中空闲空间比例。
-
删除过期数据 - 清理不再需要的历史数据释放空间。
合理管理段的存储空间,可以优化数据库空间使用和系统性能。
OMF
OMF(Oracle 管理文件)是Oracle自动管理表空间、数据文件及其命名的特性,具有以下主要优点:
-
自动管理命名 - OMF自动基于模板命名文件。
-
简化管理 - DBA无需手动管理文件。
-
支持大量文件 - OMF可轻松管理数千个数据文件。
-
自动扩展 - 数据文件可以自动增加大小。
-
方便表空间添加文件 - 易于扩展表空间的文件。
-
逻辑管理 - 以表空间为中心进行管理。
-
增强可靠性 - 丢失的数据文件可自动重新创建。
-
加快恢复 - OMF文件易于识别,利于恢复。
-
IO均衡 - OMF实现数据文件均衡IO负载。
-
默认启用 - Oracle 12c默认启用OMF特性。
OMF大幅简化了Oracle数据库的文件和存储管理。
Oracle数据库服务器自动管理空间的方法
段空间的分配
在Oracle数据库中,段空间的分配主要遵循以下原则:
-
以EXTENT为单位分配 - 段向表空间申请空间时,以EXTENT为基本单位。
-
根据需求自动分配 - 当现有EXTENT用完,会自动分配新EXTENT。
-
字典管理或本地管理 - 通过数据字典或位图记录空间分配情况。
-
初次分配EXTENT个数 - 创建段时通过MINEXTENTS指定初始分配的EXTENT数。
-
自动扩展比例 - 通过PCTINCREASE设置自动扩展的百分比。
-
最大EXTENT限制 - 通过MAXEXTENTS设定段扩展的上限。
-
段类型不同 - 不同的段类型有不同的空间分配算法。
-
空间不足时报错 - 当表空间空间不足无法分配时会报错。
-
手动扩展分配 - 可以通过ALTER TABLE手动指定分配EXTENT。
-
回退保留空间 - 删除对象时,表空间不会立即回收空间。
空间分配直接影响存储管理的效率和性能。
自动管理段空间
在Oracle数据库中可以通过以下方式实现自动管理段空间:
-
设置PCTINCREASE参数 - 段扩展时的默认增长百分比。
-
设置SEGMENT_SPACE_MANAGEMENT为AUTO - 启用表空间的自动空间管理。
-
设置segment monitoring - 启用对段空间使用的监控。
-
启用自动扩展表 - 使用AUTOALLOCATE扩展表。
-
规划初始分配大小 - 根据预估合理配置初始空间分配。
-
设置合适的最大EXTENT数 - 避免不必要的扩展开销。
-
增加表空间数据文件 - 确保表空间有足够扩展空间。
-
配置警告阈值 - 达到阈值时警告或拒绝操作。
-
分区大对象 - 将对象拆分为多个分区独立管理。
-
定期检测空间使用情况 - 发现异常空间使用的段。
自动管理能大幅减轻DBA的工作量,并优化空间使用。
使用压缩节省空间
在Oracle数据库中,可以通过使用数据压缩技术节省存储空间,主要方式包括:
-
表压缩 - 在创建表时指定COMPRESS子句启用列级压缩。
-
分区压缩 - 对大表分区启用COMPRESS子句。
-
索引压缩 - 对索引对象启用压缩,减少索引空间。
-
存档日志压缩 - 设置数据库为ARCHIVELOG模式并启用日志压缩。
-
RMAN备份压缩 - 在RMAN备份时指定压缩选项。
-
数据泵压缩 - 在导出/导入时启用数据泵的压缩功能。
-
未使用空间压缩 - 将缩短表中未使用的行空间。
-
碎片压缩 - 对表空间中的碎片空间进行压缩。
-
OLTP表压缩 - 对频繁DML操作的表采用高级行压缩。
-
只读表压缩 - 对静态只读表启用高级COMPRESS。
合理应用压缩技术,可以显著降低存储成本。
积极监控和管理表空间的使用
积极监控和管理表空间的使用情况,可以帮助提高Oracle数据库的性能和稳定性,主要措施包括:
-
定期查看表空间使用报告,包括数据文件、表空间空间使用率等。
-
设置表空间阈值报警,当使用率达到阈值时发送通知。
-
监控表空间的碎片状况,做碎片整理和重建操作。
-
根据应用高峰低峰周期合理调整表空间大小。
-
将不活跃和归档数据移到低成本存储。
-
避免单个表空间存放所有对象,按应用逻辑区分表空间。
-
将只读表空间设置为只读,避免无谓的redo日志。
-
设置表空间自动扩展避免不必要的维护工作。
-
采用分区技术避免单一大表空间产生的瓶颈。
-
采用OMF等自动管理机制减轻DBA管理工作量。
合理监控和管理对于优化表空间的使用至关重要。
使用Segment Advisor
在Oracle数据库中可以使用Segment Advisor进行段空间分析和优化,主要步骤包括:
-
启用段监控功能,跟踪段空间使用信息。
-
收集统计信息, updating staleness。
-
执行 Segment Advisor 分析任务:
EXEC DBMS_ADVISOR.QUICK_TUNE('SEGMENT_MANAGEMENT');
-
查看分析报告,识别空间使用异常的段。
-
根据建议,重建或压缩这些段来优化空间使用。
-
也可以自定义分析任务,指定分析的表空间或段 Schemas。
-
定期执行Segment Advisor任务,发现空间使用趋势。
-
将分析结果与AWR报告关联,辅助故障排查。
-
增加表空间数据文件,降低空间使用比例。
-
结合使用其他Advisor,如SQL Tuning Advisor。
Segment Advisor让优化存储管理变得更加智能化和自动化。
使用段收缩功能从表和索引中回收浪费了的空间
在Oracle数据库中,可以通过段收缩功能回收表和索引中的未使用和碎片化的空间,主要步骤包括:
-
启用表和索引的段收缩功能:
ALTER TABLE table_name ENABLE ROW MOVEMENT; -
收集表和索引统计信息,确保统计信息是最新的。
-
执行收缩操作:
ALTER TABLE table_name SHRINK SPACE; -
对索引执行收缩:
ALTER INDEX index_name SHRINK SPACE; -
设置触发自动段收缩的阈值,如空间使用率低于某值时自动收缩。
-
监控收缩操作是否出现失败或错误。
-
收缩后检查回收的空间大小,以及表和索引的空间使用率。
-
定期执行收缩,避免空间碎片和浪费。
-
将收缩操作integrate到维护脚本,自动化执行。
-
收缩互联网表后,对其统计信息采样以更新统计信息。
通过定期执行段收缩,可以持续优化Oracle数据库的空间使用效率。
管理可恢复空间的分配
在Oracle数据库中,可以通过以下方式管理可恢复空间的分配:
-
设置管理可恢复空间的表空间,如UNDOTBS。
-
根据事务需求,合理规划UNDOTBS的初始大小。
-
监控UNDOTBS的空间使用和扩展情况。
-
根据工作负载历史统计,计算UNDO空间的最佳大小。
-
设置自动扩展以防止由于空间不足造成的失败。
-
配置回退段的最佳大小,数量保证不会有过多争用。
-
利用staleness机制定期收集统计信息。
-
采用Automatic Memory Management自动管理内存。
-
配置警报阈值预警UNDO空间不足。
-
采用压缩等技术减少UNDO空间的消耗。
-
定期清理过期和不再需要的回退段。
合理的可恢复空间有助于保证事务完整性和一致性。