Canal实时解析mysql binlog数据实战
一、说明
通过canal实时监听mysql binlog日志文件的变化,并将数据解析出来
二、环境准备
1、创建maven项目并修改pom.xml配置文件
<dependencies>
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.4</version>
</dependency>
</dependencies>

2、嗦代码
特别说明:在解析数据时,相当于程序时客户端,客户在连接canal服务端是时不需要用户名和密码
import com.alibaba.fastjson.JSONObject;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException; import java.net.InetSocketAddress;
import java.util.List; public class CanalClient {
public static void main(String[] args) throws InterruptedException, InvalidProtocolBufferException { // 获取连接
CanalConnector canalConnector=CanalConnectors.newSingleConnector(new InetSocketAddress("192.168.140.131",11111),
"example","",""); while(true)
{
// 连接
canalConnector.connect();
// 订阅数据库
canalConnector.subscribe("CanalDb.*");
// 获取数据
Message message = canalConnector.get(100);
// 获取Entry集合
List<CanalEntry.Entry> entries=message.getEntries();
// 判断集合是否为空,如果为空,则线程等待一分钟再拉取数据
if (entries.size()<=0)
{
System.out.println("档次抓取没有数据,休息一会儿。。。");
Thread.sleep(2000);
}
else
{
// 遍历entries,单条解析
for (CanalEntry.Entry entry:entries)
{
// 1,获取表名
String tableName=entry.getHeader().getTableName();
// 2,获取类型
CanalEntry.EntryType entryType=entry.getEntryType();
// 3,获取序列化后的数据
ByteString storeValue=entry.getStoreValue();
// 4.判断当前entryType类型是否为ROWDATA
if (CanalEntry.EntryType.ROWDATA.equals(entryType))
{
//5.反序列化数据
CanalEntry.RowChange rowChange=CanalEntry.RowChange.parseFrom(storeValue);
//6.获取当前事件的操作类型
CanalEntry.EventType eventType=rowChange.getEventType();
//7.获取数据集
List<CanalEntry.RowData> rowDataList=rowChange.getRowDatasList();
//8.遍历rowDataList并打印数据集
for(CanalEntry.RowData rowData:rowDataList)
{
JSONObject beforData=new JSONObject();
List<CanalEntry.Column> beforClountList=rowData.getBeforeColumnsList();
for (CanalEntry.Column column:beforClountList)
{
beforData.put(column.getName(),column.getValue());
}
JSONObject afterData=new JSONObject();
List<CanalEntry.Column> afterClountList=rowData.getAfterColumnsList();
for (CanalEntry.Column column:afterClountList)
{
afterData.put(column.getName(),column.getValue());
}
// 打印数据
System.out.println(""+tableName+
",EventType:"+eventType+
",Before:"+beforData+
",After:"+afterData);
} }
else
{
System.out.println("当前操作类型为"+entryType);
}
}
}
}
}
}
三、项目效果

Canal实时解析mysql binlog数据实战的更多相关文章
- 关于使用Binlog和canal来对MySQL的数据写入进行监控
先说下Binlog和canal是什么吧. 1.Binlog是mysql数据库的操作日志,当有发生增删改查操作时,就会在data目录下生成一个log文件,形如mysql-bin.000001,mysql ...
- 腾讯工程师带你深入解析 MySQL binlog
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯云数据库内核团队 发布在云+社区 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的red ...
- canal+kafka订阅Mysql binlog将数据异构到elasticsearch(或其他存储方式)
canal本质就是"冒充"从库,通过订阅mysql bin-log来获取数据库的更改信息. mysql配置(my.cnf) mysql需要配置my.cnf开启bin-log日志并且 ...
- 采用OpenReplicator解析MySQL binlog
Open Replicator是一个用Java编写的MySQL binlog分析程序.Open Replicator 首先连接到MySQL(就像一个普通的MySQL Slave一样),然后接收和分析b ...
- Canal:同步mysql增量数据工具,一篇详解核心知识点
老刘是一名即将找工作的研二学生,写博客一方面是总结大数据开发的知识点,一方面是希望能够帮助伙伴让自学从此不求人.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我们一起进 ...
- debezium、kafka connector 解析 mysql binlog 到 kafak
目的: 需要搭建一个可以自动监听MySQL数据库的变化,将变化的数据捕获处理,此处只讲解如何自动捕获mysql 中数据的变化 使用的技术 debezium :https://debezium.io/d ...
- 基于Spark Streaming + Canal + Kafka对Mysql增量数据实时进行监测分析
Spark Streaming可以用于实时流项目的开发,实时流项目的数据源除了可以来源于日志.文件.网络端口等,常常也有这种需求,那就是实时分析处理MySQL中的增量数据.面对这种需求当然我们可以通过 ...
- 带你解析MySQL binlog
前言: 我们都知道,binlog可以说是MySQL中比较重要的日志了,在日常学习及运维过程中,也经常会遇到.不清楚你对binlog了解多少呢?本篇文章将从binlog作用.binlog相关参数.解析b ...
- redis 实时从mysql 更新数据
现在的互联网普遍都用redis+mysql ,查询一般放在 redis 上,更改 放在 redis 上, 如果更新 mysql数据到 redis 上呢? mysql 有四中类型的日志 Error ...
随机推荐
- django-rest-framework 基础三 认证、权限和频率
django-rest-framework 基础三 认证.权限和频率 目录 django-rest-framework 基础三 认证.权限和频率 1. 认证 1.1 登录接口 1.2 认证 2. 权限 ...
- 【mq】从零开始实现 mq-09-消费者拉取消息 pull message
前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...
- HDFS High Availability(HA)高可用配置
高可用性(英语:high availability,缩写为 HA) IT术语,指系统无中断地执行其功能的能力,代表系统的可用性程度.是进行系统设计时的准则之一. 高可用性系统意味着系统服务可以更长时间 ...
- OAuth2.0之OLTU实现举例
一.场景 三个角色:用户(user),web应用(client),资源服务器和授权服务器合为服务器(server) 用户登录登录后可查看自己的信息 二.准备 2.1 数据库 schema drop t ...
- Hadoop入门学习笔记(二)
Yarn学习 YARN简介 YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度 YARN功能说明 资源管理系统:集群的硬件资源,和程序运行相关,比如内存.CPU等. 调度平 ...
- neo4j删除节点和关系
两种方法: 一.用下列 Cypher 语句: match (n) detach delete n 原理:匹配所有的节点,然后进行删除. 二. 从文件系统上删除对应的数据库. 1.停掉服务: 2.删除 ...
- 数位 dp 总结
数位 dp 总结 特征 问你一个区间 \([L,R]\) 中符合要求的数的个数 一个简单的 trick :把答案拆成前缀和 \(Ans(R)-Ans(L-1)\) 如何求 \(Ans()\) ,就要用 ...
- DevOps落地实践点滴和踩坑记录-(1)
记录初衷 本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分享给和我一样的一线 ...
- 技术分享 | app测试中常用的Android模拟器
原文链接 Emulator Emualor 是 Android Studio 自带的模拟器,是官方提供的工具,Android 开发最常使用的就是这一款. 它功能非常齐全,电话本.通话等功能都可正常使用 ...
- JS:构造函数
定义:在JavaScript中,用new关键字来调用的函数,称为构造函数,构造函数首字母一般大写. 理解: 构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象. 创建对象, ...