添加具有默认值的非空列时,行级二进制日志条目是否记录在 MySQL 中
Do row-level binlog entries get recorded in MySQL when a non-null column with a default gets added
我想验证我在 MySQL 基于行的复制中注意到的以下行为,以防我们的设置或配置出现特殊情况。打开基于行的复制,并给定以下 table 名为 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。
无论如何,我的问题是:
- 这种行为是预期的,还是表明我们的设置(或我的观察能力)存在问题?
- 是否可以通过任何方式配置此行为?
任何信息、链接、资源等将不胜感激。
谢谢,
正如 mysql 关于 binlog format setting 的文档所说(重点是我的):
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 基于行的复制中注意到的以下行为,以防我们的设置或配置出现特殊情况。打开基于行的复制,并给定以下 table 名为 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。
无论如何,我的问题是:
- 这种行为是预期的,还是表明我们的设置(或我的观察能力)存在问题?
- 是否可以通过任何方式配置此行为?
任何信息、链接、资源等将不胜感激。
谢谢,
正如 mysql 关于 binlog format setting 的文档所说(重点是我的):
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 语句可能会通过一系列的插入/更新被部分复制,但这在这里不适用。