BinLog日志java端的连接工具

本文介绍如何利用MySQL的Binlog日志在Java应用中实现数据变化的实时监听,进而自动更新缓存信息。通过配置binlog及使用mysql-binlog-connector-java库,可实现实时的数据变更响应。

近日在搭建研究广告投放系统,用到了mysql数据库的binlog日志.作用binlog日志中会记录数据库数据变化的详细信息.只需要在java代码中监听该日志的变化就可以知道数据的变化,从而可以进行缓存信息的自动修改功能.

介绍binlog:
先简单介绍一下binlog.

binlog日志会记录所有的DDL和DML(除了数据查询语句)语句,而java代码中可以通过地方的类库提供的方法去监听日志文件中的时间变化,当日志中出现增删改时可以在java中监听到从而进行一些对缓存等内容的自动修改.打开binlog会消耗一定的资源(听说1%)

如何打开binlog

在mysql的目录下etc/my.conf或者my.ini文件中的[mysqld]标签下添加以下配置:

log-bin=mysql-bin
binlog-format=Row
server_id=201903

5.7以上(包括5.7)一定要添加server_id,否则启动会报错

修改配置文件后重启mysql

查询binlog是否开启

show VARIABLES like 'log_bin' 命令可以查询binlog功能是否开启

代码中的使用
java中如何监听binlog日志

文件pom地址:

com.github.shyiko mysql-binlog-connector-java 0.13.0 引入文件后:

//配置连接(指定数据库的地址,端口号,账号,密码)

BinaryLogClient logClient = new BinaryLogClient(
        "127.0.0.1",
        3306,
        "root",
        "123456"
);

//注册事件监听器(可以对不同日志变更进行不同的操作逻辑)

logClient.registerEventListener(event -> {
    EventData data = event.getData();
    //如果日志是更新记录
    if(data instanceof UpdateRowsEventData){
        System.out.println("update");
    }else if(data instanceof WriteRowsEventData){
        //写操作
        System.out.println("write");
    }else if(data instanceof DeleteRowsEventData){
            //删除操作
        System.out.println("delete");
 
    }
});

//开始连接监听

logClient.connect();

扩展:

注册监听这一步可以单独进行自定义, 只需要实现BinaryLogClient.EventListener即可,重写onEvent方法进行各类操作

### MySQL 8 Binlog 日志配置、使用与解析 #### 配置 MySQL 8 的 Binlog 功能 在 MySQL 8 中,二进制日志Binlog)是数据库复制和数据恢复的核心功能之一。为了启用和配置 Binlog,需要在 MySQL 的配置文件 `my.cnf` 或 `my.ini` 中进行设置[^1]。 以下是一个典型的 Binlog 配置示例: ```ini [mysqld] # 启用 Binlog 功能 log-bin=mysql-bin # 设置服务器唯一 ID server-id=1 # 定义 Binlog 格式(ROW、STATEMENT 或 MIXED) binlog-format=ROW # 可选:设置过期时间(单位为天) expire_logs_days=7 ``` - `log-bin=mysql-bin`:指定 Binlog 文件的前缀名称。 - `server-id=1`:每个运行 Binlog 的 MySQL 实例必须有唯一的 `server-id`。 - `binlog-format=ROW`:定义 Binlog 的记录格式。ROW 表示以行的形式记录每一条变更操作;STATEMENT 则是以 SQL 语句的形式记录;MIXED 是混合模式[^2]。 #### 使用 mysqlbinlog 工具解析 Binlog MySQL 自带的 `mysqlbinlog` 工具可以用来解析和查看 Binlog 文件的内容。以下是常见的使用方法: 1. **查看 Binlog 文件内容**: ```bash mysqlbinlog /path/to/mysql-bin.000003 ``` 此命令会输出 Binlog 文件中的所有事件,包括插入、更新和删除等操作[^2]。 2. **过滤特定时间范围的日志**: ```bash mysqlbinlog --start-datetime="2023-10-01 00:00:00" --stop-datetime="2023-10-02 00:00:00" /path/to/mysql-bin.000003 ``` 3. **将 Binlog 转换为可执行的 SQL 语句**: ```bash mysqlbinlog /path/to/mysql-bin.000003 | mysql -u root -p ``` #### 解析 Binlog 的高级方法 除了 `mysqlbinlog` 工具外,还可以通过第三方工具或库来解析 Binlog,例如 `mysql-binlog-connector-java`。这种方法适用于需要实时捕获数据变更的场景,例如构建 CDC(Change Data Capture)系统[^3]。 以下是一个基于 `mysql-binlog-connector-java` 的代码示例,用于实时解析 Binlog: ```java import com.github.shyiko.mysql.binlog.BinaryLogClient; import com.github.shyiko.mysql.binlog.event.EventType; import com.github.shyiko.mysql.binlog.event.deserialization.EventDeserializer; public class BinlogParser { public static void main(String[] args) throws Exception { BinaryLogClient client = new BinaryLogClient("localhost", 3306, "root", "password"); EventDeserializer eventDeserializer = new EventDeserializer(); client.setEventDeserializer(eventDeserializer); client.registerEventListener(event -> { if (event.getHeader().getEventType() == EventType.QUERY) { System.out.println("Query Event: " + event.getData()); } else if (event.getHeader().getEventType() == EventType.TABLE_MAP) { System.out.println("Table Map Event: " + event.getData()); } }); client.connect(); } } ``` 此代码通过连接到 MySQL 数据源,实时监听并解析 Binlog 事件,适合用于构建复杂的 CDC 系统。 #### 注意事项 - 在生产环境中,建议定期清理过期的 Binlog 文件以释放磁盘空间,可以通过设置 `expire_logs_days` 参数实现。 - 如果启用了 GTID(全局事务标识符),可以使用 GTID 来管理复制和恢复,而不是依赖于位置偏移量(Position)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值