如题,今天做了个测试,连接本机mysql,测试insert等语句,客户端example执行后,将insert、update、delete等语句看成了DDL语句,但是,连接开发服务器上的mysql就正常,请问这是为什么呢?
原提问者GitHub用户Mrbug001
这个问题可能与 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 语句。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。