mysql触发器是异步,MySQLCDC,流二进制日志和异步触发器

bc3f9276acf88283a0569b9b9ef9ee92.png

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

在本文中,我们将研究MySQL CDC,流二进制日志和异步触发器。

更改数据捕获(CDC)跟踪数据更改(通常接近实时)。在MySQL中,跟踪数据更改的最简单且可能最有效的方法是使用二进制日志。但是,存在其他方法。例如:

常规日志或审核日志插件(用于记录所有查询,而不仅仅是更改)

MySQL触发器(不建议使用,因为它会降低应用程序的速度 以下更多信息)

用于MySQL的CDC的第一个实现是Justin Swanhart的FlexCDC项目。如今,有许多CDC实现(请参见mysql-cdc-projects wiki中的长列表)。

CDC可以实现各种任务,例如审计,将数据复制到另一个系统或处理(和响应)事件。在此博客文章中,我将演示如何使用CDC方法流式传输MySQL二进制日志,处理事件并将其保存(流式传输)到另一个MySQL实例(或MongoDB)。另外,我将展示如何通过流二进制日志来实现异步触发器。

您可以使用mysqlbinlog实用工具,通过添加 -vvv (详细选项)来读取二进制日志。 mysqlbinlog还可以显示基于ROW的复制的人类可读版本。例如:

从MySQL 5.6开始,mysqlbinlog还可以从远程主站(” fake”复制从站)读取二进制日志事件。

读取二进制日志是CDC的重要基础。但是,仍然存在一些挑战:

基于ROW的复制可能是获得RAW更改的最简单方法,否则,我们将不得不解析SQL。同时,基于ROW的复制二进制日志不包含表元数据,即,它不记录字段名称,仅记录字段编号(如上例中的@@ 1是表中的第一个字段) a )。

我们将需要以某种方式记录和存储二进制日志位置,以便可以在任何时候重新启动该工具并从最后一个位置继续运行(例如MySQL复制从站)。

Zenp最近发布的

Maxwell守护程序(Maxwell = MySQL + Kafka),读取MySQL Binlog并将行更新写为JSON(它可以写入Kafka,这是其主要目标,但也可以写入stdout,并且可以扩展用于其他目的)。 Maxwell将有关MySQL表和二进制日志事件的元数据(以及其他元数据)存储在MySQL内部,因此可以解决上述列表中的潜在问题。

这里是麦克斯韦的快速演示:

在本示例中可以看到,Maxwell从MySQL复制流中获取事件并将其输出到stdout(如果更改生产者,则可以将其保存到Apache Kafka)。

如果要将事件保存到其他地方,我们可以使用MongoDB或MySQL JSON字段以及文档存储(因为Maxwell将提供JSON文档的使用)。为了简单的概念证明,我创建了Node.js脚本来实现CDC“pipleline”:

要运行它,我们可以使用管道:

可以使用相同的方法通过mongoimport将CDC事件保存到MongoDB:

在上面的示例中,我们仅记录了二进制日志事件。现在我们可以添加”反应”。

一种实用的应用程序是重新实现MySQL触发器以提高性能。 MySQL触发器针对每一行执行,并且是同步的(在触发器事件完成之前,查询不会返回)。众所周知,这会导致性能下降,并且会显着降低批量操作的速度(即“将数据加载到文件中”或“插入到值( ),( ) 中”)。使用触发器,MySQL将不得不逐行处理bulk操作,从而降低性能。另外,在使用基于语句的复制时,从服务器上的触发器会减慢复制线程的速度(如今,与基于ROW的复制和可能的多线程从服务器的相关性已大大降低)。

(具有使用Maxwell的功能)从MySQL读取二进制日志的功能,我们现在可以以异步模式处理事件并重新实现触发器,而又不会延迟MySQL操作。 Maxwell为我们提供了一个带有“new”和“old”值的JSON文档(默认选项binlog_row_image = FULL,MySQL会记录以前的值以进行更新和删除),我们可以使用它来创建触发器。>

并非所有触发器都可以基于二进制日志轻松地重新实现。但是,根据我的经验,MySQL中的大多数触发器都用于:

审核(如果您删除了一行,则先前的值是什么,和/或谁做了,何时做)。

丰富现有表格(即更新同一表格中的字段)。

这是一种快速算法,用于说明如何使用Maxwell重新实现触发器:

找到触发器表和触发器事件文本(SQL)。

创建一个应用或脚本来解析触发器表的JSON。

创建新版本的SQL来更改NEW。< field>到“data.field”(来自JSON)和OLD。< field>到“old.field”(来自JSON)。

例如,如果我想审核“transactions”表中的所有删除,我可以使用Maxwell和一个简单的Python脚本来实现(不要在生产中使用它,这是非常有用的。基本示例):

MySQL:

麦克斯韦管道:

Maxwell是为基于ROW的复制的MySQL 5.6设计的。尽管它可以与MySQL 5.7一起使用,但它不支持新的MySQL 5.7数据类型(即JSON字段)。 Maxwell不支持GTID,并且不能基于GTID进行故障转移(它可以解析具有GTID的事件)。

流式传输MySQL二进制日志(例如,使用Maxwell应用程序)可以帮助实现CDC以进行审计和其他目的,还可以实现异步触发器(删除MySQL级别的触发器可以提高MySQL的性能)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值