Springboot——使用shyiko监听mysql的bin-log
文章目录
- 前言
- 架构版本
- mysql开放bin-log配置
- 测试代码编写
- 项目依赖引入
- 编写测试类
- 测试
前言
最近想在Java项目中,对数据库的bin-log日志文件数据变化做一个监听。找了多个开源框架,最终选择shyiko
来实现。
架构版本
- jdk 17
- mysql 5.7.1
- shyiko 0.13.0
mysql开放bin-log配置
需要能监听到mysql
的bin-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
依赖。
<dependency><groupId>com.github.shyiko</groupId><artifactId>mysql-binlog-connector-java</artifactId><version>0.13.0</version>
</dependency>
编写测试类
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() {@Overridepublic 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();}}
}
测试