81-Oracle-块-区-段-表空间-解析

上一期说到Oracle推荐的 LMT+ASSM管理方式77-Oracle 表空间管理(官方推荐)LMT-ASSM-优快云博客,现在深入掌握Oracle存储架构的核心组件(块/区/段/表空间),这样可以提高维护精准度和效率:

​性能优化:通过监控块的空间利用率(ASSM位图)和行迁移,解决I/O瓶颈;调整区分配策略预防碎片化;管理高水位线(HWM)避免全表扫描无效数据。

​容量管理:在表空间层级预判数据增长,及时扩容或迁移热数据;通过段分析精准定位空间浪费对象(如空表延迟分配);利用区回收机制释放存储资源。

​故障诊断:快速定位存储异常:ORA-01555错误(回滚段配置)、索引分裂(区分配过小)、大表查询缓慢(HWM未回收)。

​架构设计:合理规划表空间物理布局(如分离索引/LOB数据),设计分区表(段级隔离),选择最佳块大小(OLTP vs DSS场景),构建高性能存储方案。

​通过深入理解块、区、段和表空间的协作机制,加深我们对数据存储的理解,将物理存储抽象为可控逻辑单元,方便我们精准调试Oracle的存储引擎。

一、核心概念与结构

1. 数据块 (Block)
  • 概念​:
    • Oracle 数据库的最小 I/O 单位(默认 8KB)
    • 数据存储的基本单元,存储实际的行数据
  • 结构​:
    • 块头:元数据(块地址、SCN、事务槽)
    • 表目录:表信息(仅堆组织表)
    • 行目录:行位置指针
    • 空闲空间:可插入新数据或更新的区域
    • 行数据:实际存储的行记录
  • 空间管理​:
    • ASSM(自动管理)​​:
      • 使用位图按空闲比例分类块(0-25%, 25-50%, 50-75%, 75-100%)
      • 插入数据时根据行大小匹配对应空闲级别的块
      • 仅保留 PCTFREE 参数(预留更新空间)
    • MSSM(手动管理)​​:
      • 使用空闲列表(FREELIST)跟踪可用块
      • PCTFREE(预留更新空间)和 PCTUSED(可插入阈值)配合管理

     

2. 区 (Extent)
  • 概念​:
    • 空间分配的最小单位(由连续数据块组成)
    • 段存储空间的基本扩展单元
  • 结构​:
    • 初始区(Initial Extent):对象创建时分配的第一个区
    • 后续区(Next Extent):空间不足时动态分配的区
  • 管理方式​:
    • 本地管理(LMT)​​:
      • 使用数据文件头部的位图跟踪区分配
      • 高效无争用(默认方式)
    • 字典管理(已淘汰)​​:
      • 通过数据字典表管理区分配
3. 段 (Segment)
  • 概念​:
    • 逻辑对象(表/索引/LOB)的物理存储容器
    • 由一个或多个区组成
  • 结构​:
    • 段头块:存储位图(ASSM)或空闲列表(MSSM)
    • 区链表:管理多个区
  • 类型​:
    • 表段(TABLE)
    • 索引段(INDEX)
    • LOB段(LOBSEGMENT)
    • 分区段(每个分区独立)
  • 延迟段创建​:
    • 表创建时不立即分配段(deferred_segment_creation=true)
    • 首次插入数据时分配初始区 
4. 表空间 (Tablespace)
  • 概念​:
    • 数据库的逻辑存储容器
    • 管理物理数据文件的逻辑抽象
  • 结构​:
    • 数据文件:物理存储文件
    • 段空间管理:
      • 本地管理(LMT,推荐)
      • 字典管理(已淘汰)
    • 块大小:可指定非标准块大小(需配置DB缓存)

二、Oracle 体系架构中的功能 

​组件​

​功能描述​

​数据块​

最小 I/O 单元,存储实际行数据,支持事务处理(行锁、事务槽)

​区​

空间分配单元,保证数据物理连续性,提升 I/O 效率

