Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо в MySQL е безопасно да изключите innodb_support_xa за еднонишкови актуализации?

Като начало...

http://yoshinorimatsunobu.blogspot.com/2009 /08/great-performance-effect-of-fixing.html

Преди InnoDB Plugin 1.0.4 беше така:

obtain mutex
  write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log and fsync, for commit-phase
release mutex

На и след InnoDB Plugin 1.0.4 (и MySQL 5.5), сега е:

write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
obtain mutex
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log, for commit-phase
release mutex
fsync innodb log, for commit-phase

Както можете да видите, в новата версия нищо (освен в случай sync_binlog> 0) е fsync в критичната секция. По този начин груповото ангажиране вече работи и осигурява много по-добра едновременна пропускателна способност.

Например, с предишната "счупена" версия, ако сте имали 100 нишки едновременни комитации, всички fsync бяха сериализирани и ще получите 100 fsync за подготовка и още 100 fsync за комит. Следователно груповият ангажимент беше напълно нарушен.

Сега с по-новата реализация, fsync се групират в зависимост от паралелността на транзакциите, като същевременно се гарантира подреждането на операциите между innodb log и binlog. Това също означава, че ако има само една нишка, няма повишаване на производителността.

Що се отнася до въпроса ви, че когато възникне срив, след като транзакция е записана в binlog, но преди да бъде записана в регистъра на транзакциите - аз съм на същата страница като вас.

Ако сървърът се срине преди последната стъпка, има малък шанс да имате несъответствие между innodb log и binlog (или единият може да е по-напред от другия), но е гарантирано, чеимете цялата информация какво да прегледи в дневника innodb, тъй като е записан в подготвителната фаза.

Въпреки това, какво да правим с необвързаните все още е недетерминистично. Например, освен ако sync_binlog = 1 има вероятност подчинен да е получил данните, но все още не е синхронизирал напълно binlog на главния. Не можете просто да повторите неуспешната транзакция, тъй като тя може вече да се е изпълнявала на един от подчинените.

Което също така означава, че binlog може да бъде по-кратък от дневника innodb, връщайки „Двоичният дневник [име_на_файл] е по-къс от очаквания размер“. както е описано в официалния документ, и трябва да възстановите роба от нулата. Не е много приятелски настроен към хората.

http://dev.mysql.com/doc/refman /5.1/bg/binary-log.html

Тъй като последователността по отношение на подреждането на операциите е гарантирана независимо от innodb_support_xa настройка (която противоречи на казаното в официалния документ на innodb_support_xa , може би защото беше писано за стандартния innodb 5.0.3 далеч преди корекцията на паралелността), а съгласуваността между innodb log на главния и релейния дневник на подчинения не е строго гарантирана дори с innodb_support_xa , не виждам смисъл от използването на innodb_support_xa . Страшно е обаче да не следвате официалната препоръка, но тя изглежда остаряла и погрешна в много точки.

Чудя се дали има някаква връзка между innodb_flush_log_at_trx_commit настройка и innodb_support_xa поведение, когато първото е настроено на 2 или 0.

Един практичен начин на мислене е, че прехвърлянето към подчинения е безопасно – в края на краищата неуспешната транзакция е нещо, което сте искали да свършите – но никога не се връщайте към главен, тъй като може да има известно несъответствие в данните. Трябва да копирате напълно данните от подчинения, преди да направите главния нов подчинен. С други думи, когато главният се срине, от тогава нататък се доверявайте на подчинения – по този начин няма нужда да се забърквате с innodb log за възстановяване при срив.

Също така имайте предвид, че MySQL 5.5 поддържа полусинхронна репликация, по същата линия като „доверете се на роба“ – смятам, че може да се интересувате.

http://dev.mysql.com/doc/refman /5.5/bg/replication-semisync.html




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql съхранена процедура:изходен параметър

  2. Един елемент от теста на страница (php/mysql програма за тестове)

  3. Свързване с MySQL база данни в .NET

  4. Могат ли таблиците на системната база данни на MySQL да бъдат преобразувани в InnoDB?

  5. MySQL InnoDB Пълно текстово търсене, съдържащо имейл адрес