web-dev-qa-db-ja.com

innodb_flush_log_at_trx_commit = 2を使用しても安全ですか?

innodb_flush_log_at_trx_commit = 2と非常に速い書き込み速度を取得します。しかし、プロダクションWebサイトで使用しても安全ですか?

57
Bruce Dou

最大1秒分のトランザクションを失う可能性があります。デフォルト値は1で、これはInnoDB ACID準拠 を維持するのに役立ちます。

MySQLのドキュメントによる innodb_flush_log_at_trx_commit

Innodb_flush_log_at_trx_commitの値が0の場合、ログバッファーは1秒に1回ログファイルに書き出され、ディスクへのフラッシュ操作がログファイルで実行されますが、トランザクションのコミットでは何も行われません。値が1(デフォルト)の場合、ログバッファーはトランザクションのコミットごとにログファイルに書き込まれ、ディスク操作へのフラッシュがログファイルで実行されます。値が2の場合、ログバッファーはコミットごとにファイルに書き出されますが、ディスクへのフラッシュ操作はそのファイルに対して実行されません。ただし、値が2の場合も、ログファイルのフラッシュは1秒に1回行われます。1秒に1回のフラッシュは、プロセスのスケジュールの問題により、毎秒100%発生することが保証されているわけではありません。

ACIDに完全に準拠するには、デフォルト値の1が必要です。 1以外の値を設定することでパフォーマンスを向上できますが、クラッシュで最大1秒のトランザクションを失う可能性があります。値が0の場合、mysqldプロセスがクラッシュすると、トランザクションの最後の1秒が消去される可能性があります。値が2の場合、オペレーティングシステムのクラッシュまたは停電のみがトランザクションの最後の1秒を消去できます。 InnoDBのクラッシュリカバリは、値に関係なく機能します。

トランザクションでInnoDBを使用するレプリケーションセットアップで可能な限り最大の耐久性と一貫性を実現するには、マスターサーバーのmy.cnfファイルでinnodb_flush_log_at_trx_commit = 1とsync_binlog = 1を使用します。

注意

多くのオペレーティングシステムと一部のディスクハードウェアは、ディスクへのフラッシュ操作をだます。フラッシュが行われていないにもかかわらず、フラッシュが行われたことをmysqldに通知する場合があります。その場合、設定1でもト​​ランザクションの耐久性は保証されません。最悪の場合、停電がInnoDBデータベースを破壊することさえあります。 SCSIディスクコントローラまたはディスク自体でバッテリバックアップ式のディスクキャッシュを使用すると、ファイルのフラッシュが高速化され、操作がより安全になります。また、Unixコマンドhdparmを使用してハードウェアキャッシュでのディスク書き込みのキャッシュを無効にするか、ハードウェアベンダー固有のコマンドを使用することもできます。

これに基づいて、1以外の値はInnoDBを1秒相当のトランザクション、またはトランザクションコミット相当のデータを失うリスクにさらします。

ドキュメントには、usesync_binlog=1

MySQLのドキュメントによる sync_binlog

クラッシュが発生した場合、バイナリログから最大で1つのステートメントまたはトランザクションが失われるため、値1が最も安全な選択です。ただし、これは最も遅い選択でもあります(ディスクにバッテリバックアップ式のキャッシュがあり、同期が非常に高速にならない限り)。

あなたの最も安全な選択は

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1

可能なデータ損失(最大1秒の価値)を気にしない場合、報酬(より速い書き込み速度)が価値がある場合は、自己の責任において0または2を使用できます。

59
RolandoMySQLDBA

innodb_flush_log_at_trx_commitは、..という目的で使用されます。

innodb_flush_log_at_trx_commitの値が0の場合、ログバッファーは1秒に1回ログファイルに書き込まれ、ディスクへのフラッシュ操作はログファイルで実行されますが、トランザクションのコミットでは何も行われません。

値が1(デフォルト)の場合、ログバッファーはトランザクションのコミットごとにログファイルに書き込まれ、ディスク操作へのフラッシュがログファイルで実行されます。

値が2の場合、ログバッファーはコミットごとにファイルに書き出されますが、ディスクへのフラッシュ操作はそのファイルに対して実行されません。ただし、値が2の場合も、ログファイルのフラッシュは1秒に1回行われます。1秒に1回のフラッシュは、プロセスのスケジュールの問題により、毎秒100%発生することが保証されているわけではありません。

ACIDに完全に準拠するには、デフォルト値の1が必要です。 1以外の値を設定することでパフォーマンスを向上できますが、クラッシュで最大1秒のトランザクションを失う可能性があります。値が0の場合、mysqldプロセスがクラッシュすると、トランザクションの最後の1秒が消去される可能性があります。値が2の場合、オペレーティングシステムのクラッシュまたは停電のみがトランザクションの最後の1秒を消去できます。 InnoDBのクラッシュリカバリは、値に関係なく機能します。

