为积极响应国家政策,加强自主创新,推动关键核心技术的自主可控,联通软研院架构部数据库团队基于OceanBase社区版打造了自研分布式CUDB产品。为进一步完善产品能力,双方在内核层面展开共建,现在已完成oblogminer(事务日志分析)基本功能建设(自4.2.3/4.3.2 版本开始支持),支持对在线日志和归档日志的分析和处理,可用于实现用户误操作精准恢复。
共建背景
从降低商用依赖等方面综合考虑,联通软研院架构部数据库团队基于OceanBase社区版打造了自研分布式CUDB产品。将产品的开通、使用、监控、运维全面接入联通云,实现产品资源的一点开通、一点交付、一点监控、一点运维和一点操作,为应用提供易用而专业的一站式全托管服务。
当前分布式CUDB已具备实例级、表级数据备份恢复能力,为补齐用户DML误操作精准恢复方面能力短板,覆盖全场景的数据恢复能力,联通软研院开展了OceanBase的oblogminer(事务日志分析)社区共建工作,将数据库DML操作事务日志解析生成正向与反向SQL,具备用户数据库操作日志分析能力,可实现用户误操作的精准恢复。
总体架构
通过oblogminer分析事务日志时,用户需要指定分析的目标集群,oblogminer会根据用户给定的过滤条件将日志数据转化成对应的Redo/Undo SQL等信息供用户进行分析或进行数据恢复。整体架构如下:
Producer将从OBCDC获取的数据转换成 LogMinerBR 格式,再通过DataFilter的过滤,将LogMinerBR交由DataConverter做转换处理,生成更便于使用的正向和反向SQL。之后,Writer组件会将日志归集聚合成批量记录,通过FileManager将批量记录写入存储介质(文件存储/OSS对象存储)。DataManager负责内存资源的分配及分析进度的管控,ResourceCollector负责回收相应的内存资源,比如当LogMinerRecord已经完成输出后,会将LogMinerRecord对象所占用的内存资源回收。各个模块功能简单介绍如下:
模块 | 功能介绍 |
Producer | 负责OBCDC的管理以及将从OBCDC获取的数据包装成 LogMinerBR 格式。 支持从在线日志和归档日志中读取并分析。 |
DataFilter | 负责LogMinerBR的过滤。支持多种记录过滤条件。 |
DataConverter | 负责将LogMinerBR转成LogMinerRecord(主要完成redo/undo sql 的生成)。支持生成 REDO/UNDO SQL。支持多种数据类型转换。 |
Writer | 负责将LogMinerRecord聚合成批量记录并写入到存储介质。支持分析结果写入 本地/OSS。支持多种记录输出格式。 |
DataManager | 负责内存分配以及分析进度的更新和管理。 |
ResourceCollector | 负责回收对应的内存资源。 |
Args | 负责命令行参数解析。支持丰富的可选命令行参数。 |
具体实现
oblogminer启动后,会进行各组件的初始化和启动工作,通过 OBCDC 来拉取并解析 CLOG 日志,将 OBCDC 输出的逻辑日志转化成简单易读的格式,并将分析结果存储到指定位置。数据记录流向见下图。
1.记录获取与组织。
OBCDC 通过 RPC 向 OceanBase 数据库请求各个observer的 Clog(Redo)日志,将收到的数据以事务为单位进行组装。然后对各个事务进行排序,结合各个表、列的 schema 信息(数据字典模式下从日志信息中获取),将 Redo 日志转化为一种中间数据格式(LOGMSG),以事务为单位逐行输出数据库变更数据,处理流程如下图所示:
Producer负责OBCDC的管理以及将从OBCDC获取的数据包装成 LogMinerBR 格式。支持从在线以及归档日志读取日志并分析。之后每个oblogminer组件都实现了push和handle方法,分别从上一个组件接受数据记录信息并处理,并实现接受和处理记录操作的解耦,以达到更高的处理效率。
2.记录过滤。
Producer组件完成数据处理后,将数据交由过滤器Filter完成数据过滤。数据库操作日志包含了全部的增量日志内容,包括了所有数据的DDL、数据变更DML以及权限变更等操作,在多数情况下,我们只需要分析某些表、某些特定记录及特定操作的事务日志,通过Filter实现对数据记录过滤功能,只输出我们想要的记录。目前支持了特定列记录Filter、操作类型Filter等过滤器类型。完成记录过滤后交由数据转移器Converter处理。
3.记录转换。
通过OBCDC接收到的数据记录可读性较差,需要进行转换才能更方便地使用。Converter将接收到的数据记录转换成正向与反向SQL,方便进行操作日志分析及进行误操作闪回处理等。DML类型操作的数据记录包含完整的行记录信息,不管是正向与反向SQL,在生成upate或delete语句时,进行了优化处理。当存在主键或唯一键的情况下,where条件只拼接主键或唯一键信息,这样可减少输出数据的数据量,也间接提升了生成SQL整体的执行效率。
4.记录归集。
各个组件在前面对数据都是按条处理的,但最终输出到文件中时,按数据记录逐条写文件效率会很低,这时通过数据归集组件Aggregator,将数据聚集成批量记录再写入存储介质,会大大提高写入效率。在这里,主要支持通过数据记录的间隔时长及记录数两个维度进行数据归集。
5.记录输出。
输出数据文件默认存储为 CSV 格式,现在可支持CSV、JSON、REDO_ONLY、UNDO_ONLY格式,文件名称为从0开始连续递增的整数,单个文件最大为 64 MB。因为生成SQL中会包含数据行记录信息的具体内容,这里需要对特殊字符进行转义处理,以生成正确可解析的数据格式,比如JSON格式输出,还需要遵循JSON本身的格式要求,这就需要对涉及可能冲突的特殊字符全部进行转义处理,才能生成正确的JSON格式数据。
6.过程管控。
为提高各个组件处理效率并降低耦合,各个组件设计为独立工作模式,这就需要管理与协调整体进度。DataManager负责内存分配以及分析进度的更新和管理,它实时监控日志分析进展,并更新命令行的处理进度,当前分析任务结束后,再通知各组件进行关闭操作,释放资源。
使用场景
1.DML误操作精准恢复。
当用户在某个时刻对数据库进行误操作时,通过oblogminer可以生成逆向回滚SQL(UNDO SQL),从而提供了“SQL闪回”的细粒度恢复能力。OceanBase支持通过备份数据进行数据全库或全表的恢复,当发生误操作时,通过全库全表恢复一方面耗时较长,另一方面,由于在线业务数据会持续更新,这势必会丢失一些最近修改的数据。通过oblogminer生成的逆向SQL,可只针对误操作的语句进行精准恢复,这样可以大大提升数据恢复效率。
例如,用户错误地执行了一个delete操作,删除了1条用户实例信息数据,这时通过oblogminer,指定操作的时间范围、操作的表以及操作类型,可以快速输出具体操作的行记录SQL和反向操作SQL,通过直接执行反向操作SQL就可实现误操作记录的恢复。使用示例如下:
./oblogminer -c ip:2883 -u 'root@tenant_name' -p 'xxx' -s '2024-05-28 09:10:00' -l '租户名.数据库名.表名' -O 'delete' -f 'JSON' -o 'file:///home/gcsql/logminer/log2'"
执行oblogminer命令输出文件内容如下:
通过oblogminer的输出,找到相应的SQL与反SQL,直接在误操作数据库中执行相应的反SQL语句。
确认误删除数据已恢复。
还可进一步将这些操作自动化,直接将反向操作SQL组织好,一键实现DML误操作的精准恢复。
2.数据库操作日志分析。
oblogminer支持对在线日志和归档日志的分析,并且可以输出为多种格式,当输出格式为CSV 格式时,可以通过 OceanBase 数据库的外表功能读取ObLogMiner的输出结果,并在数据库中查询分析。此外,CSV 格式的输出结果也可以直接通过excel进行分析,例如可以对数据库操作类型进行统计:
未来展望
通过本次功能共建,一方面提升了联通软研院团队人员在数据库内核方面的开发能力与掌控水平,可以更好地保障数据库的稳定运行,另一方面丰富完善了OceanBase 数据库功能。非常感谢联通软研院积极、认真地参与OceanBase开源社区贡献,希望后续可以继续合作,持续深入进行社区共建,实现共建共赢!
更多oblogminer详细信息可参考oblogminer官方文档。