77-Oracle 表空间管理(官方推荐)LMT-ASSM

SYSTEM表空间在10g前强制DMT,10g+可支持LMT(需创建时显式指定),从 11g 到 23ai,​新建的非系统表空间均默认启用 LMT+ASSM,不用显式声明。新建表空间直接默认是lmt+assm,从DMT到LMT的演进,到了上云和多租户时代,最佳黄金搭档是LMT+ASSM了。

一、Oracle存储结构概述

Oracle采用四级逻辑存储结构:
  • 表空间(Tablespace)​​:最高级逻辑容器,由多个数据文件组成,隔离系统数据与用户数据。
  • 段(Segment)​​:对象(表/索引)占用的空间集合,一个段含多个区。
  • 区(Extent)​​:空间分配最小单元,由连续数据块组成,提高I/O效率。
  • 块(Block)​​:最小I/O单元(默认8KB),存储实际数据行。
层级关系​:表空间 → 段 → 区 → 块

二、表空间管理方式

1. 字典管理(DMT,已淘汰)​
  • 原理​:使用SYS.FET$/SYS.UET$字典表记录空间分配,需递归更新数据字典,产生Redo/Undo及锁争用(enq: SQ - contention)。
  • 缺点​:碎片多、需定期COALESCE合并、并发性能差。
​2. ​LMT(本地管理表空间)​
  • 位图管理机制​:
    • 位图存储在数据文件头部,每个位对应一个区。分配新区时,扫描位图找到连续空闲位并标记为1。
    • UNIFORM分配​:固定区大小,位图直接标记区状态,减少碎片。
    • AUTOALLOCATE分配​:动态计算最优区大小,位图记录不同大小的空闲区位置。
  • 性能优势​:避免DMT的递归SQL和锁争用,空间操作效率提升90%。
3. 官方推荐
  • 所有表空间必须使用LMT​(Oracle 9i+默认)。
  • 例外​:
    • - SYSTEM表空间在10g前强制DMT,10g+可支持LMT(需创建时显式指定)。
    • 临时表空间必须为 ​LMT+UNIFORM​(禁用ASSM)。

 表空间管理方式对比

​特性​

​DMT​(已淘汰)

​LMT​

​管理位置​

数据字典(SYSTEM表空间)

数据文件头部位图

​锁争用​

高(enq: SQ - contention)

​碎片处理​

需手动COALESCE

自动合并

​适用版本​

Oracle 8i及更早

Oracle 9i+(默认)

三、段空间管理方式

1. 手动管理(MSSM)​
  • 原理​:
    • 使用FREELIST链表管理空闲块,通过PCTFREE(预留更新空间)、PCTUSED(块重用阈值)控制块状态。
    • 高并发插入时FREELIST争用导致buffer busy waits。
