Безопасно ли использовать innodb_flush_log_at_trx_commit = 2

Я превратил innodb_flush_log_at_trx_commit = 2 и получаю очень быструю скорость записи. Но безопасно ли это использовать на веб-сайте производства?

48 голосов | спросил Bruce Dou 10 FebruaryEurope/MoscowbFri, 10 Feb 2012 09:36:22 +0400000000amFri, 10 Feb 2012 09:36:22 +040012 2012, 09:36:22

5 ответов


52

Вы можете потерять транзакции на одну секунду. Значение по умолчанию равно 1, что помогает поддерживать InnoDB ACID Compliant .

Согласно документации MySQL на innodb_flush_log_at_trx_commit

  

Если значение innodb_flush_log_at_trx_commit равно 0, буфер журнала   записывается в файл журнала один раз в секунду и сбрасывается на диск   операция выполняется в файле журнала, но ничего не делается на   транзакционная фиксация. Когда значение равно 1 (по умолчанию), буфер журнала   записывается в файл журнала при каждой транзакционной фиксации и   операция flush to disk выполняется в файле журнала. Когда значение   равно 2, буфер журнала записывается в файл при каждой фиксации, но   операция с флеш-диском не выполняется на нем. Однако   промывка в файле журнала происходит один раз в секунду, когда   значение равно 2. Обратите внимание, что промывка раз в секунду не является 100%   гарантированно произойдет каждую секунду из-за проблем с планированием процесса.

     

Значение по умолчанию 1 требуется для полного соответствия ACID. Ты можешь   добиться большей производительности, установив значение, отличное от 1, но   то вы можете потерять до одной секунды транзакции в случае сбоя.   При значении 0 любой аварийный процесс mysqld может стереть последнюю секунду   транзакций. При значении 2 только сбой операционной системы или   отключение питания может стереть последнюю секунду транзакций. InnoDB-х   аварийное восстановление работает независимо от значения.

     

Для максимально возможной прочности и согласованности в репликации   настройка с использованием InnoDB с транзакциями, использование   innodb_flush_log_at_trx_commit = 1 и sync_binlog = 1 в вашем хозяине   server my.cnf.

     

Внимание!

     

Многие операционные системы и некоторые дисковые устройства обманывают флеш-диск   операция. Они могут сказать mysqld, что флеш произошел, даже   хотя это не так. Тогда долговечность транзакций не   гарантируется даже при настройке 1, а в худшем случае - мощность   отказ может даже повредить базу данных InnoDB. Использование аккумуляторной батареи   дискового кэша в контроллере диска SCSI или на самом диске ускоряет   файлов, и делает работу более безопасной. Вы также можете попробовать использовать   команда Unix hdparm для отключения кэширования записи диска в   аппаратные кэши или использовать какую-либо другую команду, специфичную для аппаратного обеспечения   поставщик.

Исходя из этого, значения, отличные от 1, заставляют InnoDB рисковать потерять транзакции на 1 секунду или стоимость транзакционных транзакций.

В документации также говорится, что используйте sync_binlog = 1 .

В соответствии с Документацией MySQL на sync_binlog

  

Значение 1 является самым безопасным выбором, поскольку в случае сбоя вы   потерять не более одного оператора или транзакции из двоичного журнала.   Тем не менее, это также самый медленный выбор (если на диске нет   кеш с батареей, что делает синхронизацию очень быстрой).

Самый безопасный выбор -

  [туздЫ]
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
 

Если вы не возражаете против возможной потери данных (до 1 секунды), вы можете использовать 0 или 2 на свой страх и риск, если вознаграждение (более высокая скорость записи) того стоит.

ответил RolandoMySQLDBA 10 FebruaryEurope/MoscowbFri, 10 Feb 2012 09:54:52 +0400000000amFri, 10 Feb 2012 09:54:52 +040012 2012, 09:54:52
21

innodb_flush_log_at_trx_commit используется с целью как ..

Если значение innodb_flush_log_at_trx_commit равно 0, буфер журнала записывается в файл журнала один раз в секунду, а операция с флеш-диском выполняется в файле журнала, но ничего не делается на транзакционная фиксация.

Когда значение равно 1 (по умолчанию), буфер журнала записывается в файл журнала при каждом фиксации транзакции, а операция с флеш-диском выполняется в файле журнала.

Когда значение равно 2, буфер журнала записывается в файл при каждом фиксации, но операция flush to disk на нем не выполняется. Тем не менее, промывка в файле журнала происходит один раз в секунду, когда значение равно 2. Обратите внимание, что сброс раз в секунду не гарантируется на 100% каждый раз, из-за проблем с планированием процесса.

Значение по умолчанию 1 требуется для полного соответствия ACID. Вы можете добиться большей производительности, установив значение, отличное от 1, но затем вы можете потерять до одной секунды транзакции при сбое. При значении 0 любой сбой процесса mysqld может стереть последнюю секунду транзакций. При значении 2 только крах операционной системы или отключение питания могут стереть последнюю секунду транзакций. Восстановление аварийного восстановления InnoDB работает независимо от значения.

По-моему, использование innodb_flush_log_at_trx_commit до 2 не должно быть проблемой. Но использовать 1 является самым безопасным.

