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 ...
随机推荐
- 操作系统实现-loader
博客网址:www.shicoder.top 微信:18223081347 欢迎加群聊天 :452380935 大家好呀,终于我们到了操作系统的loader部分了,loader也是操作系统中最重要的一个 ...
- How to fetch data with React Hooks
Where can I make API call with hooks in react? Async useEffect is pretty much unreadable How to fetc ...
- linux篇-基于域名的apache服务器
1承接上个博客说的,咱们继续扩展 Cd /usr/local/apache2/conf /usr/local/apache2/conf/extra扩展文件 Vi httpd-vhosts.conf & ...
- Hadoop进程理解
进程理解 HDFS相关进程理解(NN,DN,SSN) NameNode中存放的是数据文件与元数据的映射信息,数据文件和block快的映射信息,block块和DataNode的映射信息,前两者存放在磁盘 ...
- 博弈论(nim游戏,SG函数)
说到自己,就是个笑话.思考问题从不清晰,sg函数的问题证明方法就在眼前可却要弃掉.不过自己理解的也并不透彻,做题也不太行.耳边时不时会想起alf的:"行不行!" 基本的小概念 这里 ...
- Mysql 存储引擎以及 SQL语句
存储引擎 文件格式有很多种,针对不同的文件格式会有对应的不同存储方式和处理机制. 针对不同的数据应该有对应的不同处理机制来存储. 存储引擎就是不同的处理机制 MySQL主要的存储引擎 Innodb 是 ...
- Redis - 持久化 AOF 和 RDB
Redis - 持久化 AOF 和 RDB AOF AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格 ...
- JavaScript Number -> String
六种将Number类型转化为String类型的方法: 方法一:通过+运算符加上一个空字符串: eg:'' + 5 -> '5' 5 + '' -> '5' 方法二:toStrin ...
- 超级重磅!Apache Hudi多模索引对查询优化高达30倍
与许多其他事务数据系统一样,索引一直是 Apache Hudi 不可或缺的一部分,并且与普通表格式抽象不同. 在这篇博客中,我们讨论了我们如何重新构想索引并在 Apache Hudi 0.11.0 版 ...
- 开发工具-Visual Studio / Visual Studio Code 官方下载地址
更新记录 2022年6月10日 完善标题. Visual Studio官方下载地址 https://visualstudio.microsoft.com/ Visual Studio Code官方下载 ...