Home

Awesome

canal2sql

用Java写的 MySQL Binlog 解析工具,底层依赖了Canal

设计初衷

  1. 为了方便的找到数据的更新轨迹
  2. 为了填补Java在解析离线binlog的空白

binlog读取模式

暂时支持了三种读取模式

列补全方式

我们知道binlog里row_event和table_map是没有字段名的,所以需要借助外部元数据来补全,canal2sql支持两种列补全方式

在线模式只支持使用数据库实时DDL的方式,而binlog文件模式和阿里云rds模式则可以根据实际情况选择合适的列补全方式

限制和要求

可执行jar包下载

最新版本v1.1.3 可在releases页面下载 https://github.com/zhuchao941/canal2sql/releases/tag/v1.1.3

运行选项

binlog模式指定

SQL显示模式

解析范围控制

对象过滤

离线解析模式

mysql连接配置

在线解析必填,离线模式作为表结构来源用来做列还原

 -h host
 -P port
 -u user
 -p password

云rds配置

使用示例

1. 在线模式

java -jar ./canal2sql-${version}.jar -mode online -uroot -proot -P3306 -hlocalhost

在线解析模式只需要指定远程数据库连接参数即可,表结构数据直接实时获取

2. binlog文件模式

binlog文件模式需要指定binlog文件url,表结构数据支持从mysql实时获取也支持从本地ddl文件读取

java -jar ./canal2sql-${version}.jar -mode file -file_url 'file:/Users/abc/binlog/mysql-bin.000474' -uroot -proot -P3306 -hlocalhost
java -jar ./canal2sql-${version}.jar -mode file -ddl '/Users/xxx/ddl.sql' -file_url 'http://localhost:8080/binlog/mysql-bin.000474'

3. 阿里云rds模式

阿里云rds模式

java -jar ./canal2sql-${version}.jar -mode aliyun -uroot -proot -P3306 -hlocalhost -start_time "2023-12-07 00:00:00" -end_time "2023-12-07 09:00:00" -instanceId "rm-12345678|1111111" -ak ak -sk sk

输出格式解析

类似如下输出,第一行为 binlog文件名称:事务开始的offset 时间戳 后面就是具体的事务里的sql语句,同一个事务会被聚合到一起输出

#mysql-bin.007795:171260617 2023-12-14 16:27:00
UPDATE `comment`.`comment_category` SET `upd_tm` = '2023-12-14 16:27:00' WHERE `id` = 1;
UPDATE `comment`.`comment_category` SET `upd_tm` = '2023-12-14 16:27:00' WHERE `id` = 12;

#mysql-bin.007795:171261166 2023-12-14 16:27:00
UPDATE `comment`.`comment_category` SET `upd_tm` = '2023-12-14 16:27:00' WHERE `id` = 9;

RoadMap

  1. 支持binlog的在线解析、离线解析(已支持)
  2. 列还原同时支持在线模式和离线模式(已支持)
  3. 支持生成回滚SQL(已支持)
  4. 支持解析范围控制(已支持)
    1. 时间维度
    2. position维度
  5. 支持对象过滤(已支持)
    1. 库表维度
    2. sql类型维度
  6. 支持多binlog文件顺序解析
  7. 支持云rds binlog文件列表解析(已支持)
  8. 支持分析统计功能
    1. 耗时事务统计
    2. 大事务统计
    3. 表维度/库维度 更新数据量统计
    4. qps统计

暂时只剩下一些分析统计相关的功能未实现,后续有时间会考虑实现。

另外对于命令行参数的一些校验也没做,这块后续也可以优化

致谢

canal2sql借鉴和学习了很多业界知名的开源项目,在此表示感谢!