ответил Abdul Manaf 10 FebruaryEurope/MoscowbFri, 10 Feb 2012 09:55:10 +0400000000amFri, 10 Feb 2012 09:55:10 +040012 2012, 09:55:10
20

Мое мнение отличается от другого. innodb_flush_log_at_trx_commit = 0, если: это мой компьютер разработки или домашняя мини-база данных, где нет конфиденциальных данных.

innodb_flush_log_at_trx_commit = 2, если: это блог /статистика /электронная коммерция (с магазином ~ 100x в день) и т. д.

innodb_flush_log_at_trx_commit = 1, если: у вас много клиентов или вам нужно работать с денежными транзакциями, такими как банк. поэтому на этот раз вы должны разделить поток данных между несколькими серверами, чтобы иметь скорость и amp; безопасность.

Я предпочитаю 2, потому что он имеет ~ 75 раз быстрее скорость записи, и он не работает ТОЛЬКО, если аппаратное обеспечение выходит из строя.

Во всяком случае, вы должны знать, что вам нужно гораздо больше скорости записи или до 1 секунды информации?

ответил Sertekmedia 13 Jpm1000000pmMon, 13 Jan 2014 17:33:47 +040014 2014, 17:33:47
1

Я пытаюсь ответить, какова цель innodb_flush_log_at_trx_commit?

InnoDB выполняет большую часть своих операций в памяти ( InnoDB Buffer Pool ). Al измененных данных записывается в файл журнала транзакций InnoDB , а затем очищается (записывается) до длительного хранения (жесткий диск).

Для обеспечения безопасности данных ( Долговечность от ACID ) InnoDB должен хранить измененные данные каждой транзакции в постоянном хранилище. В то же время фиксация диска для каждой транзакции является дорогостоящим процессом.

Disk I /O - это процесс блокировки, и он очень медленный, это медленный диск, в дальнейшем он уменьшит количество транзакций InnoDB в секунду (пропускная способность диска).

InnoDB предоставляет переменную innodb_flush_log_at_trx_commit для управления частотой этой операции очистки. Основываясь на значении, операция flush InnoDB ведет себя по-разному.

(Уже объяснено в других ответах)

0 - записывать в файл журнала и сбрасывать на диск каждую секунду (данные в пуле буферов не записываются в файл журнала - для повышения производительности). 1 - Сброс на диск при совершении транзакции - по умолчанию (для обеспечения безопасности данных - соответствия ACID) 2 - записывать в файл журнала для каждой транзакции и сбрасывать на диск каждую секунду. (Для увеличения производительности)

В зависимости от требований приложения ( Безопасность данных Vs ) вы можете установить эту переменную. Разница между 0 и 2 - обе увеличивают производительность, значение 2 хранит данные в файле транзакции и может быть восстановлено в случае сбоя или сбоя, но не в 0.

Во многих случаях flush to disk означает средство, данные записываются из пула буферов InnoDB (память) в кеш операционной системы , которые фактически не записываются на диск хранения (постоянное хранилище). В случае отказа, в худшем случае, вы можете потерять данные до одной секунды)

Производительность зависит от среды, и вы можете сравнить ее и определить. В среде репликации для обеспечения безопасности и согласованности данных установите innodb_flush_log_trx_commit = 1 и sync_binlog = 1 .

Если производительность является основной целью приложения, InnoDB предоставляет переменную для управления частотой брекетинга журнала - innodb_flush_log_at_timeout - который позволяет установить диапазон частот промывки журнала от от 1 до 2700 секунд , по умолчанию оно равно 1.

Помните, что когда вы увеличиваете интервал очистки до N секунд, прирост производительности приходит с компромиссом в области безопасности данных до N секунд. Например, если вы установили, что промывка происходит каждые 5 секунд, пропускная способность очень высока, но в случае сбоя питания или сбоя системы вы потеряете данные в течение 5 секунд.

В этой статье рассказывается о Операции по очистке и транзакции InnoDB .

Вы можете изменить после выполнения режима 2 на aws rds:

 может измениться после выполнения режима 2 на aws

 previewchanges

Немодифицируется в некоторых случаях, например, если у вас есть репликация multi a-z:

 FYI, не поддающийся модификации в некоторых случаях

ответил rathishDBA 15 +03002017-10-15T08:58:18+03:00312017bEurope/MoscowSun, 15 Oct 2017 08:58:18 +0300 2017, 08:58:18
0

Если ваше оборудование выходит из строя, вы можете потерять все свои данные, поэтому я использую param = 2 без каких-либо проблем. В любом случае вы можете разделить ваши чувствительные (заказы, виртуальные деньги, ...) и регулярные (статистика, тележку, ...) данные между серверами 2 db и сохранять их в безопасности и быстро. Для транзакций между базами данных вы можете использовать http://dev.mysql.com/DOC /RefMan /5.7 /ен /xa.html

ответил Karolis Mačiulskis 1 FebruaryEurope/MoscowbMon, 01 Feb 2016 11:38:06 +0300000000amMon, 01 Feb 2016 11:38:06 +030016 2016, 11:38:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132