MySql Binlog Update语句Where子句包含所有表列,即使客户端在运行查询时仅使用Where子句中的主键

np8igboo  于 2023-03-11  发布在  Mysql
关注(0)|答案(2)|浏览(103)

检查BinLog时发现以下声明:它在where子句中有所有的表列。我传递给mysql的查询只有一个列-主键列,那么为什么日志在BinLog中写所有的列?我有一个特殊的问题与BinLog这样做:这是导致BinLog恢复非常非常慢。我不是MySQL DBA。请分享您的经验,在这个问题上。

UPDATE `ctbmysql`.`ctm`
### WHERE
###   @1=1139195549890498825
###   @2=1138051383057521436
###   @3=1615397172
###   @4=''
###   @5=1130000000662993985
###   @6=113
###   @7=''
###   @8=''
###   @9=1635370236
###   @10='49.128.173.183'
###   @11='49.128.173.146'
###   @12=''
###   @13=''
###   @14=''
###   @15=0
###   @16=1
###   @17=''
###   @18=''
###   @19=''
###   @20=0
###   @21='google-play'
###   @22=4217121370623809752
###   @23=''
###   @24=1
###   @25=''
###   @26=''
###   @27=0
### SET
###   @1=1139195549890498825
###   @2=1138051383057521436
###   @3=1615397172
###   @4=''
###   @5=1130000000662993985
###   @6=113
###   @7=''
###   @8=''
###   @9=1635453015
###   @10='150.242.24.246'
###   @11='49.128.173.146'
###   @12=''
###   @13=''
###   @14=''
###   @15=0
###   @16=1
###   @17=''
###   @18=''
###   @19=''
###   @20=0
###   @21=''
###   @22=4217121370623809752
###   @23=''
###   @24=1
###   @25=''
###   @26=''
###   @27=0
72qzrwbm

72qzrwbm1#

MySQL支持两种不同的binary log formats以及两者的混合:

  • STATEMENT使日志记录基于语句。
  • ROW使日志记录基于行。这是默认值。
  • MIXED使日志记录使用混合格式。

可通过设置binlog_format配置选项来选择一个。
您在日志中看到的是行格式。它列出了要更新的行(及其所有值)。这 * 不 * 应该是您的原始查询,它只是看起来相似。例如,如果您的更新影响了多行,它将为您的单个原始更新查询创建多个行更新。
这是预期的行为。从Advantages and Disadvantages of Statement-Based and Row-Based Replication
RBR可以生成更多必须记录的数据。若要复制DML语句(如UPDATE或DELETE语句),基于语句的复制仅将语句写入二进制日志。相反,基于行的复制将每个更改的行写入二进制日志。如果语句更改了许多行,则基于行的复制可能会将更多数据写入二进制日志;即使对于回滚的语句也是如此。2这也意味着制作和恢复备份可能需要更多的时间
然而,基于行的复制是默认的,这是有原因的:
基于行的复制的优点:

  • 可以复制所有更改。这是最安全的复制形式。
bt1cpqcv

bt1cpqcv2#

参数binlog_row_image可能有帮助

相关问题