一、说明

通过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数据实战的更多相关文章

  1. 关于使用Binlog和canal来对MySQL的数据写入进行监控

    先说下Binlog和canal是什么吧. 1.Binlog是mysql数据库的操作日志,当有发生增删改查操作时,就会在data目录下生成一个log文件,形如mysql-bin.000001,mysql ...

  2. 腾讯工程师带你深入解析 MySQL binlog

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯云数据库内核团队 发布在云+社区 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的red ...

  3. canal+kafka订阅Mysql binlog将数据异构到elasticsearch(或其他存储方式)

    canal本质就是"冒充"从库,通过订阅mysql bin-log来获取数据库的更改信息. mysql配置(my.cnf) mysql需要配置my.cnf开启bin-log日志并且 ...

  4. 采用OpenReplicator解析MySQL binlog

    Open Replicator是一个用Java编写的MySQL binlog分析程序.Open Replicator 首先连接到MySQL(就像一个普通的MySQL Slave一样),然后接收和分析b ...

  5. Canal:同步mysql增量数据工具,一篇详解核心知识点

    老刘是一名即将找工作的研二学生,写博客一方面是总结大数据开发的知识点,一方面是希望能够帮助伙伴让自学从此不求人.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我们一起进 ...

  6. debezium、kafka connector 解析 mysql binlog 到 kafak

    目的: 需要搭建一个可以自动监听MySQL数据库的变化,将变化的数据捕获处理,此处只讲解如何自动捕获mysql 中数据的变化 使用的技术 debezium :https://debezium.io/d ...

  7. 基于Spark Streaming + Canal + Kafka对Mysql增量数据实时进行监测分析

    Spark Streaming可以用于实时流项目的开发,实时流项目的数据源除了可以来源于日志.文件.网络端口等,常常也有这种需求,那就是实时分析处理MySQL中的增量数据.面对这种需求当然我们可以通过 ...

  8. 带你解析MySQL binlog

    前言: 我们都知道,binlog可以说是MySQL中比较重要的日志了,在日常学习及运维过程中,也经常会遇到.不清楚你对binlog了解多少呢?本篇文章将从binlog作用.binlog相关参数.解析b ...

  9. redis 实时从mysql 更新数据

    现在的互联网普遍都用redis+mysql ,查询一般放在 redis  上,更改 放在 redis  上, 如果更新 mysql数据到  redis 上呢? mysql 有四中类型的日志 Error ...

随机推荐

  1. 项目实战:Qt+OpenCV大家来找茬(Qt抓图,穿透应用,识别左右图区别,框选区别,微调位置)

    前言   本项目的出现理由只是笔者的一个念头,于是利用专业Qt和Opencv相关的知识开发一个辅助工具,本文章仅用于Qt和Opencv结合的学习.   Demo演示效果          运行包下载地 ...

  2. netty系列之:netty中常用的对象编码解码器

    目录 简介 什么是序列化 重构序列化对象 序列化不是加密 使用真正的加密 使用代理 Serializable和Externalizable的区别 netty中对象的传输 ObjectEncoder O ...

  3. Fail2ban 命令详解 fail2ban-server

    Fail2ban的服务端操作命令,用于启动一个Fail2ban服务. root@local:~# fail2ban-server --help Usage: /usr/bin/fail2ban-ser ...

  4. NBMiner42.1版本发布,完全解锁30系LHR版本显卡

    2021年下半年,NVIDIA发布了LHR版本显卡,对显卡算力进行了限制. 2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核中加入了100%LHR解锁器,适用于Wind ...

  5. 【Java】在IDEA中将Javafx项目打包成为可运行的.jar文件

    在使用Javafx制作一个图形化界面程序的时候,我遇到了打包文件的难题. 按照网上给出的解决方案构建出来的jar文件总是没有办法运行. 以下是我最终的解决方案. 我使用的IDE是IntelliJ ID ...

  6. 「ABC 249Ex」Dye Color

    考虑停时定理. 初始势能为 \(\sum \Phi(cnt_i)\),末势能为 \(\Phi(n)\),我们希望构造这样一个 \(\Phi:Z\to Z\) 函数,使得每一次操作期望势能变化量为常数. ...

  7. React项目实现导出PDF的功能

    在做web项目中,有时候会遇到pdf导出的需求,现根据之前在公司的React项目中遇到的导出PDF需求,整理一个demo出来. 导出PDF需要用到两个依赖包:html2canvas.jspdf 1.安 ...

  8. 干货合集│最好用的 python 库都在这

    一.分词 - jieba 优秀的中文分词库,依靠中文词库,利用词库确定汉子之间关联的概率,形成分词结果 import jieba word = '伟大的中华人民共和国' jieba.cut(word) ...

  9. pycharm相关介绍

    一.settings设置   1.搜font 设置字体 2.Keymap------快捷键 二.常用快捷键 1.Ctrl + Enter:在下方新建行但不移动光标: 2.Shift + Enter:在 ...

  10. WIN32 API 获取文件版本信息

    CString strVersion; CString strPath(_T("xxxxxxxx.exe")); // 读文件信息 DWORD dwVerHnd = 0; DWOR ...