在我的数据库中,我希望在每次更改时跟踪列的值。以某种方式,每次字段值更改时,我们都可以知道前一个值是什么。为每个值分配时间戳会很棒我正在使用MySQL作为数据库服务器。
答案 0 :(得分:4)
为此,您需要创建一个触发器,这是在给定表上发生INSERT, UPDATE, DELETE
时触发的事件。
查看CREATE TRIGGER的文档。
对于你想要做的事情,你可能需要有一个辅助表,在主表上为每个INSERT/UPDATE
插入一行,AFTER
它包含更改的行的ID,旧值表示新值和时间戳。
答案 1 :(得分:1)
很抱歉,我的答案很晚,我想提到另一个未在其他答案maxwell中调用的工具,它是CDC,它可以读取binlog并在Kafka上发送消息。该解决方案的最大优势在于它不需要对MySQL服务器进行任何更改(无需创建触发器即可..)。
答案 2 :(得分:0)
这是我的建议。这可能是一点点工作,但如果你这样做,我真的认为你将有一个可靠的方法在MySQL中进行变更数据捕获。请记住,在考虑锁定和隔离级别等问题时,在数据库中进行更改跟踪实际上是一件非常难的事情。我强烈建议使用这样的流程。
从iAnywhere查看名为MobiLink的产品。您可以从here下载免费的开发人员版本。 MobiLink的目的是允许您将数据库中的数据更改同步到SQL Anywhere数据库。当然,您感兴趣的唯一部分是能够从MySQL获得更改。幸运的是,MobiLink将在MySQL数据库中非常有效地创建这些变更数据捕获触发器。实际上,它甚至会为您提供用于执行此操作的sql脚本,以防您再次需要执行此操作。之后,您可以卸载SQL Anywhere。
首先,安装后会有一个名为Sybase Central的产品需要打开。当这个打开时,会有一个向导,它将引导您完成针对MySQL数据库的MobiLink配置。我认为如果你遇到困难我会安装帮助,但我现在无法访问它来验证。
完成向导后,它将配置MySQL数据库以进行更改数据捕获。如果您查看数据库,您还将拥有所需的所有触发器和更改跟踪列。
希望有所帮助....
答案 3 :(得分:0)
触发器并不总是记录数据库中更改事件的最佳方式。因为一旦表的模式发生变化,触发器就会失效,从而导致实际的表操作失败。
对于mysql,您需要从二进制日志文件中捕获更改事件。 Mysql提供API来读取二进制日志(发布版本5.6)。
您可能还想查看Flexviews,它提供Oracle,例如物化视图日志,以记录更改事件。
答案 4 :(得分:0)
我创建了一个名为cdc_audit的工具,可以在mysql中为任何或所有表自动创建审计表,甚至可以保留预先存在的触发器。我用变更数据捕获(用于数据仓库ETL应用程序)编写了它。也许你或某人会发现它很有用。
我也是blogged about it。
功能
答案 5 :(得分:0)
我建议您看一下Debezium的开放源CDC平台,其中包括supports MySQL。
您可以使用Debezium将更改流式传输到Apache Kafka中,但是通过其embedded mode,您也可以将Debezium连接器用作Java应用程序中的库,并将数据更改轻松地传播到其他流式API(例如Kinesis)等
免责声明:我是Debezium项目的负责人。