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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值