私の意見では、innodb_flush_log_at_trx_commitに2を使用することは問題になりません。しかし、1を使用するのが最も安全です。

26
Abdul Manaf

私の意見は他の意見とは異なります。 innodb_flush_log_at_trx_commit = 0次の場合:機密データがない開発用コンピューターまたはホームミニデータベース。

innodb_flush_log_at_trx_commit = 2 if if:it is blog/stats/e-commerce(with 100x shop in day)など.

innodb_flush_log_at_trx_commit = 1次の場合:多くの顧客がいる、または銀行のような金銭取引を処理する必要がある。したがって、今回は、速度と安全性を確保するために、データフローを複数のサーバーに分割する必要があります。

書き込み速度が約75倍速く、ハードウェアに障害が発生した場合にのみ失敗するため、2を選択します。

とにかく、あなたはより多くの書き込み速度または最大1秒の情報が必要なものを知っているべきですか?

25
Sertekmedia

_innodb_flush_log_at_trx_commit?_の目的は何ですか?

InnoDBはほとんどの操作をメモリで実行します(_InnoDB Buffer Pool_)。変更されたデータはすべて_InnoDB transaction log file_に書き込まれ、その後永続ストレージ(ハードディスク)にフラッシュ(書き込み)されます。

データの安全性(_Durability from ACID_)のために、InnoDBは各トランザクションの変更されたデータを永続的なストレージに保存する必要があります。同時に、各トランザクションのディスクへのコミットはコストのかかるプロセスです。

ディスクI/Oはブロッキングプロセスであり、非常に低速で、低速のディスクであり、さらに_InnoDB transaction per seconds_(ディスクスループット)の数を減らします。

InnoDBは、このフラッシュ操作の頻度を制御する_innodb_flush_log_at_trx_commit_変数を提供します。値に基づいて、InnoDBフラッシュ操作は異なる動作をします。

(すでに他の回答で説明されています)

0-ログファイルに書き込み、毎秒ディスクにフラッシュします(データはバッファープールにあり、ログファイルには書き込まれません-パフォーマンス向上のため)。 1-トランザクションがコミットしたときにディスクにフラッシュします-デフォルト(データの安全性-ACID準拠)2-すべてのトランザクションのログファイルに書き込み、毎秒ディスクにフラッシュします。 (パフォーマンス向上のため)

アプリケーションの要件(_Performance Vs data safety_)によって異なりますが、この変数を設定できます。 0と2の違い-どちらもパフォーマンスが向上します。値2はデータをトランザクションファイルに格納し、クラッシュや障害が発生した場合に回復可能ですが、0にはできません。

多くの場合、ディスクへのフラッシュはデータがInnoDB buffer pool (memory) to Operating systems cacheから実際に書き込まれるのではなく、ストレージディスク(永続的なストレージ)に書き込まれることを意味します。失敗した場合、最悪の場合、最大1秒でデータが失われる可能性があります)

パフォーマンスの向上は環境によって異なり、ベンチマークと特定が可能です。レプリケーション環境では、データの安全性と一貫性のために、_innodb_flush_log_trx_commit = 1_および_sync_binlog=1_を設定します。

パフォーマンスがアプリケーションの主な目的である場合、InnoDBはログフラッシュの頻度を制御する変数を提供します-_innodb_flush_log_at_timeout_-ログフラッシュの頻度範囲を_1 to 2700 seconds_から設定できます。デフォルトでは1です。

フラッシュ間隔を最大N秒に増やすと、パフォーマンスが向上し、データの安全性が最大N秒低下します。たとえば、フラッシュが5秒ごとに発生するように設定した場合、スループットの向上は非常に高くなりますが、停電やシステムクラッシュの場合は、5秒に相当するデータが失われます。

この記事では、 InnoDBのフラッシュとトランザクションのコミット 操作について説明します。

Aws rdsでモード2を実行した後で変更できます。

can change after you do mode 2 on aws

previewchanges

レプリケーションマルチa-zがある場合など、場合によっては変更できません。

FYI unmodifiable in some cases

3
Rathish

ハードウェアに障害が発生すると、すべてのデータが失われる可能性があるため、心配することなくparam = 2を使用します。とにかく、2つのdbサーバー間で機密データ(注文、仮想お金など)と通常のデータ(統計、カートなど)を分割して、それらを安全かつ高速に保つことができます。データベース間のトランザクションには、 http://dev.mysql.com/doc/refman/5.7/en/xa.html を使用できます。

1