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();
        }
    }
}

测试


相关推荐
该用户已不存在5 小时前
MySQL 与 PostgreSQL,该怎么选?
数据库·mysql·postgresql
川石课堂软件测试5 小时前
自动化测试之 Cucumber 工具
数据库·功能测试·网络协议·测试工具·mysql·单元测试·prometheus
lang201509286 小时前
MySQL数据类型存储全解析
mysql
siriuuus6 小时前
Linux MySQL 多实例部署与配置实践
linux·运维·mysql
王木风7 小时前
1分钟理解什么是MySQL的Buffer Pool和LRU 算法?
前端·mysql
qq_404643349 小时前
MySQL中RUNCATE、DELETE、DROP 的基本介绍
数据库·mysql
像风一样!10 小时前
MySQL数据库如何实现主从复制
数据库·mysql
大白的编程日记.10 小时前
【MySQL】数据库表的CURD(二)
android·数据库·mysql
Olrookie11 小时前
MySQL运维常用SQL
运维·数据库·sql·mysql·dba