​段​

逻辑对象容器,管理空间扩展和高水位线(HWM)

​表空间​

逻辑存储容器,隔离物理文件,支持存储策略(如热冷数据分离)

关键机制​:

  1. ASSM + LMT​:自动化空间管理(减少 DBA 干预)
  2. 延迟段创建​:减少空对象空间占用
  3. 高水位线(HWM)​​:标记段中已使用区的最高位置(影响全表扫描范围)
  • DELETE数据并不降低 HWM,需 SHRINK 或 MOVE 回收空间

三、验证脚本

1. 查看表空间与数据文件
-- 查看表空间信息
SELECT tablespace_name, block_size, status, contents FROM dba_tablespaces;
--
   TABLESPACE_NAME    BLOCK_SIZE    STATUS     CONTENTS
__________________ _____________ _________ ____________
SYSTEM                      8192 ONLINE    PERMANENT
SYSAUX                      8192 ONLINE    PERMANENT
UNDOTBS1                    8192 ONLINE    UNDO
TEMP                        8192 ONLINE    TEMPORARY
USERS                       8192 ONLINE    PERMANENT
BIDATA                      8192 ONLINE    PERMANENT
BIINDEX                     8192 ONLINE    PERMANENT
ODSDATA                     8192 ONLINE    PERMANENT
ODSINDEX                    8192 ONLINE    PERMANENT
-- 查看数据文件
SELECT file_name, tablespace_name, bytes/1024/1024 AS size_mb FROM dba_data_files;
--
  SIZE_MB
_________________________________________________________________________________________ __________________ __________
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/o1_mf_system_n5lgnhs6_.dbf      SYSTEM                    480
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/o1_mf_sysaux_n5lgnhsg_.dbf      SYSAUX                    520
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/o1_mf_undotbs1_n5lgnhsg_.dbf    UNDOTBS1                  260
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/o1_mf_users_n5lgnoj8_.dbf       USERS                     100
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/bidata01.dbf                    BIDATA                  30720
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/biindex01.dbf                   BIINDEX                 30720
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/odsdata01.dbf                   ODSDATA                 30720
/oradata/HBICDB/383C85C956F239E2E063BD00060A05F5/datafile/odsindex01.dbf                  ODSINDEX                30720
 2. 验证段与区分配
-- 创建测试用户
CREATE USER test_user IDENTIFIED BY test;
GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO test_user;
--User TEST_USER created.
--Grant succeeded.
-- 延迟段创建(默认)
CREATE TABLE test_user.t_delayed (id NUMBER);
--Table TEST_USER.T_DELAYED created.
SELECT segment_name FROM user_segments WHERE segment_name = 'T_DELAYED';
-- 无结果,no rows selected

INSERT INTO test_user.t_delayed VALUES (1);
COMMIT;
SELECT segment_name, blocks, extents FROM user_segments;
--
SEGMENT_NAME                            BLOCKS    EXTENTS
____________________________________ _________ __________
UNDO$                                        8          1
PROXY_ROLE_DATA$                             8          1
CON$                                        40          5
PROXY_DATA$                                  8          1
FILE$                                        8          1

-- 立即分配段
CREATE TABLE test_user.t_immediate (id NUMBER) SEGMENT CREATION IMMEDIATE;
SELECT segment_name, blocks, extents FROM user_segments;
--
SEGMENT_NAME                         BLOCKS    EXTENTS
_________________________________ _________ __________
C_OBJ#                                 2048         31
I_OBJ#                                   40          5
C_TS#                                    32          4
I_TS#                                     8          1
C_FILE#_BLOCK#                          256         17
I_FILE#_BLOCK#                           32          4
C_USER#                                  16          2
I_USER#                                   8          1
………………
13.52186                         8          1
13.52218                         8          1
3,423 rows selected.
-- 多类型段(表+索引+LOB)
CREATE TABLE test_user.t_lob (
    id NUMBER PRIMARY KEY,
    doc CLOB
) SEGMENT CREATION IMMEDIATE;