2. ​ASSM(自动段空间管理)​​(官方推荐
  • 三级位图结构​:

​层级

​功能​

​存储内容​

​L3块​

段头块

定位L2块位置

​L2块​

二级位图

记录L1块地址,按进程PID哈希随机选择L1块

​L1块​

一级位图

按空闲空间比例分类块(0-25%、25-50%、50-75%、75-100%)

  • 工作流程​:插入数据时,根据进程PID哈希随机选择L2块→定位L1块→匹配空闲比例合适的块(如50KB数据选择50-75%空闲块)。
  • 优势​:消除MSSM的Freelist争用,仅需设置PCTFREE(默认10%),支持高并发DML。
3. 官方推荐
  • 所有用户表空间必须启用ASSM​(Oracle 10g+黄金标准)。
  • 例外​:
    • 临时段(如排序操作)不支持ASSM。
    • SYSTEM表空间仅支持MSSM。

​特性

​MSSM​

​ASSM​

​核心机制​

FREELIST链表

位图块(L1/L2/L3)

​参数依赖​

PCTFREE+PCTUSED

仅需PCTFREE

​并发争用​

高(buffer busy waits)

​行迁移风险​

四、验证与监控脚本

1. ​管理方式验证​
-- 检查表空间管理方式(LMT/DMT)
SELECT tablespace_name, extent_management 
FROM dba_tablespaces;
--
TABLESPACE_NAME                EXTENT_MAN
------------------------------ ----------
SYSTEM                         LOCAL
SYSAUX                         LOCAL
UNDOTBS1                       LOCAL
TEMP                           LOCAL
USERS                          LOCAL
EMR5                           LOCAL
-- 检查段管理方式(ASSM/MSSM)
SELECT tablespace_name, segment_space_management 
FROM dba_tablespaces;
--
TABLESPACE_NAME                SEGMEN
------------------------------ ------
SYSTEM                         MANUAL
SYSAUX                         AUTO
UNDOTBS1                       MANUAL
TEMP                           MANUAL
USERS                          AUTO
 2. ​空间效率分析​
-- LMT碎片检测(空闲区连续率<70%需优化)
SELECT tablespace_name, 
       ROUND(SUM(bytes) / MAX(bytes) * 100, 2) AS frag_ratio 
FROM dba_free_space 
GROUP BY tablespace_name 
HAVING SUM(bytes) / MAX(bytes) < 70;
--
TABLESPACE_NAME                FRAG_RATIO
------------------------------ ----------
EMR52018                           420.95
EMR52021                           596.55
SYSAUX                                580
UNDOTBS1                          3737.96
HIS50                             4263.14
USERS                                 100
-- ASSM块利用率(空块率>30%为健康)
SELECT tablespace_name,
       SUM(blocks) * 8 / 1024 AS "Total(MB)",  -- 总空间
       SUM(blocks - NVL(empty_blocks,0)) * 8 / 1024 AS "Used(MB)",  -- 已用空间
       ROUND((SUM(blocks) - SUM(NVL(empty_blocks,0))) / SUM(blocks) * 100, 2) AS "Pct_Used"
FROM (
    SELECT s.segment_name, s.tablespace_name, s.blocks,
           (SELECT empty_blocks 
            FROM dba_tables t 
            WHERE t.table_name = s.segment_name AND t.owner = s.owner) AS empty_blocks
    FROM dba_segments s
    WHERE s.tablespace_name = 'USER_DATA'
)
GROUP BY tablespace_name;
--
3. ​实时性能诊断​
-- 查看系统级等待事件统计(需DBA权限)
SELECT event, total_waits, time_waited/1000 AS time_waited_ms
FROM v$system_event 
WHERE event = 'buffer busy waits';

-- 定位热点块及关联对象(实时诊断)
SELECT /*+ ORDERED */
  s.sid, 
  s.sql_id, 
  w.p1 AS file_id, 
  w.p2 AS block_id, 
  w.p3 AS class_id,
  o.owner, 
  o.object_name, 
  o.object_type
FROM v$session_wait w
JOIN v$session s ON w.sid = s.sid
LEFT JOIN dba_objects o 
  ON (o.data_object_id = s.row_wait_obj#)
WHERE w.event = 'buffer busy waits';
--
EVENT                                         TOTAL_WAITS TIME_WAITED_MS
------------------------------------------ ----------- --------------
buffer busy waits                                 573           .271
-- 生成BITMAPDBA诊断跟踪文件(SYS执行)
ALTER SESSION SET tracefile_identifier = 'BITMAPDBA_TRACE';
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(waits=>TRUE, binds=>FALSE);
ALTER SESSION SET events 'immediate trace name BITMAPDBA level 10'; 
-- 执行后需禁用跟踪
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE;
-- 监控LMT位图健康(需SYS权限)
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
VALUE
------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_79330.trc

五、官方推荐最佳实践

1. ​配置规范​

​组件​

​推荐方式​

​理由

​表空间管理​

LMT

消除字典争用,零碎片

​段管理​

ASSM

高并发支持,简化参数

​区分配策略​

OLTP:UNIFORM;数仓:AUTOALLOCATE

平衡性能与空间利用率

​特殊表空间​

UNDO/TEMP必须用UNIFORM

事务回滚与排序稳定性要求连续空间

2. ​生产环境操作
-- 标准表空间(LMT+ASSM+AUTOALLOCATE)
CREATE TABLESPACE app_data DATAFILE '/u01/oracle/oradata/app01.dbf' SIZE 100G  
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE  
    SEGMENT SPACE MANAGEMENT AUTO;  

-- UNDO表空间(强制UNIFORM)
CREATE UNDO TABLESPACE undots DATAFILE '/u01/oracle/oradata/undots.dbf' SIZE 20G  
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;  

-- 临时表空间(禁用ASSM)
CREATE TEMPORARY TABLESPACE temp TEMPFILE '/u01/oracle/oradata/temp.dbf' SIZE 50G  
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;
3. ​关键限制与规避措施
  • 禁止项​:
    • 禁用DMT表空间(性能瓶颈)
    • ASSM不可用于临时表空间(仅支持MSSM)
高并发优化​:
  • 小表预分配空间:ALTER TABLE t ALLOCATE EXTENT (SIZE 64M),增加L1块数量
  • 避免高峰期批量插入,分散写入负载

六、总结:现代Oracle存储架构的核心

  1. LMT位图管理​:通过数据文件头部位图替代字典表,解决空间分配效率与碎片问题,成为表空间管理的工业标准。
  2. ASSM三级位图​:以L1/L2/L3块实现智能块分配,消除Freelist争用,支撑OLTP系统万级并发DML。
  3. 联合自治优势​:
  • 零人工干预​:空间分配/回收自动化,DBA仅需监控异常阀值。
  • 线性扩展性​:位图操作无锁、无日志,EB级数据扩展性能不衰减。
-- 一键健康检查(LMT+ASSM状态)
SELECT t.tablespace_name, 
       t.extent_management, 
       t.segment_space_management,
       ROUND(u.used_percent, 2) AS space_used_pct
FROM dba_tablespaces t
JOIN dba_tablespace_usage_metrics u 
  ON t.tablespace_name = u.tablespace_name
WHERE t.contents = 'PERMANENT';

--
TABLESPACE_NAME                EXTENT_MAN SEGMEN SPACE_USED_PCT
------------------------------ ---------- ------ --------------
DATA_MRS                       LOCAL      AUTO             9.69
EMR5                           LOCAL      AUTO            38.61
HIS50                          LOCAL      AUTO             17.4
SYSAUX                         LOCAL      AUTO            99.96
SYSTEM                         LOCAL      MANUAL          24.66
USERS                          LOCAL      AUTO             3.33
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值