背景
先前开源了一个开源项目: 【阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费】
本文主要是介绍一下canal1.0.3支持mysql5.6协议上的变化.
协议变化
1. binlog checksum
mysql5.6之后,支持在binlog对象中增加checksum信息,比如CRC32协议. 其原理主要是在原先binlog的末尾新增了4个byte,写入一个crc32的校验值.
对应参数说明: http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_checksum
注意:
- mysql5.6.6之后默认就会开启checksum.
- 如果canal要开启checksum协议支持,需要设置session参数,目前canal只解析checksum,并没有对checksum进行校验
set @master_binlog_checksum= '@@global.binlog_checksum'
2. INSERT/UPDATE/DELETE协议变化
public static final int WRITE_ROWS_EVENT_V1 = 23; public static final int UPDATE_ROWS_EVENT_V1 = 24; public static final int DELETE_ROWS_EVENT_V1 = 25; /** Version 2 of the Row events */ public static final int WRITE_ROWS_EVENT = 30; public static final int UPDATE_ROWS_EVENT = 31; public static final int DELETE_ROWS_EVENT = 32;
新增了version 2的协议,主要的变化,就是增加了self check extra的信息,和checksum一样保证数据的完整性.
默认值为0,也就是会开启version 2协议,mysql5.5之前默认是version 1协议
3. RowsQueryLogEvent事件新增
对应事件说明: http://dev.mysql.com/worklog/task/?id=5404 ,(主要用途:就是在RBR模式下,也可以输出原始执行insert/update/delete的sql信息)
默认值为false,代表不开启。 如果设置为true,对应的一个事务中的LogEvent事件就会变为: (RowsQuery会出现在tableMap协议之前)
Query : Begin RowsQuery: insert/update/delete sql TableMap : Rows : Write/Update/DELETE Query/XId
4. 其他协议变化
- HEARTBEAT_LOG_EVENT = 27 ##主要用途:在mysql idle期间,发送一些heartbeat事件,对应事件的内容是上一次最后发送的LogEvent信息
- IGNORABLE_LOG_EVENT = 28 ## 可忽略的logEvent事件概念,这是mysql为了后续协议扩展引入的,在低版本mysql发现无法识别LogEvent时,可根据LOG_EVENT_IGNORABLE_F标志来判断是否可以直接丢弃.
- GTID_LOG_EVENT = 33
- ANONYMOUS_GTID_LOG_EVENT = 34
- PREVIOUS_GTIDS_LOG_EVENT = 35
目前gtid协议只是解析,并没有使用GTID发起COM_BINLOG_DUMP,后续会考虑支持.
5. 新增type : TIME2/DATETIME2/TIMESTAMP2
public static final int MYSQL_TYPE_TIMESTAMP2 = 17; public static final int MYSQL_TYPE_DATETIME2 = 18; public static final int MYSQL_TYPE_TIME2 = 19;
新增了3种mysql type类型,和5.5之前的有不同的存储格式,最可恶的是居然是采用了Big-Endian,和之前的所有事件解析litten-Endian形成一个对比,不知道mysql那帮人怎么想的
测试
1. mysql版本: 5.6.10
2. mysql server配置 :
server-id=1 binlog-checksum=CRC32 #binlog-checksum=NONE master-verify-checksum=1 slave-sql-verify-checksum=1 log-bin=mysql-bin binlog-format=ROW binlog-rows-query-log-events=true log-bin-use-v1-row-events=1 binlog_cache_size=2M max_binlog_size=512M sync_binlog=0 character-set-server = utf8 #default-character-set = utf8 collation-server = utf8_unicode_ci [mysql] default-storage-engine=INNODB default-character-set=utf8
3. 测试注意(需要设置master_binlog_checksum变量,和mysql server保持一致)
Connection connection = DriverManager.getConnection("jdbc:mysql://10.20.144.34:3306", "root", "root"); Statement statement = connection.createStatement(); statement.execute("SET @master_binlog_checksum='@@global.binlog_checksum'");
相关推荐
解决现在开源版本canal使用mysql5.6.19版本以上bug,mysql连接不断开的bug
canal实现mysql到ES数据实时同步
mysql需开启binlog 查看是否开启binlog SHOW VARIABLES LIKE '%log_bin%' 如果log_bin的值为OFF是未开启,为ON是已开启。 未开启的话可以修改/etc/my.cnf 开启binlog [mysqld] log-bin=mysql-bin binlog-format=...
canal 的 mysql 与 redis/memcached/mongodb 的 nosql 数据实时同步方案
canal + rabbitmq监听mysql数据库binlog文件,从而监听数据库更新操作,可以扩展为同步es或者redis缓存!
Canal 监听 Mysql 自动写入 Kafka 并消费 配置 Windows 版
canal同步mysql,基于springboot2.0.6,使用undertow容器,可直接运行。
canal_mysql_elasticsearch_sync支持请星 :sparkles: 交流Q群:733688083 canal于v1.1.2版本后,已支持自动同步到Elasticsearch。赞canal! 基于运河的Mysql的与Elasticsearch实时同步的的JavaWeb服务。 canal是...
基于canal的mysql和elasticsearch实时同步源代码.zip
基于canal 的 mysql 与 redis/memcached/mongodb 的 nosql 数据实时同步方案 案例,canal client
基于canal的mysql和elasticsearch实时同步方案,支持增量同步和全量同步。
MySQL与Elasticsearch实时同步方案 - ...该项目为用户提供了一个基于Canal的MySQL与Elasticsearch实时同步方案,支持增量同步和全量同步,通过界面交互和功能模块,为用户提供了一个高效、易用的实时数据同步解决方案。
canal_mysql_elasticsearch_sync 支持请star:sparkles: 基于 canal 的 Mysql 与 Elasticsearch 实时同步的 javaweb 服务。 canal是阿里巴巴mysql数据库binlog的增量订阅&消费组件。 工作原理 全量 暴露Http接口...
基于canal的mysql和elasticsearch实时同步方案,支持增量同步和全量同步.zip
Canal 是mysql数据库binlog的增量订阅&消费组件。 基于日志增量订阅&消费支持的业务: 数据库镜像 数据库实时备份 多级索引 (卖家和买家各自分库索引) search build 业务cache刷新 价格变化等重要业务消息 关于 ...
2.对mysql binlog(row) parser 这一步交给canal 3.MQ对解析后binlog增量数据的推送 4.对MQ数据的消费(接收+数据解析,考虑消费速度,MQ队列的阻塞) 5.数据写入/修改到nosql (redis的主从/hash分片) 6.保证...
基于canal中间件的mysql数据库线上库移数据导历史库
最新版阿里开源中间件canal实现mysql数据库同步,零侵入不写代码实现,也可以通过整合到项目程序实现更加灵活的控制。详细使用方法:https://blog.csdn.net/u014374009/category_9409106.html
使用docker-compose 一键启动canl 以及 canal_adapt,使监听mysql的数据的变化,将数据自动同步到es中,可以支持es6.x ,es7.x, 其他的版本尚未验证; 使用之前需要启动mysql 的binlog; 不会的话,这里附上链接: ...