4

では、どうぞ。私はデータベースの第一人者でも管理者でもありません。実際、インデックスやクエリのチューニングをときどき行う以外は、データベースを頻繁に調べたりはしません。よくわからないものの 1 つは、SQL Server トランザクション ログです。それが何のためにあるのか、何が含まれているのか、そしてどのように機能するのか (少なくとも概念的には) は知っていますが、SQL Server がトランザクション ログにそれほど関連付けられているように見える理由がわかりません。

これが最初の質問です。間違っている場合は訂正してください。ただし、デフォルトでは、トランザクション ログには、データベース内のすべての変更の履歴全体が含まれているように思えます。これが実際に当てはまる可能性があることを示す 2 つの兆候があります。新しいデータベースを作成すると、そのログの最大サイズが「無制限の拡張」に設定されます。2 番目の理由は、私が何をしても縮小できない巨大なトランザクション ログを持つ小さなデータベースを扱ってきたことです。とても奇妙に思えますが、それが本当だとは信じられません。デフォルトで履歴全体が必要になるのはなぜですか? 私が気にするのは、一貫した状態の最新バージョンのデータだけです。まあ、場合によっては正当な理由があるのではないかと思いますが、これは追加のオプションと考えています。

2 番目の質問は、遷移ログを削除するのがなぜそれほど複雑なのかということです。それは私だけですか、それとも実際にそれを行う直接的な方法はありませんか? つい最近、私は 5MB のデータベースの 100MB 以上のログを取り除こうとしましたが、見つけた最も簡単な方法は、データベースをデタッチし、ログを削除して、再度アタッチすることでした (SQL Server でさえ少し文句を言いました)。可能なすべてのオプションを指定して縮小コマンドを試しましたが、約 50% までしか縮小できませんでした。データベースは使用されておらず (アクティブな接続はありません)、正直なところ、過去の遷移はまったく気にしませんでした。それを行う方法が他にもいくつかあることに気付きました。バックアップと復元を伴うものもあります。

私は熱心に MSDN のドキュメントを読み、トランジションについてもっと学ぼうとしましたが、約 15 分後、まるで泥の中をぐるぐる回っているように感じ、諦めました。データベース管理者や専門家にとって、私の質問はばかげているように聞こえることはわかっています。フィードバックをいただければ幸いです。

編集:最初の回答の後、私は十分に明確でない可能性があることに気付きました. トランザクション中にトランザクション ログがどのように機能するか、それが重要である理由、およびバックアップ目的で使用できることを認識しています。開発者の観点からもっと質問したかったと思います。ほとんどの場合、バックアップを必要とせず、私以外に誰も使用していない一時データベースのステージング/テストを扱っています。また、そのような状況では、データベースを転送する必要があり、膨大な移行ログを持つことは不必要な不便であることがよくあります。 .

4

5 に答える 5

10

データベース ログは、IIS ログのように、事実の履歴記録の後のものではありません。Write-Ahead Logging を使用するデータベースでは、ログは主要な復元、やり直し、元に戻すソースであり、すべての目的において信頼できるデータ ソースです。ログの削除または置換は、データベース管理者が行う最悪の決定の 1 つです。現在、データベースが破損している可能性があります。

ログを切り捨てる適切な方法は、完全なデータベース バックアップを実行した後、データベース ログ バックアップを実行し、その後に定期的なログ バックアップを実行することです。これにより、ログのスペースが解放され、再利用できるようになります。物理 LDF ファイルは縮小されません。

もう 1 つの方法は、復旧モデルをSIMPLEに変更することです。これにより、サーバーはログ ファイルを自動的にリサイクルできるようになります。リカバリ モデルを SIMPLE に変更すると、ポイント イン タイム リカバリなどの特定のディザスタ リカバリ シナリオを適用できなくなり、最後のバックアップ以降のデータ変更をリカバリできなくなるため、データベースのリカバリ可能性に影響があります。

SQL Server で
のログ記録と復旧について ログとログ バックアップに関する誤解: 自分自身を納得させる方法
ストレージ エンジンの内部: ログの循環的な性質の詳細

于 2009-10-12T20:15:49.557 に答える
4

トランザクション ログが存在する主な理由は 2 つあります

1 - DB が現在のトランザクションを「ロールバック」できるようにするため 2 - クラッシュした DB が、クラッシュ前に最後にコミットされたトランザクションまでの状態を回復できるようにするため

1 は一時的なものです。アクティブなトランザクションがない場合は、ほとんどスペースを消費しません。2 ただし、ご想像のとおり、時間の経過とともに成長し続けている可能性があります。

