SQL执行期间如果元数据不一致,为什么DDLevent日志和STORAGEEVENT日志可能用于恢复,而DMLEVENT日志不包括在内?
SQL执行期间如果元数据不一致,DDLevent日志和STORAGEEVENT日志可能用于恢复,而DMLEVENT日志不包括在内,这完全是由三种日志记录的根本故障类型和恢复机制的本质差异决定的。
一、三种日志的核心职责与恢复目标
| 日志类型 | 记录的根本故障 | 恢复的目标 | 影响的数据范畴 |
|---|---|---|---|
DDLevent | DDL语句执行期间,因节点/进程故障导致的节点间元数据执行信息不一致。
| 恢复元数据的一致性。 | 元数据(表结构、索引等定义信息)。 |
DMLEvent | DML语句执行期间,因节点/进程等问题引起的节点间主备分片的用户数据不一致。
| 恢复用户数据的一致性(从好的副本同步到坏的副本)。 | 用户数据(表内的实际记录)。
|
STORAGEEVENT | 物理存储故障,如磁盘异常、文件损坏、分片状态异常,导致元数据和用户数据同时损坏。
| 先恢复元数据,再恢复用户数据。 | 元数据 + 用户数据。 |
二、为什么元数据不一致时,DDLevent和STORAGEEVENT可用,而DMLEvent不可用?
关键在于 “元数据不一致”这个问题的性质。
1.DDLevent:专门为元数据不一致而生
直接对应:DDLevent的定义就是记录“DDL执行期间由于节点或进程故障导致的节点DDL执行信息不一致”。因此,任何由DDL操作(如CREATE TABLE, ALTER TABLE)引发的元数据不一致,其恢复信息都记录在DDLevent中。恢复机制:当检测到DDLevent时,恢复进程(gcrecover)会重新执行一遍之前失败的DDL语句,在所有节点上同步元数据。
2.STORAGEEVENT:元数据损坏的“升级版”故障
产生场景:当发生物理存储故障(如磁盘坏道、文件丢失)时,数据库首先尝试用DMLEvent机制修复用户数据。但如果故障严重到连元数据都不可读(例如,描述表结构的系统文件损坏),DMLEvent修复会失败。自动升级:此时,故障会自动从DMLEvent升级为STORAGEEVENT。STORAGEEVENT意味着**“存储层故障,元数据可能已损坏”**。
恢复机制:STORAGEEVENT的恢复是两步走:
先进行DDL恢复:根据集群中其他健康节点的信息,重新生成并执行DDL,以修复损坏的元数据。再进行DML恢复:在元数据恢复后,再使用类似DMLEvent的机制,从健康副本同步用户数据。“产生dmlstorageevent之后先进行ddlevent修复,再进行dmlevent修复。”
3.DMLEvent:不涉及元数据修复
核心前提:DMLEvent修复的前提是元数据完好无损。它只处理主副本和备副本之间用户数据行内容的不一致。无能为力:当故障是“元数据不一致”时,意味着描述数据结构的“地图”都错了。DMLEvent机制(通过gc_sync工具同步数据)无法修复“地图”本身。它只能在正确的地图指导下,去同步各个“地点”的数据。DMLEVENT:记录集群在执行DML语句期间由于节点或进程等问题引起的节点间主备分片不一致的信息。” 这里特指分片数据,而非分片的定义(元数据)。
三、总结与类比
可以将这三种日志的恢复机制类比为 “修复一本书”:
DDLevent:这本书的目录(元数据) 印错了或漏页了。修复方法是重新印刷正确的目录页,替换所有书的错误目录。DMLEvent:这本书的正文内容(用户数据) 在某一页上有几个字印刷模糊。修复方法是从一本完好的书上,把这页的内容抄过来。STORAGEEVENT:这本书被水泡了,目录和正文都损坏了。修复方法是:- 先修复目录:根据其他完好的书,重新制作一份目录(相当于
DDLevent恢复)。 - 再修复正文:在有了正确目录后,根据目录找到损坏的正文页,从完好的书上把内容抄过来(相当于
DMLEvent恢复)。
- 先修复目录:根据其他完好的书,重新制作一份目录(相当于
因此,当问题明确是“元数据不一致”时:
- 如果只是目录印错(纯DDL故障),直接用
DDLevent恢复。 - 如果是整本书被泡坏(物理存储故障导致元数据丢失),需要用
STORAGEEVENT恢复,其第一步就是DDLevent恢复。 - 而
DMLEvent只管抄写正文,不管修复目录,所以对元数据不一致的问题无能为力,故不包括在内。
这种设计体现了GBase 8a故障恢复的层次化、精细化思想,针对不同层级的故障,采用最匹配的恢复策略。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526