innodb_flush_log_at_trx_commit = 2`にしたところ、非常に速い書き込み速度が得られました。しかし、これを本番Webサイトで使用しても大丈夫なのでしょうか?
最大で1秒分のトランザクションが失われる可能性があります。デフォルト値は1で、これはInnoDBの[ACID Compliant][1]を維持するのに役立ちます。
MySQLドキュメントのinnodb_flush_log_at_trx_commitによると
innodb_flush_log_at_trx_commit の値が 0 であれば、ログバッファは 1秒に1回ログファイルに書き出され、ディスクへのflush 操作はログファイルに対して行われますが、トランザクションコミット時には何も行われません。 トランザクションコミット時には何も行われません。値が1(デフォルト)の場合、ログバッファの は、トランザクションコミットのたびにログファイルに書き出され ディスクへのフラッシュ操作がログファイルに対して実行されます。値が2の場合 値が2の場合、ログバッファはコミットのたびにファイルに書き出されますが ディスクへのフラッシュ操作は実行されません。しかし 値が2のときも、ログファイルのフラッシュは1秒に1回行われます。 なお、1秒に1回のフラッシュは100%ではありません。 1秒に1回のフラッシュは、プロセスのスケジューリング上の問題から、100%の保証はありません。
ACIDに完全に準拠するためには、デフォルトの値である1が必要です。以下のことが可能です。 1とは異なる値を設定することでパフォーマンスを向上させることができますが その場合、クラッシュ時に最大で1秒分のトランザクションを失う可能性があります。 値を 0 に設定すると、mysqld プロセスのクラッシュ時に最後の 1 秒分のトランザクショ ンが消去されます。 トランザクションが失われます。値が2の場合は、オペレーティングシステムのクラッシュや 停電のみがトランザクションの最後の1秒間を消去できます。InnoDB'の クラッシュリカバリーは値に関係なく動作します。
InnoDBを使用したレプリケーションでは、可能な限りの耐久性と一貫性を確保するために トランザクションを使用したInnoDBを使用したセットアップでは、以下を使用します。 マスターでinnodb_flush_log_at_trx_commit=1とsync_binlog=1を使用します。 サーバーのmy.cnfファイルを作成します。
となっています。 注意事項
多くのオペレーティングシステムや一部のディスクハードウェアでは、flush to disk 操作を騙すことがあります。フラッシュが行われていないにもかかわらず、フラッシュが行われたとmysqldに伝えることがあります。 行われていないにもかかわらず、フラッシュが行われたとmysqldに伝えることがあります。この場合、トランザクションの耐久性は 1に設定してもトランザクションの耐久性は保証されず、最悪の場合は停電によって 最悪の場合、停電によってInnoDBデータベースが破損する可能性もあります。バッテリーバックアップされた SCSIディスクコントローラまたはディスク自体にバッテリーバックアップされたディスクキャッシュを使用すると、ファイルのフラッシュが速くなります。 ファイルのフラッシュを高速化し、操作をより安全にします。また、Unix の hdp コマンドを使用してみてください。 Unixのhdparmコマンドを使用して、ディスク書き込みのキャッシュを無効にすることもできます。 また、ハードウェアキャッシュを無効にしたり、ハードウェアベンダーの ベンダーです。
これによると、1以外の値を設定した場合、InnoDBは1秒'分のトランザクション、つまり1トランザクションコミット'分のデータを失う危険性があります。
ドキュメントでは、sync_binlog=1
を使うようにも書かれています。
MySQLドキュメントのsync_binlogによると
1を選択するのが最も安全です。 バイナリログから最大で1つのステートメントまたはトランザクションを失います。 しかし、これは最も遅い選択でもあります。 しかし、最も遅い選択でもあります(ただし、ディスクにバッテリーバックアップされたキャッシュがあり、同期が非常に高速である場合を除く)。
最も安全な選択は
[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1
データ損失の可能性(最大1秒相当)を気にしないのであれば、報酬(より速い書き込み速度)がそれに見合うものであれば、自己責任で0または2のいずれかを使用することができます。
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にするのが一番安全です。
私の意見は他の人と異なります。 innodb_flush_log_at_trx_commit = 0 if: 私の開発用コンピュータや自宅のミニデータベースで、機密データがない場合。
innodb_flush_log_at_trx_commit = 2の場合。 ブログ、統計、e-コマース(1日に100倍の買い物をする)などの場合。
innodb_flush_log_at_trx_commit = 1 if: 多くの顧客がいる場合や、銀行のようにお金のやり取りをする必要がある場合。この場合は、データフローを複数のサーバーに分けて、スピードと安全性を確保する必要があります。
私は2を選びました。なぜなら、書き込み速度が75倍も速く、ハードウェアが故障した場合にのみ失敗するからです。
いずれにしても、あなたは自分が何を必要としているのかを知るべきだ。