MySQL80,二进制日志的一大改进

破产码农

IT圈最会讲故事的网红·南山彭于晏

很多同学吐槽MySQL数据同步没有采用物理复制,而是使用逻辑的二进制日志,因此抱怨主从数据同步较慢。

然而,随着基于WRITESET并行复制技术推出,以及MySQL8.0快速加列功能的诞生,只要架构设计得当,MySQL主从数据延迟的问题几乎已不存在。

相反,姜老师在过去的文章中,一再强调二进制日志是MySQL数据库成功的关键。如:移除MySQLBinlog?亲,你根本不懂MySQL呐~~~

逻辑日志意味着MySQL中的数据不会是一个终点,它可以方便地流向用户想要使用的业务场景。

例如在MySQL数据库的数据可以准实时地推送给ElasticSearch做检索,发送给Spark做推荐分析,等等。

相比,Oracle、MicrosoftSQLServer、PostgreSQL,他们这方面就明显弱很多。

因为,物理日志不好实现异构系统的数据同步。

当然,物理日志vs逻辑日志的问题,之前都已分析过。

今天讨论的重点是MySQL8.0中关于二进制日志的改进。

二进制日志的元数据

通过二进制日志,可以非常容易捕获MySQL数据库中的变更,从而推送给其他数据平台。

但是,二进制日志中是否有存储每条记录的元数据信息呢?例如:

每条记录对应的库名是什么?

每条记录对应的表名是什么?

每条记录中每个列的类型是什么?

每条记录中每个列的名称是什么?

每条记录中,哪个列是主键?

可以通过命令mysqlbinlog来解析二进制日志,回答上面的问题:

上面的这张图显示了通过命令mysqlbinlog对二进制日志binlog.的解析结果。

可以看到类型为Table_map的二进制日志event,可以捕获这条记录对应的库名和表名。

类型为Write_rows的二进制日志event,表明这条记录是由INSERT操作记录的二进制日志。

下面的的

=3/*INTmeta=0nullable=0is_null=0*/表示插入记录的列值为3,类型是INT。

也就是说,对于上面的5个问题,其中3个二进制日志是有保存对应信息的。

然而,二进制日志中并没有存储每条记录每个列的名称,以及哪个列是主键的元数据信息。

这些信息对于DTS(DataTransferService)服务来说,非常关键。

因此,如果通过MySQL二进制日志实现DTS服务,需要额外的手段获取这些信息。

业界开源DTS做得比较好的是Maxwell。

简单易用,用JSON描述二进制日志中每条记录的信息,并发送到Kafka:

通过上面的例子,可以看到Maxwell可以捕获每条记录的列名。这里是id、m、c、


转载请注明:http://www.aierlanlan.com/grrz/468.html