获得数据库操作日志的三种方式


数据库审核(Audit)日志是对数据库CRUD操作的记录,是一种事件日志,EventSourcing事件溯源类似这种架构,数据库日志输出可以供大数据实现ETL分析。有的数据库自身提供日志的输出接口,这里讨论的是普遍意义上的三种方法。

基于数据库触发器
每个RDBMS支持触发器,尽管其语法和功能略有不同。
PostgreSQL提供了一基于触发器的审核日志。非常容易实现。将旧行状态和新行状态存储在JSON列中是一个很好的主意,因为即使源表结构发生更改,它也允许我们重用相同的功能。

传统上,用于捕获事件的最常见技术是使用数据库或应用程序级触发器。该技术之所以仍然非常普及,是由于其简单性和熟悉性。
审核日志是一个单独的结构,记录了每行发生的每个插入,更新或删除操作。

基于应用持久层级触发器
有一些框架,例如Hibernate Envers,可以在应用程序级别模拟数据库触发器。优点是您不必介意触发器的数据库特定语法,因为无论如何,事件都是由持久性上下文捕获的。缺点是您无法记录不流经应用程序的数据更改事件(例如,来自数据库控制台或共享同一RDBMS的其他系统的更改)。Hibernate Envers是Hibernate ORM扩展,它使您可以立即捕获更改事件。

基于事务日志的CDC
尽管数据库或应用程序级触发器是CDC的非常常见的选择,但是还有更好的方法。审核日志只是数据库事务日志(也称为重做日志或预写日志)的副本,该日志已经存储了基于行的修改。
因此,您实际上并不需要使用数据库或应用程序级触发器来创建新的审核日志结构,只需要扫描事务日志并从中提取CDC事件。
从历史上看,每个RDBMS都使用其自己的方式对基础事务日志进行解码:


一系列现有的开源产品提供CDC,包括:MaxwellSpinalTap,Yelp的MySQL StreamerDebezium。现有的解决方案在捕获源自事务日志的实时更改方面相似。例如,通过使用MySQL的binlog复制协议或PostgreSQL的复制插槽。

Debezium提供了一种连接器库支持当今可用的各种数据库。这些连接器可以监视和记录数据库模式中的行级更改,然后将更改发布到诸如Kafka的流服务上。由于Debezium也需要Apache Kafka和ZooKeeper,因此设置Debezium并在生产环境中运行将更具挑战性。

Netflix计划于2020年开源的数据库数据复制重器:DBLog,一个类似Oracle OGG的通用的变更数据捕获CDC框架

Debezium是执行CDC的最有效方法

使用嵌入式Debezium和SpringBoot捕获更改数据事件