mysql触发器监听数据投递中间件

news/2025/2/12 3:16:48/

目前市面上有许多的 CDC(Change Data Capture) 框架用于监听数据库的数据变动,例如:canal、Debezium、Maxwell等都是用来解析 binlog 日志实现事件的监听。但是有一个情况就是如果公司对 binlog 日志文件的权限管控的很严格,那么这些用于监听的工具就可能因为权限的问题无法使用。这里我尝试使用 mysql 的 UDF + 触发器 的方式来实现数据库层面的数据监听,然后调用本地的 java程序

1. 扩展安装

要想调用本地的java代码需要用到mysql的扩展程序 lib_mysqludf_sys

官网地址 https://github.com/mysqludf/lib_mysqludf_sys

linux平台需要将 .so 的文件复制到mysql的插件路径下面 /usr/lib/mysql/plugin/
windows平台需要将 .dll 路径安装到 mysql安装路径\lib\plugin下面,由于官网没有提供 .dll 文件,这里可以用我生成的

链接:https://pan.baidu.com/s/13RJK6wfVeHcCJkuC-BigAw?pwd=1234
提取码:1234

2. 链接程序

上面安装完成之后,需要将函数链接到mysql中

CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.dll';
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.dll';

3. 创建例子程序

这里写一个例子程序,将mysql中监听到的数据追加到文件当中,maven打成jar包

public class Application {public static void main(String[] args) {for (String arg : args) {System.out.println(hello(arg));}}public static String hello(String args) {try {File file = new File("E:\\data.txt");FileWriter writer = new FileWriter(file, true);writer.write(args);writer.close();} catch (IOException e) {e.printStackTrace();}return args;}
}

4. 创建存储过程

DELIMITER //
CREATE PROCEDURE execute_jar(IN data JSON)
BEGINDECLARE cmd VARCHAR(255);SET cmd = CONCAT('java -jar E:/my-study-project/redis/target/redis-1.0.0-SNAPSHOT.jar "' , data , '"');SELECT sys_eval(cmd) into @select;
END //
DELIMITER ;

5. 创建触发器

CREATE TRIGGER t_order_trigger AFTER INSERT ON t_order
FOR EACH ROW
BEGIN-- 获取新插入的行数据并整合为一个 JSON 字符串DECLARE jsonData JSON;SET jsonData = JSON_OBJECT('id', NEW.id,'userName', NEW.user_name,'orderId', NEW.order_id);-- 调用存储过程并传递整合的 JSON 字符串CALL execute_jar(jsonData);
END;

6. 测试表

create table t_order
(id        bigint auto_increment comment '主键id'primary key,user_name varchar(64) null comment '用户名称',order_id  bigint(64)  null comment '订单id'
)comment '订单表' collate = utf8mb4_general_ci;

7. 测试数据

insert into t_order(user_name, order_id) values ('zs', 1), ('ls', 2);

可以看到数据直接追加到文件中了,利用这个特性我们就可以来监听mysql的数据变动,然后投递到kafka或者rocketmq中去了
在这里插入图片描述


http://www.ppmy.cn/news/106101.html

相关文章

mui H5+实现原生导航栏配置

// 定义详情页 var detail null // 定义原始导航配置变量 var titleNView { //详情页原生导航配置backgroundColor: #F7F7F7, //导航栏背景色titleText: , //导航栏标题titleColor: #000000, //文字颜色type: transparent, //透明渐变样式autoBackButton: true, //自动绘制返…

PMP练习题 第二弹

前言:文中类似“有误a”的字样,是作者做题时自己选错的错误答案 1、有误a 一个多阶段项目发起人离开公司,项目文件已获得批准并满足其目标。资源预算已到位。项目经理接下来应该怎么做? A:在离开组织的发起人的主管同…

【测试人员需要知道的事】

目录 1. 测试与调试的区别 2. 什么是需求 3. 测试用例 3.1 什么是测试用例 3.2 为什么要有测试用例 4. BUG 5. 软件的生命周期 6. 开发模型 6.1 瀑布模型 6.2 螺旋模型 6.3 增量、迭代模型 7. 测试模型 7.1 V 模型 7.2 W 模型 8. 软件测试教程 8.1 软件测试的生…

Python网页爬虫代码

网页爬虫是一种自动化程序,可以自动地访问网页并提取其中的信息。它可以用于各种目的,例如搜索引擎的索引、数据挖掘、价格比较、舆情监测等。网页爬虫通常使用编程语言编写,例如Python、Java等。 以下是一个简单的示例,使用 Pyt…

现代化个人博客系统 ModStartBlog v7.4.0 暗黑模式跟随系统,随机博客获取

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …

让 Python 真正支持多线程

让 Python 真正支持多线程 Python 诞生至今已经32年了!如今它是 TOBIE 编程语言排行榜 排名第一的语言,被广泛用于各种应用程序的开发。 然而遗憾的是——Python 至今都缺乏对多线程的原生支持。 好消息是 Python 3.12 将引入的“Per-Interpreter GIL”…

迅为国产化RK3588开发板在安防前后端应用解决方案

K3588是瑞芯微推出的一款高性能处理器,针对安防领域的应用具备强大的计算能力和图像处理能力。下面是关于RK3588的安防前后端应用解决方案的介绍: 前端摄像头端: 高清视频采集:利用RK3588处理器的高性能图像处理能力,…

OJ练习第122题——交错字符串

交错字符串 力扣链接:97. 交错字符串 题目描述 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: s …