2012-01-25 5 views
2

MySQL 5.5.20(行ベース)からバイナリログダンプがあります。 ( - > 1327402568 1327402566 <)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 

あなたは第二のタイムスタンプは、バイナリログの後半で見ることができるように:UPDATEイベントがINSERTイベントの前にあるので、今、私の奴隷が停止しました。 @がプライマリキーです。どちらの場合も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レプリケーションコードのバグに遭遇しました。これは、 'UPDATE'が' INSERT'がある前にbinlogに行ってはならないからです。 – Romain

答えて

1

は、バイナリログは、一度に1つのトランザクションを書かれています。あなたは、次のシナリオを貧弱なトランザクション分離レベルを使用している場合:

  1. トランザクションAは、BがUPDATE STATEMENT
  2. トランザクションBは、AがCOMITTED
ある COMMITTED
  • の取引で実行されますINSERT STATEMENT
  • トランザクションを実行します

    INSERTステートメントの前にUPDATEが書き込まれる可能性があります。 MySQLはCOMMITが実行される直前にトランザクション内にステートメントを書き込み、それ以外のステートメントが完了するとステートメントを記録します。しかし、これはトランザクション分離レベルが非常に低いためにトランザクションの関心がかなり無くなった場合にのみ有効です。

  • +0

    さて、私はコードを書き直し、もうトランザクションは使用しません...しかし、まだ起こっている:( –

    関連する問題