mysqlbinlog下载_实时数仓之Maxwell读取MySQL binlog日志

下载maxwell

解压maxwell

修改MySQL的配置文件my.cnf

9bae43be4cf3fc95204ca54c45e2d7bb.png
PS:binlogformat必须设为ROW模式,如果设为其他模式,比如binlogformat = STATEMENT,启动maxwell时会报错
d7986ecfbfc1d651d2cba97fc1cbd8d8.png

启动MySQL

e6c189095db670083188967cfe357cc3.png

创建maxwell的数据库和用户

62ba90c7bdbfebf9dfe73657303197b8.png

在MySQL中创建一个测试数据库和表

20d5b718cd2b0fe82782efc296d61224.png
700071c363f5c14fe17aa929128a5cff.png

启动maxwell进程,首先使用stdout模式测试一下

0a8ae562f106302bce527814a212d4c0.png

向测试表中insert一条数据

3cd2eccd0680c1735a52e7f2d8dbdd04.png

查看maxwell控制台

f7db0ea6b290e532b4ee1972641c2dc8.png

再insert一条数据,查看下binlog日志内容

8296e08ca110cb39c74ebcd535044ede.png

首先使用show binlog events的方式查看

c2131dbfb65cd9b6dafd6b2d484b21ae.png

从解析的binlog中可以看出row模式下,DML操作会记录为:TABLEMAPEVENT+ROWLOGEVENT(包括WRITEROWSEVENT ,UPDATEROWSEVENT,DELETEROWSEVENT).

为什么一个update在ROW模式下需要分解成两个event: 一个Tablemap,一个Updaterows。我们想象一下,一个update如果更新了10000条数据,那么对应的表结构信息是否需要记录10000次?其实是对同一个表的操作,所以这里binlog只是记录了一个Tablemap用于记录表结构相关信息,而后面的Updaterows记录了更新数据的行信息,注意此表中的table_id是会变化的。

然后使用/usr/local/mysql/bin目录下的mysqlbinlog工具解析binlog日志

69f339336c89e5ccbdad41301be072ce.png

完全看不懂,这时需要添加参数(--base64-output=decode-rows -v)对输出结果解码

52079e0bb0cd8d13f9390ca00af2ca9a.png

可以看到Mysql每次列的修改(update)都需要记录表中所有列的值。这样就存在一个问题,如果表中包含很多的大字段,表的单行长度就会非常长,这样每次update就会导致大量的 binlog空间生成。针对这个问题,在mysql 5.6中进行了改进,复制支持”row image control” ,只记录修改的列而不是行中所有的列,这对一些包含 BLOGs 字段的数据来说可以节省很大的处理能力,因此此项改进不仅节省了磁盘空间,同时也提升了性能。

当数据库的binlog format 是statement 模式时,查看下binlog日志

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值