Java binLog日志监听

本文介绍了如何在Windows下开启MySQL的BinLog功能,以及使用Java和Maven的mysql-binlog-connector-java库进行BinLog监听,针对不同事件类型(如table_map_event、update_rows_event等)进行处理逻辑的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

监听指定的表去做一些处理逻辑,首先是要开启M有SQL的配置,然后再撸代码。

一、Windows下开启MySQL binLog日志

首先要开启MySQL的BinLog 管理

show variables like '%log_bin%';

 

如果发现是OFF,打开mysql文件夹下面的my.ini,修改一下

如果不知道my.ini 在哪里,打开【服务】-> 右击属性

 

拉到最后就可以看见my.ini,然后找到文件后

[mysqld] 下面加

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

然后 重启服务,就会发现已经起好了 

二、Java代码示例演示

首先引入Maven包

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

上代码

import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson2.JSON;
import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.*;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.web.controller.websocket.AlarmWebSocket;
import com.ruoyi.web.service.IWidfireDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;
import java.util.Map;


/**
 * mysql bin log 日志监听
 */
@Component
@Slf4j
public class MySQLBinaryLogConfig {


    public static IWidfireDataService widfireDataService;

    @Autowired
    public void setSenderService(IWidfireDataService widfireDataService){
        MySQLBinaryLogConfig.widfireDataService= widfireDataService;
    }


    private static final List<String> TABLE_NAME = ListUtil.of("alart_ai"); //数据库表,需要监听的表


    {
        System.out.println("启动监听:启动中");
        getThread().start();
        System.out.println("启动监听:成功");
    }

    public Thread getThread() {
        BinaryLogClient client = new BinaryLogClient("127.0.0.1", 3306, "root", "123456");
        client.setServerId(1);
        return new Thread(() -> {
            client.registerEventListener(event -> {
                String table =null;
                final EventData data = event.getData();
                if (data instanceof TableMapEventData) {
                    TableMapEventData tableMapEventData = (TableMapEventData) data;
                    String database = tableMapEventData.getDatabase();
                    table = tableMapEventData.getTable();

                    log.info("数据表:{},data:{},database:{}",table,data.toString(),database);
                }else if (data instanceof UpdateRowsEventData) {
                    UpdateRowsEventData tableMapEventData = (UpdateRowsEventData) data;

                    System.out.println("更新:");
                } else if (data instanceof WriteRowsEventData) {
                    System.out.println("添加:");
                } else if (data instanceof DeleteRowsEventData) {
                    System.out.println("删除:");
                }

                if(StringUtils.isNotEmpty(table) && TABLE_NAME.contains(table)){
                    log.info("<<<<<< 收到MySQL binLog 日志推送 >>>>>>>");
                    //开始编写具体的逻辑
                    
                }

            });
            try {
                client.connect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });

    }






}

Java Binlog 转换为 SQL 是指从 MySQL 的二进制日志 (binlog) 中解析出操作记录,并将其转换成等效的 SQL 语句,以便可以用于数据恢复、审计或其他用途。 ### 解析步骤 1. **获取Binlog文件** 首先需要确保MySQL服务器开启了binlog功能,并能够访问到相应的binlog文件。可以在`my.cnf`配置文件中设置`log-bin=mysql-bin`来启用此功能。 2. **选择合适的工具或库** - **官方mysqlbinlog命令行工具**: 可直接读取并解释binlog内容,默认输出的是SQL文本格式。 ```bash mysqlbinlog --start-datetime="2023-04-01 00:00:00" /path/to/binlog-file > output.sql ``` - **第三方库如 Canal 或 MaxWell**: 这些框架不仅支持实时同步数据库变更事件至消息队列系统,同时也提供API接口供开发者定制化处理每个事件对应的SQL生成逻辑。 3. **编写自定义解析程序** 如果你想要更精细地控制如何把特定类型的事件转成SQL,则可以选择利用一些Java开源项目提供的类库来进行深度加工: ```java // 示例:使用 com.github.shyiko.mysql.binlog.BinaryLogClient 监听binlog事件 BinaryLogClient client = new BinaryLogClient("host", port, "username", "password"); client.registerEventListener(event -> { if (event.getHeader().getEventType() == EventType.TABLE_MAP){ // 根据table-map事件更新表结构映射信息... } else if(EventType.isDmlEvent(event)){ DdlEntry entry = ...; // 获取当前事务中的DDL/DML操作详情 String sqlStatement = generateSqlFromBinlogEvent(entry); System.out.println(sqlStatement); // 输出或保存为SQL脚本形式 } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值