binlog区分业务修改还是手动修改

 一、Windows下开启MySQL binLog日志

首先要开启MySQL的BinLog 管理

show variables like '%log_bin%';



如果发现log_bin是OFF,打开mysql文件夹下面的my.ini,修改一下
在 [mysqld] 下面加

# 开启bin-log
log-bin=mysql-bin          # 开启binlog功能
binlog-format=ROW          # 设置binlog格式
server_id=1                # 设置服务ID号


保存之后重启服务
 二、java代码实现
pom引入jar

<!--mysql监听-->
<dependency><groupId>com.github.shyiko</groupId><artifactId>mysql-binlog-connector-java</artifactId><version>0.21.0</version>
</dependency>


java代码
代码逻辑
监听表一定要有完整性标识字段,否则无法实现(业务数据会产生完整性标识,用于比对数据)
业务上删除必须是逻辑删除,物理删除都要被监听

package com.dahua.data.xdjaencrypt.business.controller;import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** mysql bin log 日志监听*/
@Component
@Slf4j
public class MySQLBinaryLogConfig {//数据库表,需要监听的表private static final List<String> TABLE_NAME = new ArrayList<String>(Arrays.asList("user", "user2", "table3"));//监控数据库private static final List<String> DATABASE = new ArrayList<String>(Arrays.asList("test"));{System.out.println("启动监听:启动中....");getThread().start();System.out.println("启动监听:成功...");}public Thread getThread() {BinaryLogClient client = new BinaryLogClient("127.0.0.1", 3306, "root", "dahuacloud");client.setServerId(1);Map<Long, Object> concurrentHashMap = new ConcurrentHashMap<Long, Object>();return new Thread(() -> {client.registerEventListener(event -> {String database = null;//监控数据库String table = null; //监控表final EventData data = event.getData();System.out.println("数据监听开始..." + data);if (data instanceof TableMapEventData) {//把tableName 和tableId 关联上TableMapEventData tableMapEventData = (TableMapEventData) data;database = tableMapEventData.getDatabase();System.out.println("监控数据库" + database);table = tableMapEventData.getTable();concurrentHashMap.put(tableMapEventData.getTableId(), tableMapEventData.getTable());log.info("数据表:{},data:{},database:{}", table, data.toString(), database);} else if (data instanceof UpdateRowsEventData) {UpdateRowsEventData tableMapEventData = (UpdateRowsEventData) data;if (TABLE_NAME.contains(concurrentHashMap.get(tableMapEventData.getTableId()))) {System.out.println("业务操作,把after后的数据重新生成完整性标识,进行比对,匹配不入库,不匹配的数据入库");System.out.println("修改:" + data);};} else if (data instanceof WriteRowsEventData) {WriteRowsEventData tableMapEventData = (WriteRowsEventData) data;if (TABLE_NAME.contains(concurrentHashMap.get(tableMapEventData.getTableId()))) {System.out.println("业务操作,row中的数据重新生成完整性标识进行比对,匹配不入库,不匹配的数据入库");System.out.println("添加:" + data);}} else if (data instanceof DeleteRowsEventData) {DeleteRowsEventData tableMapEventData = (DeleteRowsEventData) data;if (TABLE_NAME.contains(concurrentHashMap.get(tableMapEventData.getTableId()))) {System.out.println("业务操作,所有物理删除的都要入库,所以业务定义删除的时候要,只支持逻辑删除,不支持物理删除");System.out.println("删除:" + data);}}if (!StringUtils.isAllBlank(table, database) && DATABASE.contains(database) && TABLE_NAME.contains(table)) {log.info("<<<<<< 收到MySQL binLog 日志推送 >>>>>>>");//开始编写具体的逻辑log.info("监控数据库:{},监控表{},操作类型{}", database, table);}});try {client.connect();} catch (IOException e) {e.printStackTrace();}});}}


各个监听产生的数据

修改监听-----------------------------------------------------------------------------
数据监听RotateEventData{binlogFilename='mysql-bin.000001', binlogPosition=6460}
数据监听FormatDescriptionEventData{binlogVersion=4, serverVersion='5.6.48-log', headerLength=19, dataLength=92, checksumType=CRC32}
数据监听QueryEventData{threadId=2, executionTime=0, errorCode=0, database='test', sql='BEGIN'}
数据监听TableMapEventData{tableId=70, database='test', table='user', columnTypes=3, 3, 3, 15, columnMetadata=0, 0, 0, 765, columnNullability={2}, eventMetadata=null}
数据监听UpdateRowsEventData{tableId=70, includedColumnsBeforeUpdate={0, 1, 2, 3}, includedColumns={0, 1, 2, 3}, rows=[{before=[17, 0, 8, 88899], after=[17, 0, 8, 88810]}
]}
数据监听QueryEventData{threadId=2, executionTime=0, errorCode=0, database='test', sql='COMMIT'}删除监听-----------------------------------------------------------------------------
数据监听QueryEventData{threadId=2, executionTime=0, errorCode=0, database='test', sql='BEGIN'}
数据监听TableMapEventData{tableId=70, database='test', table='user', columnTypes=3, 3, 3, 15, columnMetadata=0, 0, 0, 765, columnNullability={2}, eventMetadata=null}
数据监听DeleteRowsEventData{tableId=70, includedColumns={0, 1, 2, 3}, rows=[[15, 0, 4, add]
]}
数据监听QueryEventData{threadId=2, executionTime=0, errorCode=0, database='test', sql='COMMIT'}新增监听-----------------------------------------------------------------------------
数据监听QueryEventData{threadId=2, executionTime=0, errorCode=0, database='test', sql='BEGIN'}
数据监听TableMapEventData{tableId=70, database='test', table='user', columnTypes=3, 3, 3, 15, columnMetadata=0, 0, 0, 765, columnNullability={2}, eventMetadata=null}
数据监听WriteRowsEventData{tableId=70, includedColumns={0, 1, 2, 3}, rows=[[18, 2, 3, 4]
]}
数据监听QueryEventData{threadId=2, executionTime=0, errorCode=0, database='test', sql='COMMIT'}
```


通过数据可以看出新增删除修改都是被监听多次
并且表名称不是每次都能获取到,所有要有tableid,关联表名称
通过tableid过滤
实现业务逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pads layout 脚本导出不能运行excle解决办法

在一台新的电脑上安装好PADS&#xff0c;打开PCB文件导出坐标文件时&#xff1a; 出现“ActiveX Automation: server could not be found.”的问题,导致无法成功导出文件,错误提示截图如下&#xff1a; 导致上述问题的原因是在我们配置导出带坐标的脚本时,默认使用的是微软…

Java 实现application/x-www-form-urlencoded编码格式的POST请求

一、实现方式 在Java中&#xff0c;实现application/x-www-form-urlencoded内容类型通常涉及到发送HTTP POST请求。你可以使用java.net.HttpURLConnection或者第三方库如Apache HttpClient来实现。 以下是使用HttpURLConnection发送application/x-www-form-urlencoded数据的代…

linux的shell脚本编程详解

Shell 脚本是一种用于自动化任务的脚本语言&#xff0c;在 Linux 和其他类 Unix 操作系统中非常流行。它通常用于任务自动化、系统管理和批处理。编写 Shell 脚本并使其自动化编译过程&#xff08;例如使用 gcc 编译 C/C 程序&#xff09;是一种常见的任务。 以下是一个详细的…

昇思MindSpore学习笔记3--张量 Tensor

一、张量Tensor概念 矢量、标量和其他张量的计算函数&#xff0c;有内积、外积、线性映射以及笛卡儿积等 张量坐标在 n 维空间内&#xff0c;有 nr 个分量 每个分量都是坐标的函数,变换时每个坐标分量都按规则作线性变换 张量是一种特殊的数据结构&#xff0c;类似于数组和…

利用深度学习模型进行语音障碍自动评估

语音的产生涉及器官的复杂协调&#xff0c;因此&#xff0c;语音包含了有关身体各个方面的信息&#xff0c;从认知状态和心理状态到呼吸条件。近十年来&#xff0c;研究者致力于发现和利用语音生物标志物——即与特定疾病相关的语音特征&#xff0c;用于诊断。随着人工智能&…

js基础学习

1、js概述 js是javascript的简称&#xff0c;作用是实现页面和用户的交互 js由浏览器解析运行&#xff0c;不需要编译 js由es基础语法&#xff0c;bom浏览器相关&#xff0c;dom文档操作相关 三大部分组成 2、html引入js <!DOCTYPE html> <html lang"zh-CN&qu…

Vue项目打包上线

Nginx 是一个高性能的开源HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它在设计上旨在处理高并发的请求&#xff0c;是一个轻量级、高效能的Web服务器和反向代理服务器&#xff0c;广泛用于提供静态资源、负载均衡、反向代理等功能。 1、下载nginx 2、…

k8s学习--k8s群集ELK日志收集部署最详细的过程与应用(收集k8s群集日志)(图形化界面手把手教学)

文章目录 FilebeatFilebeat主要特点Filebeat使用场景 ELK简介Elasticsearch简介Elasticsearch主要特点Elasticsearch使用场景 Logstash简介Logstash主要特点Logstash使用场景 Kibana简介Kibana主要特点Kibana使用场景 简单理解 环境一、ELK集群部署1.软件安装2.软件配置及启动(…

Webpack: Loader开发 (2)

概述 在上一篇文章中&#xff0c;我们已经详细了解了开发 Webpack Loader 需要用到的基本技能&#xff0c;包括&#xff1a;Loader 基本形态、如何构建测试环境、如何使用 Loader Context 接口等。接下来我们继续拓展学习一些 Loader 辅助工具&#xff0c;包括&#xff1a; 了…

telegram支付

今天开始接入telegram支付,参考教程这个是telegram的官方说明,详细介绍了机器人支付API。 文章公开地址 新建机器人 因为支付是一个单独的系统,所以在做支付的时候单独创建了一个bot,没有用之前的bot了,特意这样将其分开。创建bot的方法和之前不变,这里不过多介绍。 获…

Linux文件数据写入

结构体 fd fd也就是文件描述符&#xff0c;用于标识已经打开的文件、管道、socket等。是进程和内核的桥梁&#xff0c;允许进程执行各种文件操作 struct fd {struct file *file;unsigned int flags; };file Linux内核中表示打开文件的结构体&#xff0c;包含了文件操作所需…

什么是自然语言处理(NLP)?详细解读文本分类、情感分析和机器翻译的核心技术

什么是自然语言处理&#xff1f; 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能的一个重要分支&#xff0c;旨在让计算机理解、解释和生成人类的自然语言。打个比方&#xff0c;你和Siri对话&#xff0c;或使用谷歌翻译翻译一…

2024广州国际米粉产业展览会暨米粉节

2024广州国际米粉产业展览会 时间&#xff1a;2024年11月16-18日 地点&#xff1a;广州中国进出口商品交易会展馆 主办单位&#xff1a;企阳国际会展集团 【展会简介】 米粉作为一种历史悠久&#xff0c;人们日常食用的食物&#xff0c;其市场需求稳定&#xff0c;且随着人…

学习.NET 8 MiniApis入门

介绍篇 什么是MiniApis&#xff1f; MiniApis的特点和优势 MiniApis的应用场景 环境搭建 系统要求 安装MiniApis 配置开发环境 基础概念 MiniApis架构概述 关键术语解释&#xff08;如Endpoint、Handler等&#xff09; MiniApis与其他API框架的对比 第一个MiniApis…

WSL2安装ContOS7并更新gcc

目录 WSL2安装CentOS7下载安装包安装启动CentOS7 CentOS7更换国内源gcc从源码安装gcc卸载gcc CMake中使用gcc关于linux配置文件参考 WSL2安装CentOS7 Windows11官方WSL2已经支持Ubuntu、Open SUSE、Debian。但是没有centos&#xff0c;所以centos的安装方式略有不同。 下载安…

【面试题】网络IP协议(第六篇)

1.简述IP协议的作用。 IP协议&#xff08;Internet Protocol&#xff09;是TCP/IP协议族中的核心协议之一&#xff0c;主要用于在互联网上进行数据传输。它的主要作用包括&#xff1a; 寻址&#xff1a;IP协议通过IP地址来唯一标识网络中的每一台设备&#xff0c;确保数据包能…

家政小程序的开发:打造现代式便捷家庭服务

随着现代生活节奏的加快&#xff0c;人们越来越注重生活品质与便利性。在这样的背景下&#xff0c;家政服务市场迅速崛起&#xff0c;成为许多家庭日常生活中不可或缺的一部分。然而&#xff0c;传统的家政服务往往存在信息不对称、服务效率低下等问题。为了解决这些问题&#…

mindspore打卡之量子测量

mindspore打卡之量子测量 我们可以看到&#xff0c;采样1000中&#xff0c;00’出现了503次&#xff0c;11’出现了497次&#xff08;由于测量具有随机性&#xff0c;每次运行结果会略有不同&#xff09;&#xff0c;采样结果符合概率分布&#xff0c;细微的误差是由模拟器噪声…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(三)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形 ✔️ 第一部分第二部分【第三部分】✔️ 1.2.3 Canvas 与 WebGL&#xff08;精译中 ⏳&#xff09;1.2.4 C…

gameui C++的代码

gameui C的代码 #include <graphics.h> #include "gameboard.h" const int WIDTH 560; const int HEIGHT 780; const int GRID_SIZE 120; class GameUi { private: public:GameUi(GameBoard& gb) {// 初始化图形窗口initgraph(WIDTH, HEIGHT);// 设置…