アイデアは、トランザクション ログを時々ダンプ ファイルにバックアップすることです。ダンプ ファイルは、ある時点で DB 全体を復元できる DB の完全な状態のスナップショットです。これを行うと、トランザクション ログは切り捨てられ、空から再開されます。

その後 DB がクラッシュした場合は、ダンプ ファイルから DB スナップショットをロードし、最後のスナップショット以降の増分変更を含むトランザクション ログを適用して、状態を回復します。このため、トランザクション ログは高回復性ストレージに保持する必要があります。そうしないと、DB を回復できません。

したがって、定期的に db ダンプを取得すると、トランザクション ログが繰り返しクリアされます。

お勧めしませんが、DB のトランザクション ログを無効にするという別のオプションがあります。これは基本的に上記の 2 を排除するため、トランザクション ログは時間の経過とともに大きくなりません。もちろん、DB がクラッシュした場合は、最後の完全バックアップ/ダンプからしか回復できないため、準重要なものを実行している場合でも、このオプションにはかなりのリスクが伴います。

HTH。

于 2009-10-12T20:17:13.813 に答える
2

ログに含まれるものと含まれないものについて、いくつかの誤った考えがあります。復旧モードによっては、ログには現在コミットされていないトランザクションのみが含まれている可能性があるため、ロールバック (単純モード) されるか、最小限のログに記録された操作のみが含まれる可能性があります。ただし、結果のトランザクション ログ バックアップは、ログ バックアップ間で変更されたエクステント (一括ログ モード) を含むか、最後のログ バックアップ以降にコミットされた各トランザクションのすべてのログ情報を含む可能性があるため、より大きくなります。

無制限の拡張は単なるデフォルトであり、ログを任意に拡張することはベスト プラクティスではありません。これは、実際のログ ファイル内の vlf、仮想ログ ファイルの数を増やすことによってログの断片化を引き起こすためです。それらの数が多すぎると、レプリケーションなどの特定の操作のパフォーマンスが低下します。

ログ ファイルがデータベースよりも大きく、バックアップを圧縮できない場合は、VLF アクティブを保持しているシステムにトランザクションが開いている可能性があり、スペースの再利用が妨げられています。

データベースをデタッチし、ログを削除した後に再アタッチすることは、データベースに対して非常に悪いことです。データベースはトランザクション的に一貫性のある状態にならない可能性があり、それを行った後に dbcc checkdb を実行する必要があります。はい、アクティブな接続はありませんでしたが、これは危険な行為であり、ログが破損した場合の最後の手段であり、リストの最初のことではありません.

2005 年には、変更を行ったことを示す、変更できないフラグさえあるというのは、悪いことだと考えられています。MS サポートは、SQL の潜在的なバグについてサポートを受けているかどうかを確認できます。

ログを取り除くという点では、DBA が、ハードウェア障害や破損によってデータベースが破壊されたほぼ正確な時点にデータベースを復元できる復元戦略を提供できるようにするのはログです。トランザクション ログがなければ、最後の完全バックアップまでしか回復できません。ログを使用すると、早送りビデオ レコーダーのようにトランザクションを再生できます。

このトピックは非常に大きく、これまで見てきたように複雑ですが、学ぶ価値はあります。

于 2009-10-12T20:17:30.957 に答える
1

(これは MS-SQL ですよね?)

ええ、ログを手動で切り離して削除したときに、サーバーが文句を言ったに違いありません。

T-log を保持する必要がない場合は、カタログの回復モードを (カタログのプロパティで) "Simple" に変更します。これにより、トランザクションが正常にコミットされるため、ログが切り捨てられます。

ログが必要な場合 (ほとんどの人がそうしますが、非常に便利です)、ログはバックアップ時に切り捨てられます。

(トランザクション ログ、FTW!)

于 2009-10-12T20:26:29.973 に答える
0

ほとんどのリレーショナル データベース サーバーは、データベースに加えられたすべての変更を記録するトランザクション ログを保持しています。これは、データベース サーバーがダウンした場合に、最後のデータベース バックアップ (既知の状態である必要があります) からデータベースに加えられたすべての変更を "再生" できるというものです。

SQL Server を使用してからしばらく経ちましたが、なぜトランザクション ログを削除するのが難しいのか、答えられません。SQL Server 7、SQL Server 2000 日では、データベースの完全バックアップを作成すると、既定でトランザクション ログが切り捨てられます。

于 2009-10-12T20:11:10.503 に答える