Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当添加带有默认值的非空列时,行级binlog条目是否记录在MySQL中_Mysql_Replication_Mysqlbinlog - Fatal编程技术网

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

当添加带有默认值的非空列时,行级binlog条目是否记录在MySQL中,mysql,replication,mysqlbinlog,Mysql,Replication,Mysqlbinlog,我想验证我在基于行的MySQL复制中注意到的以下行为,以防我们的设置或配置有什么特殊之处。启用基于行的复制,并给出名为pets的下表: | id | name | species | |----|-----------|--------------| | 1 | max | canine | | 2 | spike | canine | | 3 | bell | feline | 任何更新、删除或

我想验证我在基于行的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

无论如何,我的问题是:

  • 这是预期的行为,还是表明我们的设置(或我的观察技能)存在一些问题
  • 这种行为是可以配置的吗
  • 任何信息、链接、资源等都将不胜感激

    谢谢,

    正如mysql文档中所说(重点是我的):

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


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

    我不希望mysql在复制此语句时发出一系列updates语句,因为将默认值指定给字段肯定不是对其内容的更新。此外,您的逻辑是不一致的,因为您不希望为默认值为null的字段生成一系列更新。Null是一个值,就像你选择的其他默认值一样。谢谢@Shadow,是的,你说Null也是一个值也是对的。这对我来说仍然是一个更新,但我理解你的观点。从高层次上讲,在行复制打开的情况下,为什么新的默认值不会反映在binlog中对我来说没有意义(我的意思是,行在某种意义上发生了变化,所以我希望在binlog中看到一些东西)。不管怎么说,这可能是我的经验不足-但是任何关于为什么会出现这种情况的进一步讨论的文档链接都是很好的。好的,在文档中找到了参考资料,请参阅下面的我的答案。@Shadow我在下面对你的答案进行了评论-但我不认为我所问的问题像你所说的那样不合逻辑。不管怎样,我感谢你的意见,我可以诚实地看到这两种行为的好处——这就是为什么我很好奇它是否是可配置的——我知道最初的ALTER表是以基于语句的格式编写的——但是不同的DDL语句对数据本身有不同的副作用——所以我假设基于行的更改会得到反映在binlog中启用基于行的复制。我明白你的观点,如果binlog的下游使用者是另一个MySQL实例(MySQL知道如何运行DDL语句,这很好),那么效率会很低,但是对于其他类型的下游系统,行级别的更改可能更有用。不管是哪种方式,感谢您在mysql中的回答,所有默认字段值都是确定性的(常量值或当前时间戳),因此对这些语句执行基于整行的复制没有太多意义。