web-dev-qa-db-ja.com

mysql innodbがログの書き込みを取り消し、ディスクにfsyncすると、

トランザクションコミットの前に、すべてのdml操作はinnodbページを変更し、ディスクにフラッシュして元に戻すログを生成するため、元に戻すログがディスクに書き込まれ、fsyncが行われると、確実にロールバックされます。

2
shaoyihe
  • Buffer_pool内のブロックにデータ変更を加えますが、それらをディスクに書き込まないでください。
  • セカンダリインデックスの変更(INSERTなど)を変更バッファーに入れて、後で処理できるようにします。繰り返しますが、ディスクへの書き込みはまだ行われていません。
  • 元に戻すログファイルの書き込みとfsync ifinnodb_flush_log_at_trx_commit = 1(それ以外の場合、この書き込み/ fsyncは遅延します)。
  • COMMITが終了したことをクライアントに伝えます。

アイデアは、COMMITごとにfsyncを1つだけにすることです。そうでなければ、パフォーマンスは本当に悪いでしょう。

レプリケーションを使用している場合、binlogは書き込まれ(log_binを参照)、場合によってはfsyncされます(sync_binlogを参照)。そして、データは各スレーブに送られます。これらがシーケンスのどこで発生するか正確にはわかりません。

Galera/FXC/Group Replicationを使用している場合、他のノードとの同期により、質問に別の側面が追加されます。 (私はあなたがこれらの詳細を必要としないと仮定します。)

2
Rick James
1
user126897