SELECT segment_name, segment_type FROM user_segments;
3. 块管理验证(ASSM vs MSSM)
-- 创建ASSM表空间
CREATE TABLESPACE assm_ts 
DATAFILE 'assm.dbf' SIZE 100M 
EXTENT MANAGEMENT LOCAL 
SEGMENT SPACE MANAGEMENT AUTO;

-- 创建MSSM表空间
CREATE TABLESPACE mssm_ts 
DATAFILE 'mssm.dbf' SIZE 100M 
EXTENT MANAGEMENT LOCAL 
SEGMENT SPACE MANAGEMENT MANUAL;

-- 在ASSM表空间建表
CREATE TABLE test_user.t_assm (id NUMBER) TABLESPACE assm_ts;
SELECT segment_name, segment_subtype FROM user_segments;

-- 在MSSM表空间建表(指定PCTFREE/PCTUSED)
CREATE TABLE test_user.t_mssm (
    id NUMBER
) PCTFREE 20 PCTUSED 40 TABLESPACE mssm_ts;
 4. 区扩展与回收
-- 手动分配区
ALTER TABLE test_user.t_immediate ALLOCATE EXTENT (SIZE 1M);
SELECT extent_id, bytes FROM user_extents;
--
           2    1048576
           3    1048576
           4      65536
           5    1048576

7,476 rows selected.

-- 删除数据并回收空间
DELETE FROM test_user.t_immediate;
COMMIT;

-- 回收未使用区(仅回收未使用区)
ALTER TABLE test_user.t_immediate DEALLOCATE UNUSED;
SELECT bytes, blocks FROM user_segments;
--
    65536         8
    65536         8

3,423 rows selected.

-- 降低高水位线(HWM)
ALTER TABLE test_user.t_immediate ENABLE ROW MOVEMENT;
--Table TEST_USER.T_IMMEDIATE altered.
ALTER TABLE test_user.t_immediate SHRINK SPACE;
--Table TEST_USER.T_IMMEDIATE altered.
 5. 块使用分析
-- 查看块使用情况(需DBA权限)
SELECT table_name, blocks, empty_blocks 
FROM dba_tables 
WHERE owner = 'TEST_USER';
--
TABLE_NAME        BLOCKS    EMPTY_BLOCKS
______________ _________ _______________
T_DELAYED
T_IMMEDIATE
T_LOB

-- 分析表空间使用,查看表的空间利用率(ASSM表空间)
SELECT 
  df.tablespace_name,
  ROUND(SUM(df.bytes) / 1024 / 1024, 2) AS allocated_mb,
  ROUND((SUM(df.bytes) - SUM(fs.bytes)) / 1024 / 1024, 2) AS used_mb
FROM dba_data_files df
JOIN dba_free_space fs ON df.tablespace_name = fs.tablespace_name
WHERE df.tablespace_name = (
  SELECT tablespace_name 
  FROM dba_tables 
  WHERE owner = 'TEST_USER' AND table_name = 'T_IMMEDIATE'
)
GROUP BY df.tablespace_name;
--
TABLESPACE_NAME       ALLOCATED_MB    USED_MB
__________________ _______________ __________
USERS                           72       6.75

四、使用体验

Oracle 存储层次结构: 表空间 → 段 → 区 → 块
关键结论​:
  1. 是 I/O 最小单元,ASSM 简化空间管理
  2. 保证数据连续性,本地管理提升效率
  3. 管理对象存储,延迟创建优化空间
  4. 表空间隔离物理存储,支持不同存储策略
最佳实践​:
  1. 使用 ASSM + LMT 表空间(SEGMENT SPACE MANAGEMENT AUTO)
  2. 启用延迟段创建(deferred_segment_creation=true)
  3. 定期监控高水位线,使用 SHRINK SPACE 回收空间
  4. 对大型表使用分区+压缩优化存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值