2012-01-25 59 views
2

我有一個從MySQL 5.5.20(基於行)的二進制日誌轉儲。現在我的奴隸停止,因​​爲UPDATE事件是INSERT事件之前:MySQL二進制日誌時間戳非順序?

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 

感謝

+0

這兩個語句是否從同一事務執行? – Romain

+0

在這種情況下,我正在使用MyISAM表,並使用INSERT的DELAYED語句。但是在延遲插入實際寫入之前,它不能在UPDATE上工作...(因爲我在更新之前選擇了表 - 不選擇更新)。 MyISAM表有表級鎖定,沒有交易......所以我在這裏沒有線索?你會如何解釋這種行爲? –

+0

在這種情況下,你可能會在MySQL複製代碼中遇到一個bug,因爲'UPDATE'不應該在INSERT出現之前將它寫入binlog。 – Romain

回答

1

二進制日誌在每次寫一個事務。如果您在使用較差的事務隔離級別,以下情形:

  1. 事務A運行INSERT STATEMENT
  2. 事務B運行UPDATE STATEMENT
  3. 事務B是COMMITTED
  4. 事務A是COMITTED

可能會導致UPDATE寫在INSERT聲明之前,因爲在執行COMMIT之前,MySQL會在事務中寫入語句,否則在完成語句後記錄語句。但是,這隻有在事務隔離級別太低以至於事務的利益幾乎失效時才起作用...

+0

那麼,我已經重寫了代碼,不再使用任何交易......儘管如此 –