下载maxwell
解压maxwell
修改MySQL的配置文件my.cnf
![9bae43be4cf3fc95204ca54c45e2d7bb.png](https://i-blog.csdnimg.cn/blog_migrate/47186b96ef89e606bb14844e2e44d8f3.jpeg)
PS:binlogformat必须设为ROW模式,如果设为其他模式,比如binlogformat = STATEMENT,启动maxwell时会报错
![d7986ecfbfc1d651d2cba97fc1cbd8d8.png](https://i-blog.csdnimg.cn/blog_migrate/8de26a5216a43e9e4a3d50f54e959ff7.jpeg)
启动MySQL
![e6c189095db670083188967cfe357cc3.png](https://i-blog.csdnimg.cn/blog_migrate/71577898eb9056302a6d8baa678d37e9.jpeg)
创建maxwell的数据库和用户
![62ba90c7bdbfebf9dfe73657303197b8.png](https://i-blog.csdnimg.cn/blog_migrate/c49cef66022e284692f1c1d843487436.jpeg)
在MySQL中创建一个测试数据库和表
![20d5b718cd2b0fe82782efc296d61224.png](https://i-blog.csdnimg.cn/blog_migrate/8112cc1bfb09ab25704c407bd9c51cc7.jpeg)
![700071c363f5c14fe17aa929128a5cff.png](https://i-blog.csdnimg.cn/blog_migrate/c62bd517aafcaf830cf159a6fb7205bb.jpeg)
启动maxwell进程,首先使用stdout模式测试一下
![0a8ae562f106302bce527814a212d4c0.png](https://i-blog.csdnimg.cn/blog_migrate/c1ae8ab7a608653087e2e0fd152af41d.jpeg)
向测试表中insert一条数据
![3cd2eccd0680c1735a52e7f2d8dbdd04.png](https://i-blog.csdnimg.cn/blog_migrate/d85ba284e6b8803971097f3b241e6592.jpeg)
查看maxwell控制台
![f7db0ea6b290e532b4ee1972641c2dc8.png](https://i-blog.csdnimg.cn/blog_migrate/1b7ed4c702aa59e31bc7322750e6ff94.jpeg)
再insert一条数据,查看下binlog日志内容
![8296e08ca110cb39c74ebcd535044ede.png](https://i-blog.csdnimg.cn/blog_migrate/084420baa47496f948bbdae90dee02c2.jpeg)
首先使用show binlog events的方式查看
![c2131dbfb65cd9b6dafd6b2d484b21ae.png](https://i-blog.csdnimg.cn/blog_migrate/78b9410ac503cf288ec600a65359d117.jpeg)
从解析的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](https://i-blog.csdnimg.cn/blog_migrate/089875644b4e640d9d8a1d11c40a3f28.jpeg)
完全看不懂,这时需要添加参数(--base64-output=decode-rows -v)对输出结果解码
![52079e0bb0cd8d13f9390ca00af2ca9a.png](https://i-blog.csdnimg.cn/blog_migrate/7ee5e986710f091aa2befaf468d9d39c.jpeg)
可以看到Mysql每次列的修改(update)都需要记录表中所有列的值。这样就存在一个问题,如果表中包含很多的大字段,表的单行长度就会非常长,这样每次update就会导致大量的 binlog空间生成。针对这个问题,在mysql 5.6中进行了改进,复制支持”row image control” ,只记录修改的列而不是行中所有的列,这对一些包含 BLOGs 字段的数据来说可以节省很大的处理能力,因此此项改进不仅节省了磁盘空间,同时也提升了性能。
当数据库的binlog format 是statement 模式时,查看下binlog日志
![f01f4c3e11889614335961d32f1386e3.png](https://i-blog.csdnimg.cn/blog_migrate/029af55b02155c324d96bdcfa44a5a45.jpeg)