Springboot——使用shyiko监听mysql的bin-log

文章目录

前言

最近想在Java项目中,对数据库的bin-log日志文件数据变化做一个监听。找了多个开源框架,最终选择shyiko来实现。

架构版本

  • jdk 17
  • mysql 5.7.1
  • shyiko 0.13.0

mysql开放bin-log配置

需要能监听到mysqlbin-log数据变化,最主要的还需要数据库开通了bin-log。

查看mysql数据库的配置文件。

vi /etc/my.cnf

在配置文件最下面增加下面的几项配置:

复制代码
 # 配置开启binlog 
log-bin=/var/lib/mysql/mysql-bin.log

# 记录log文件过期时间,0表示永不过期
expire_logs_days=7
 
 # 注意5.7以及更高版本需要配置本项:
 server-id=1(数值自定义,保证唯一性); 
 
 #binlog格式,有3种statement,row,mixed 
 # 安全性、主从同步一致性,采取row或mixed,建议使用row
 # statement:记录操作逻辑
 # row:记录sql(如update)影响的那条记录之后的结果
 # mixed:statement和row的综合效果
 binlog_format=ROW 

# 设置最大binlog文件的大小,如果超过则会切换至下一序列号文件
# 这里也有时间设定,超过6小时也会切换下一序列号文件
max_binlog_size=100M

# 二进制文件缓存大小,可以通过 show status like 'blinlog_%';查看调整写入磁盘的次数。
# 写入磁盘为0则最好
binlog_cache_size=16M

# 最大缓存大小
max_binlog_cache_size=256M
 
 # 表示每1次执行写入就与硬盘同步,会影响性能,
 # 为0时表示,事务提交时mysql不做刷盘操作,由系统决定 
 # 5.7 版本该项参数不合法
 #sync‐binlog=1

# 每次事务提交,将日志缓冲写入 log file,并同时flush到磁盘
# 设置次数,1表示提交1次就进行操作;n表示进行n次事务提交之后
innodb_flush_log_at_trx_commit=1

其中log-bin的配置路径需要与mysql 的路径一致

配置完成后,重启MySQL服务。

service mysqld restart

测试代码编写

项目依赖引入

在测试项目中,引入shyiko 依赖。

xml 复制代码
<dependency>
    <groupId>com.github.shyiko</groupId>
    <artifactId>mysql-binlog-connector-java</artifactId>
    <version>0.13.0</version>
</dependency>

编写测试类

java 复制代码
import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.*;

public class ShyikoTest {
    public static void main(String[] args) {
        BinaryLogClient client = new BinaryLogClient("localhost", 3306, "root", "root");
        // 与 my.cnf 文件中的 server-id 不是一个东西
        client.setServerId(12345);
        client.registerEventListener(new BinaryLogClient.EventListener() {
            @Override
            public void onEvent(Event event) {
                EventData data = event.getData();
                if (data instanceof TableMapEventData) {
                    TableMapEventData tableMapEventData = (TableMapEventData) data;
                    System.out.println("Table map event: " + tableMapEventData);
                } else if (data instanceof WriteRowsEventData) {
                    WriteRowsEventData writeRowsEventData = (WriteRowsEventData) data;
                    System.out.println("Write rows event: " + writeRowsEventData);
                } else if (data instanceof UpdateRowsEventData) {
                    UpdateRowsEventData updateRowsEventData = (UpdateRowsEventData) data;
                    System.out.println("Update rows event: " + updateRowsEventData);
                } else if (data instanceof DeleteRowsEventData) {
                    DeleteRowsEventData deleteRowsEventData = (DeleteRowsEventData) data;
                    System.out.println("Delete rows event: " + deleteRowsEventData);
                }
            }
        });
        try {
            client.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试


相关推荐
许愿OvO3 小时前
MySQL触发器
android·mysql·adb
lcanfly4 小时前
Mysql作业4
数据库·mysql
蓝象_5 小时前
docker安装配置mysql
mysql·docker·容器
lcanfly6 小时前
Mysql作业5
android·数据库·mysql
许愿OvO8 小时前
MySQL-索引
数据库·mysql
-指短琴长-8 小时前
MySQL快速入门——基本查询(上)
android·数据库·mysql
白衣鸽子9 小时前
MySQL数据库的“隐形杀手”:深入理解文件结构与治理数据碎片
数据库·后端·mysql
java干货9 小时前
MySQL “灵异事件”:我 INSERT id=11,为什么被 UPDATE id=10 锁住了?
android·数据库·mysql
記億揺晃着的那天9 小时前
数据库中 ACID 四个核心特性
数据库·mysql·oracle·系统设计·acid
一抓掉一大把10 小时前
RuoYi .net-实现商城秒杀下单(redis,rabbitmq)
redis·mysql·c#·rabbitmq·.net