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