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

测试


相关推荐
九皇叔叔1 天前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
愤怒的苹果ext1 天前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
超兔一体云1 天前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
2601_962074811 天前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql
2601_962073811 天前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql
这个DBA有点耶2 天前
SQL:2023新特性详解:JSON_TABLE、GREATEST/LEAST、QUALIFY 到底怎么用?
数据库·sql·mysql
小王C语言2 天前
MySQL 用户管理:创建用户、给用户授权
数据库·mysql
小镇敲码人2 天前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
Sirens.2 天前
MySQL数据库:索引
数据库·mysql
2601_962072502 天前
大数据-234 离线数仓 - 异构数据源 DataX 将数据 从 HDFS 到 MySQL
大数据·mysql·hdfs