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.mfbz.cn/a/753030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP语言学习02

好久不见&#xff0c;学如逆水行舟&#xff0c;不进则退&#xff0c;真是这样。。。突然感觉自己有点废。。。 <?php phpinfo(); ?> 新生第一个代码。 要想看到运行结果&#xff0c;打开浏览器&#xff08;127.0.0.1/start/demo01.php&#xff09; 其中&#xff0c…

揭开免费可视化工具流行背后的原因

免费可视化工具为什么越来越受欢迎&#xff1f;在大数据时代&#xff0c;数据可视化已经成为各行各业的重要工具。它不仅帮助企业和个人更直观地理解数据&#xff0c;还在决策过程中起到关键作用。尽管市场上有许多付费的数据可视化工具&#xff0c;但免费工具的受欢迎程度却在…

面试准备算法

枚举 答案肯定是字符串的某个前缀&#xff0c;然后简单直观的想法是枚举所有前缀来判断&#xff0c;设前缀长度lenz&#xff0c;前缀串的长度必然要是两个字符串长度的约数才能满足条件。 可以枚举长度&#xff0c;再去判断这个前缀串拼接若干次以后是否等于str1和str2。 cla…

高德地图基于Three开发三维流动管线。

先看效果 废话少说直接上干货,整体思路通过高德地图的GLCustomLayer图层加载Three三维管线。 第一步将管线经纬度转成三维空间经纬度 GLCustomLayer = new (window as any).AMap.GLCustomLayer({zIndex: 120,visible: true,init: (gl: any) => {initThree(gl);// burialDe…

idea Error running ‘Application‘

1、Error running ‘Application’ Error running ApplicationError running Application. Command line is too long.Shorten the command line via JAR manifest or via a classpath file and rerun.找到 .idea/libraies/workspace.xml 中的 PropertiesComponent 属性&#…

ICRA 2024 混变刚度的仿人软体手指实现多模式抓取

ICRA 2024 发表了"用于多模式抓取的具有混合可变刚度机制的仿生软指 "的研究工作。核心思想是利用记忆合金的形状记忆效应&#xff0c;构建结构简化、功能多样的柔性手指&#xff0c;从而实现更高效的多模式抓取。 与传统的刚性夹爪相比&#xff0c;柔性软体夹爪具有…

阿里巴巴找黄金宝箱(IV)

系列文章目录 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 一、题目描述 贫如洗的椎夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现…

CICD相关概念简单理解——筑梦之路

CI/CD 是现代软件开发流程中的关键实践&#xff0c;它代表着持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09;的组合。这些实践旨在帮助软件开发团队更…

Java学习 (五) 面向对象--包概念、封装、构造器

一、 package &#xff08;包&#xff09; package 包 用于指定该文件中定义的类、接口等结构 像我们之前练习的代码&#xff0c;在顶部并没有定义package的关键字&#xff0c;这种就属于无名包 1、包 &#xff08;java 库&#xff09; 在java中的包&#xff0c;是一堆类和接…

2024我们该学习大模型吗?

一、引言 在快速变化的科技行业中&#xff0c;人工智能&#xff08;AI&#xff09;大模型已成为研究和应用的热点。随着AI技术的不断进步&#xff0c;特别是在自然语言处理、计算机视觉和机器学习平台等领域&#xff0c;许多专业人士开始将目光投向AI大模型的开发和应用。 二…

Linux挂载Windows共享文件

一、Windows共享目录 二、Linux挂载 yum install cifs-utils mkdir /aaa/ mount.cifs -o usernamexxx,passwordxxx //172.16.8.121/aaa /aaa/

【机器学习】在【PyCharm中的学习】:从【基础到进阶的全面指南】

目录 第一步&#xff1a;基础准备 1.1 Python基础 1.1.1 学习Python的基本语法 变量和数据类型&#xff1a; 1.1.2 控制流 条件语句&#xff1a; 循环语句&#xff1a; 1.1.3 函数和模块 函数&#xff1a; 模块&#xff1a; 1.2 安装PyCharm 1.2.1 下载并安装 第二…

Spring Boot 过滤器和拦截器详解

目录 Spring Boot 过滤器1.什么是过滤器2.工作机制3.实现过滤器 Spring Boot 拦截器1. 什么是拦截器2. 工作原理3.实现4.拓展&#xff08;MethodInterceptor 拦截器&#xff09;实现 过滤器和拦截器区别过滤器和拦截器应用场景过滤器拦截器 Spring Boot 过滤器 1.什么是过滤器 …

从零开始做题:LSB

1 题目 2 解题 2.1 使用stegsolve工具 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc] └─$ java -jar Stegsolve.jar 2.1.1 发现R、G、B的plane0有隐藏信息 2.1.2 提取隐藏信息 2.1.3 save bin后得到二维码 2.1.4 QR Research得到flag 3 flag cumtctf{1sb_i4_s0_Ea4y}

leetCode.92. 反转链表 II

leetCode.92. 反转链表 II 题目思路 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode …

【LeetCode:2742. 给墙壁刷油漆 + 递归 + 记忆化搜索 + dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

硬件实用技巧:摄像头常用的输出协议类型和输出接口类型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140042485 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

正念:照进乌云的阳光,改变你的人生|流静

在人生的旅途中&#xff0c;我们时常遭遇乌云密布的时刻&#xff0c;困厄与挫折如同浓重的阴霾&#xff0c;遮挡了前行的道路。然而&#xff0c;在这黑暗之中&#xff0c;总有一束名为“正念”的阳光&#xff0c;能够穿透云层&#xff0c;照亮我们的内心&#xff0c;引领我们走…

【论文阅读 Validation Free and Replication Robust Volume-based Data Valuation】

论文题目 免验证的对于复制鲁棒性的基于量的数据估值 1. 本文具体贡献 通过数据的体积形式化了数据多样性的度量&#xff0c;并在理论上和实证上证明了体积对数据估值的适用性&#xff1b;形式化了复制鲁棒性的概念&#xff0c;并设计了一种基于稳健体积&#xff08;RV&…

【网络安全的神秘世界】解决dvwa靶场报错:Illegal mix of collations for operation ‘UNION‘

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 &#x1f6a9;问题描述 当尝试执行如下 SQL 语句时&#xff1a; 1 union select schema_name,1 from information_schema.s…