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