MySQL二进制日志时间戳非顺序?

时间:2012-01-25 15:33:43

标签: mysql replication binary-log

我在MySQL 5.5.20(基于行)中有一个二进制日志转储。现在我的slave已停止,因为UPDATE事件在INSERT事件之前:

5424240-SET TIMESTAMP=1327402568/*!*/;
5424241-BEGIN
5424242-/*!*/;
5424243-# at 25715325
5424244-# at 25715417
5424245:#120124 11:56:08 server id 1  end_log_pos 25715417      Table_map: `auto`.`data_export` mapped to number 9142508
5424246-#120124 11:56:08 server id 1  end_log_pos 25716169      Update_rows: table id     9142508 flags: STMT_END_F
5424247:### UPDATE auto.data_export
5424248-### WHERE
5424249-###   @1=350049
5424250-###   @2='0522'
5424251-###   @3='50591'
5424252-###   @4=5
--
5424457-SET TIMESTAMP=1327402566/*!*/;
5424458-BEGIN
5424459-/*!*/;
5424460-# at 25717962
5424461-# at 25718054
5424462:#120124 11:56:06 server id 1  end_log_pos 25718054      Table_map: `auto`.`data_export` mapped to number 9142508
5424463-#120124 11:56:06 server id 1  end_log_pos 25718444      Write_rows: table id 9142508 flags: STMT_END_F
5424464:### INSERT INTO auto.data_export
5424465-### SET
5424466-###   @1=350049
5424467-###   @2='0522'
5424468-###   @3='50591'
5424469-###   @4=5

正如您所看到的,第二个时间戳在二进制日志中稍后(1327402566< - > 1327402568)。 @ 1是主键。这两种情况都是350049.但首先我会期待INSERT语句,而不是UPDATE ...

怎么可能这样呢?我怎么可能解决这个问题?

Could not execute Update_rows event on table auto.data_export; Can't find record in 'data_export', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.001459, end_log_pos 25716169

由于

1 个答案:

答案 0 :(得分:1)

二进制日志一次写入一个事务。如果您使用较差的事务隔离级别,则会出现以下情况:

  1. 事务A运行INSERT STATEMENT
  2. 交易B运行UPDATE STATEMENT
  3. 交易B为COMMITTED
  4. 交易A为COMITTED
  5. 可能导致在UPDATE语句之前写入INSERT,因为MySQL在执行COMMIT之前在事务中写入语句,否则在语句之后记录语句juste已经完成。但这只有在事务隔离级别如此之低以至于交易的利益几乎无效时才有效......