mysql - 添加具有默认值的非空列时,是否在 MySQL 中记录行级 binlog 条目

标签 mysql replication mysqlbinlog

我想验证我在 MySQL 基于行的复制中注意到的以下行为,以防我们的设置或配置出现特殊情况。打开基于行的复制,并给定下表名为 pets:

| id |   name    |    species   |
|----|-----------|--------------|
| 1  |   max     |    canine    |   
| 2  |   spike   |    canine    |
| 3  |   bell    |    feline    |

任何更新、删除或插入都记录在 binlog 中。但是,如果我要添加一个具有默认值的非空列,例如

ALTER TABLE `pets` 
ADD COLUMN `sex` varchar(7) NOT NULL DEFAULT "unknown" AFTER `species`;

记录更新如下:

| id |   name    |    species   |  sex
|----|-----------|--------------|--------
| 1  |   max     |    canine    |  unknown
| 2  |   spike   |    canine    |  unknown
| 3  |   bell    |    feline    |  unknown

我最初预期的行为是会记录每一行的更新(因为每一行都会发生变化),并且这些更新会出现在 binlog 中。然而,当添加新列和默认值时,实际上似乎根本没有行级事件被写入 binlog

无论如何,我的问题是:

  1. 这种行为是预期的,还是表明我们的设置(或我的观察能力)存在问题?
  2. 是否可以通过任何方式配置此行为?

任何信息、链接、资源等都将不胜感激。

谢谢,

最佳答案

作为 binlog format setting 上的 mysql 文档说(重点是我的):

With the binary log format set to ROW, many changes are written to the binary log using the row-based format. Some changes, however, still use the statement-based format. Examples include all DDL (data definition language) statements such as CREATE TABLE, ALTER TABLE, or DROP TABLE.

老实说,您的思路对我来说似乎不合逻辑,通过更新复制此类操作对我来说似乎完全没有效率。我知道一些复杂的 ddl-dml 语句可能会通过一系列插入/更新被部分复制,但这在这里不适用。

关于mysql - 添加具有默认值的非空列时,是否在 MySQL 中记录行级 binlog 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40353054/

相关文章:

mysql - drupal 查询按匹配结果中关键字出现次数排序

mongodb - 与删除的成员形成一个新的副本集

MySQL - 根据时间戳查找 bin 日志位置

mysql - 无法打开CloudSQL binlog : "No such file or directory"

mysql - 通过索引优化sql查询

mysql - MySQL 的数据库映射工具,以帮助从一个数据库迁移到另一个数据库?

sql - MySQL 添加总计列

mysql - 自动清除 mariadb 二进制日志

algorithm - Ehcache:配置后遵循什么缓存复制算法?

mysql - 是否有任何工具可用于以行格式解析mysql binlog文件并创建json