开发者社区> 问答> 正文

canal客户端认为insert\update\delete是DDL语句了

如题,今天做了个测试,连接本机mysql,测试insert等语句,客户端example执行后,将insert、update、delete等语句看成了DDL语句,但是,连接开发服务器上的mysql就正常,请问这是为什么呢?

原提问者GitHub用户Mrbug001

展开
收起
绿子直子 2023-05-09 15:54:13 130 0
2 条回答
写回答
取消 提交回答
  • 估计是mysql5.6的rows query log,canal不会转换为sql

    原回答者GitHub用户agapple

    2023-05-10 10:52:26
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    这个问题可能与 MySQL 的 binlog 格式有关。Canal 客户端通过订阅 MySQL 的 binlog,来获取数据库的变更数据。在 MySQL 中,有多种 binlog 格式可供选择,例如 statement、row、mixed 等。不同的 binlog 格式对于 Canal 客户端的工作方式有一定的影响。

    在您的测试中,可能是因为本机 MySQL 数据库的 binlog 格式与开发服务器上不同,导致 Canal 客户端将 insert、update、delete 等语句看成了 DDL 语句。

    建议您检查一下本机 MySQL 数据库的 binlog 格式,可以使用以下命令查看:

    SHOW GLOBAL VARIABLES LIKE 'binlog_format';

    如果 binlog_format 的值为 STATEMENT,则说明 binlog 格式为 statement。在 statement 格式下,MySQL 会将一条 SQL 语句作为一个事务进行记录,并将其记录到 binlog 中。因此,在 Canal 客户端订阅 binlog 时,如果一个 SQL 语句是在一个事务中执行的,则会将整个事务作为一条 DDL 语句传递给客户端。

    如果您的开发服务器的 binlog 格式为 row 或 mixed,则可能不会出现该问题。因为在 row 或 mixed 格式下,MySQL 会将一条 SQL 语句的每一行记录都记录到 binlog 中,因此,Canal 客户端订阅 binlog 时,会得到每一行记录的变更信息,而不是整个事务的 DDL 语句。

    2023-05-10 09:49:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载