2

我想验证我在 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. 这种行为是否可以以任何方式配置?

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

谢谢,

4

1 回答 1

1

正如有关binlog 格式设置的 mysql 文档所说(重点是我的):

将二进制日志格式设置为 ROW 后,使用基于行的格式将许多更改写入二进制日志。但是,某些更改仍使用基于语句的格式。示例包括所有 DDL(数据定义语言)语句,例如 CREATE TABLE、ALTER TABLE或 DROP TABLE。

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

于 2016-11-01T02:17:21.230 回答