暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据块(Data Block)

恩恩霸 2025-09-26
38

数据块(Data Block),在Oracle数据库体系里又称“Oracle块”或“页(Page)”,是**Oracle管理数据的最小逻辑单元**,也是数据库与磁盘之间I/O的基本单位。无论读取一行还是一百万行,Oracle都必须以“块”的整数倍进行读写。深刻理解数据块,就等于抓住了Oracle存储引擎性能调优、空间管理、并发控制、故障恢复等核心机制的“总开关”。下面从概念、结构、参数、存储、空间管理、并发、压缩、加密、诊断、优化十个维度,对数据块进行系统而深入的剖析。

一、概念与地位
1. 最小逻辑单元:表空间→段→区→块,块位于最底层,是段空间分配和使用的原子单位。
2. 最小I/O单元:数据库每次从数据文件读写,必须以块大小为整数倍;操作系统块大小通常≤Oracle块大小,因此一个Oracle块可能跨多个OS块。
3. 与操作系统块区别:OS块由文件系统格式化决定,常见4 KB;Oracle块在创建数据库时由DB_BLOCK_SIZE参数设定,典型值8 KB,可取2/4/8/16/32 KB(不同平台上限不同)。
4. 与SQL Server“页”、MySQL“InnoDB页”异曲同工,但Oracle块自带事务槽、行目录、头部校验等更复杂结构。

二、逻辑结构剖析
一个标准Oracle块由**五大部分**组成:
1. 块头(Common and Variable Header)
‑ 块类型(表块、索引块、undo块等)、块地址(RDBA)、校验和(Checksum)、SCN(最近一次变更的系统变更号)。
2. 事务槽(ITL,Interested Transaction List)
‑ 每个槽记录事务ID、Undo块地址、锁标志、SCN等;initrans/maxtrans参数控制初始与最大槽数。
3. 行目录(Row Directory)
‑ 存储本块内每一行的“偏移地址”,即使行迁移或链接,目录项仍存在,仅更新指针。
4. 空闲空间(Free Space)
‑ 保留给后续插入或更新导致的行长度增长;受PCTFREE参数控制。
5. 行数据(Row Data)
‑ 实际按列存储的行记录,采用变长记录格式,支持行链接(Row Chaining)与行迁移(Row Migration)。

三、关键初始化参数
1. DB_BLOCK_SIZE:系统默认块大小,决定SYSTEM、SYSAUX等表空间的块尺寸,需在创建数据库前设定,之后不可改。
2. DB_nK_CACHE_SIZE:若需使用非默认块大小,可配置2/4/8/16/32 KB独立缓存池,并创建对应块大小的表空间。
3. DB_BLOCK_CHECKSUM:开启块级校验,防止磁盘静默损坏。
4. DB_BLOCK_MAX_DIRTY:控制检查点写脏块数量,影响恢复时间。
5. PCTFREE、PCTUSED、INITRANS、MAXTRANS:段级存储参数,最终落实到每个块的空间与并发策略。

四、空间管理演进
1. 字典管理(Dictionary-Managed Tablespace,DMT):8i及以前,区分配信息保存在数据字典,并发差、碎片多。
2. 本地管理(Locally-Managed Tablespace,LMT):9i起默认,在每个数据文件头用位图记录区分配,减少递归SQL,消除碎片。
3. 自动段空间管理(ASSM):9i引入,用位图块(L1、L2、L3)代替自由列表(Freelist),解决高并发插入热点,减少PCTUSED参数依赖。
4. 大文件表空间(Bigfile):10g起支持单文件最大4 GB×块大小,简化数据文件管理,配合ASSM实现完全位图化。

五、并发与一致性
1. ITL争用:当并发事务数超过ITL槽位,会出现“enq: TX - allocate ITL entry”等待;可通过增大INITRANS或重建段解决。
2. 行级锁:Oracle不在块外设锁管理器,而是把锁信息存储在块头的ITL与行目录,实现“锁即数据”。
3. 读一致性:查询时,根据SCN与ITL中的Undo块地址,构造CR(Consistent Read)块,避免脏读与不可重复读。
4. 延迟块清除:提交时并不立即清理ITL,下次访问才清除,减少提交开销,但可能产生“块清除”等待。

六、行迁移与行链接
1. 行迁移:更新后行长超过PCTFREE预留,Oracle把整行搬到新块,原块保留“转发地址”,导致二次I/O。
2. 行链接:行长超过块大小(如LOB、1000列大表),必须跨多个块存储,访问必做多块读。
3. 诊断:ANALYZE TABLE LIST CHAINED ROWS,或查询V$SYSSTAT中“table fetch continued row”。
4. 解决:提高PCTFREE、采用大块、垂直分区、压缩、分区表、缩小列宽。

七、压缩与加密
1. 基础压缩(Basic Table Compression):11g前,块级去重字典,适合批量加载,DML增删改代价高。
2. OLTP压缩(Advanced Row Compression):11g起,块内实时去重,采用“符号表”,DML友好,CPU换I/O。
3. 混合列压缩(EHCC):Exadata专属,按列存储单元压缩,压缩比10×+。
4. 透明数据加密(TDE):支持块级加密,数据在内存中明文,写入磁盘前加密,对应用透明;需钱包与密钥管理。

八、检查与诊断工具
1. DBV(DBVERIFY):离线检查数据文件块校验和,无需打开数据库。
2. RMAN BLOCK MEDIA RECOVERY:针对少量坏块,仅恢复受损块,无需整库恢复。
3. V$DATABASE_BLOCK_CORRUPTION:记录RMAN或DBV发现的坏块,用于精确定位恢复。
4. Block Dump:ALTER SYSTEM DUMP DATAFILE x BLOCK y,生成块级跟踪文件,深入解析ITL、行目录、锁信息。
5. 10046/10200事件:跟踪CR构造、块争用、buffer busy waits等。

九、性能优化最佳实践
1. 块大小选择:OLTP用8 KB平衡随机I/O与内存利用率;DSS/数据仓库用16/32 KB减少索引高度与全表扫描I/O;混合负载用多缓存池。
2. PCTFREE设置:高更新频率表设20–30%,低更新批量表设5–10%,压缩表可更低。
3. 减少迁移:定期MOVE/SHRINK SPACE COMPACT,或在线重定义。
4. 减少争用:高并发插入表采用ASSM+反向键索引+分区,降低ITL与缓冲忙等待。
5. 大数据块+压缩:扫描型报表表采用大块+EHCC,显著减少物理I/O与存储占用。
6. 监控等待事件:Buffer Busy Waits、Read by Other Session、GC Buffer Busy等,均与块级争用直接相关。

十、小结
数据块既是Oracle存储模型的“细胞”,也是性能调优的“显微镜”。从块头校验到ITL并发、从行目录到空闲空间、从迁移链接到压缩加密,每一个比特都直接影响数据库的吞吐量、响应时间、可用性与安全。掌握块内部结构,就能在千万级并发与PB级数据面前,精准定位瓶颈、快速修复坏块、优雅扩容缩表,实现“以块窥库,以微知著”。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论