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


54

私は回っinnodb_flush_log_at_trx_commit = 2て、非常に速い書き込み速度を得る。しかし、実稼働Webサイトで使用しても安全ですか?

回答:


57

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

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

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秒間のトランザクション、またはトランザクションのコミットに相当するデータを失うリスクがあります。

ドキュメントにはuseも記載されていますsync_binlog=1

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

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

最も安全な選択は

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1

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


3
ローランド:sync_binlog = 1 ...最後の数行のための1
アブドゥルManaf

@AbdulManaf、常に速度よりもデータの整合性を重視します。データの整合性のために速度を犠牲にしたい場合は、データの問題に対処するためにより多くの時間を費やすことに気付くでしょう。
Pacerier

1
@RolandoMySQLDBA、「数秒のトランザクションを失う」ということは、成功 commitが実際に失われる可能性があるということですか?
-Pacerier

1
パセリエ、はい。データは、「ディスクにフラッシュ」された後にのみディスクに書き込まれることが保証されています。それまでは、RAMメモリのみにある可能性があります。
エミールヴィクストローム

2
@RolandoMySQLDBA真剣にあなたは男です。フルタイムのmysqlコンサルティングギグ以外のことを行う場合は、おそらくキャリアパスを変更する必要があります。
sjas

25

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を使用することが最も安全です。


3
私はあなたが基本的に同じ答えで私からわずか18秒後に答えたことにちょうど気づきました。+1 !!!
-RolandoMySQLDBA

24

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

innodb_flush_log_at_trx_commit = 2の場合:ブログ/統計/ eコマース(1日に最大100倍のショップがある)など。

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

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

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


1
+175x faster write speed and it fails ONLY if hardware fails.
ナマンガラ

3
75倍高速ですか? 引用が必要です。
Pacerier

5
私自身のベンチマーク:5000 UPDATEwith innodb_flush_log_at_trx_commit = 1:179秒。ありinnodb_flush_log_at_trx_commit = 2:1.12秒。私の場合、書き込み速度は160倍高速です。
ケビン

いい答えだ。考慮すべきことの1つは、トランザクションが成功した後にマシンがクラッシュした場合、トランザクションがinnodb_flush_log_at_trx_commit = 2でディスクに書き込まれ、アプリケーションに成功が示される可能性があるということです(つまり、mysqldはトランザクションが正常に終了したことを示すネットワークパケットを送信します)あなたのアプリでドライバ)に、その可能性は非常に非常に低いです
ウラジスラフVaintroub

あなたは、ドキュメントが何を意味するか指定することで、あなたの答えをimroveすることができますcrash
SHAREEF

2

私は答えようとしています、何の目的ですか 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秒ごとにログファイルに書き込み、ディスクにフラッシュします(パフォーマンス向上のため、データはログファイルに書き込まれないバッファプールにあります)。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 = 1sync_binlog=1ます。

パフォーマンスは、アプリケーションの主な目的であるならば、InnoDBは紅潮ログの周波数を制御する変数を提供- innodb_flush_log_at_timeout-あなたからフラッシング周波数範囲のログを設定することができますされ1 to 2700 seconds、デフォルトでは1です。

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

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

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

AWSでモード2を実行した後に変更できます

プレビュー変更

レプリケーションマルチazがある場合など、場合によっては変更不可:

場合によっては変更できないFYI


1

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


「すべてのデータを失う」、または過去数秒程度でクエリが実行されていたトランザクションを意味しますか?
ニック・ニューマン

1
ハードウェアの障害とは、ハードドライブ全体を失うことを意味する場合があります。したがって、「すべてのデータが失われます」。したがって、レプリケーションのセットアップがない限り、データはバックアップの
頻度に左右される
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.