私はトランザクションの初心者ですが、トランザクションログに関する質問です。トランザクションをコミットすると、変更はトランザクションログに書き込まれますが、トランザクションログはRAMまたは物理ファイルにありますか?RAM内にあり、システム障害が発生した場合、明らかにRAMが再消去されるため、トランザクション情報が失われるので、コミットを回復するにはどうすればよいでしょうか。
私はトランザクションの初心者ですが、トランザクションログに関する質問です。トランザクションをコミットすると、変更はトランザクションログに書き込まれますが、トランザクションログはRAMまたは物理ファイルにありますか?RAM内にあり、システム障害が発生した場合、明らかにRAMが再消去されるため、トランザクション情報が失われるので、コミットを回復するにはどうすればよいでしょうか。
回答:
この質問のかなり包括的なガイドはここにありますが、要約すると、SQL Serverは、トランザクションがディスクに強化されるまで、トランザクションをコミットしたアプリケーションに制御を返しません。具体的には、トランザクションログファイルに強化されたら、制御を戻すことができます。
この時点では、データはデータファイルに組み込まれていない可能性があり、データバッファーキャッシュに残っている可能性がありますが、トランザクションログに組み込まれているため、障害が発生した場合、データベースの回復によってこれを回復できます。トランザクションと変更を安全に永続化します。
トランザクションログへの順次書き込みのパフォーマンスへの影響を減らすために使用されるメモリには、ログバッファキャッシュがあります。バッファーはいくつかの条件でディスクにフラッシュされますが、その1つはトランザクションのコミットです。このデータが強化されるまで、制御は呼び出し元に返されないため、このバッファーのフラッシュ中に障害が発生した場合でも、このトランザクションはまだコミットされているとは見なされないため、トランザクションの一貫性は維持されます。そのトランザクションでのデータ変更は失われますが、コミットされなかったため、コミットが完了していないため、アプリケーションはそれらの変更が失われたと見なします。
データベースは、データファイルとトランザクションログファイルの2つのファイルで構成されます。これらはディスクに保存されます。
各データベースのRAMにはログキャッシュがあり、トランザクションがコミットされると、ディスクへのフラッシュを待機しているログキャッシュに移動されます。したがって、一時的に変換がコミットされてディスクにフラッシュされるのを待機している場合、変換はメモリ内にありますが、最終的にはRAMではなくファイル内のディスクに保存されます。
ここでは単純化しすぎています。トランザクションログを読むことをお勧めします。ここでは、Paul Randalsの講義の1つをお勧めします
他の人々から書かれたように、トランザクションログは常にCOMMIT
コントロールがアプリケーションに戻る前にディスクに書き込まれます。このため、ログファイルは常に高速SSDに配置する必要があります。
ただし、完全を期すために、少なくともWindows Server 2016とSQL Server 2016では、サーバーにNVDIMM(不揮発性DIMM =フラッシュまたはバッテリーバックアップRAM)を追加できました。この場合、SQL ServerはこのNVDIMMを使用して、NVDIMMに「ホット」トランザクションログテールを配置します。これは、定義に従って電源オフイベントが発生しても存続するためです。
これにより、書き込みの速度が大幅に向上します(RAMはSSDよりもはるかに高速であるため)。ただし、小さな書き込み/コミットが多いデータベース(例:忙しいオンラインショップの背後にあるデータベースまたは多くのオンラインゲームの背後にあるデータベース)でのみ言及します。同時プレーヤー)。