SYSTEM表空间在10g前强制DMT,10g+可支持LMT(需创建时显式指定),从 11g 到 23ai,新建的非系统表空间均默认启用 LMT+ASSM,不用显式声明。新建表空间直接默认是lmt+assm,从DMT到LMT的演进,到了上云和多租户时代,最佳黄金搭档是LMT+ASSM了。
一、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存储架构的核心
- LMT位图管理:通过数据文件头部位图替代字典表,解决空间分配效率与碎片问题,成为表空间管理的工业标准。
- ASSM三级位图:以L1/L2/L3块实现智能块分配,消除Freelist争用,支撑OLTP系统万级并发DML。
- 联合自治优势:
- 零人工干预:空间分配/回收自动化,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
490

被折叠的 条评论
为什么被折叠?



