MySQL违反唯一键/主键约束的DML操作与binlog记录

当DML操作(INSERT/UPDATE)违反唯一键或主键约束时,MySQL是否会将此操作写入binlog取决于几个因素:

不同binlog格式下的行为

1. STATEMENT格式

  • 会记录:无论操作是否成功,语句本身都会被记录到binlog
  • 复制结果:从库执行时会再次遇到同样的约束冲突

2. ROW格式

  • 成功操作:只记录实际修改了数据的操作
  • 失败操作:违反约束的操作不会被记录到binlog
  • 例外情况:如果使用了IGNORE关键字(如INSERT IGNORE),即使有冲突也会记录部分信息

3. MIXED格式

行为会根据具体操作自动选择,通常与ROW格式表现一致

事务处理的影响

  • 如果操作在事务中且事务最终回滚,无论是否违反约束,整个事务都不会被记录到binlog
  • 只有成功提交的事务才会被写入binlog

特殊命令的处理

  • INSERT IGNORE:违反唯一约束的行会被跳过,但成功的插入会记录到binlog
  • REPLACE INTO:会先删除冲突行再插入新行,整个过程会记录到binlog
  • ON DUPLICATE KEY UPDATE:会记录更新操作到binlog

验证方法

可以通过以下命令检查实际写入binlog的内容:

SHOW BINLOG EVENTS IN 'mysql-bin.000001';

或使用mysqlbinlog工具:

mysqlbinlog /var/lib/mysql/mysql-bin.000001

总结

在大多数生产环境使用的ROW格式下,违反唯一键/主键约束的DML操作通常不会写入binlog,除非使用了特殊语法(如IGNORE)或操作最终成功提交。