文章目录
前言
最近想在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
依赖。
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();
}
}
}
测试