Временные метки двоичного журнала MySQL не последовательные? - PullRequest
2 голосов
/ 25 января 2012

У меня есть двоичный дамп журнала из MySQL 5.5.20 (на основе строк).Теперь мой подчиненный остановился, потому что событие 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 Ответ

1 голос
/ 25 января 2012

Бинарный журнал записывается по одной транзакции за раз.Если вы используете плохие уровни изоляции транзакции, следующий сценарий:

  1. Транзакция A выполняет INSERT STATEMENT
  2. Транзакция B выполняет транзакцию UPDATE STATEMENT
  3. B - COMMITTED
  4. Транзакция A - COMITTED

Может привести к записи UPDATE перед оператором INSERT, поскольку MySQL записывает операторы в транзакциях как простоперед выполнением COMMIT, и в противном случае записывает операторы по истечении срока их действия.Но это работает, только если уровень изоляции транзакций настолько низок, что интерес к транзакциям в значительной степени аннулируется ...

...