SQL Serverの自動圧縮を有効にしても安全ですか?


回答:


70

(私はもともと通常の質問として尋ねましたが、正しい方法を見つけました-BrentOに感謝します)

いいえ、決して。

ServerFaultでこれに何度か出会ったことがありますが、良いアドバイスをして幅広い聴衆にリーチしたいと思っています。このやり方で人々が眉をひそめている場合は、投票してください。喜んで削除します。

自動縮小は、有効になっている非常に一般的なデータベース設定です。良いアイデアのようです-データベースから余分なスペースを削除してください。自動縮小が積極的に悪であることを知らない「TFS、SharePoint、BizTalk、または通常の古いSQL Serverを考えてみてください」という「不本意なDBA」がたくさんいます。

MicrosoftでSQL Server Storage Engineを所有していて、自動縮小機能を削除しようとしていましたが、下位互換性のために維持する必要がありました。

なぜ自動収縮がそんなに悪いのですか?

データベースは再び成長する可能性が高いので、なぜ縮小するのでしょうか?

  1. Shrink-grow-shrink-growは、ファイルシステムレベルの断片化を引き起こし、多くのリソースを消費します。
  2. キックインを制御することはできません(レギュラーっぽいのに)
  3. 多くのリソースを使用します。データベース内でページを移動すると、CPU、大量のIOが必要になり、大量のトランザクションログが生成されます。
  4. 実際のキッカーは次のとおりです。データファイルの縮小(自動かどうかに関係なく)により、大量のインデックスの断片化が発生し、パフォーマンスが低下します。

しばらく前に、それが引き起こす問題を示し、もう少し詳細に説明するサンプルSQLスクリプトがあるブログ投稿をしました。自動縮小を参照してください-オフにしてください!(私のブログではそのような広告やジャンクはありません)。これをログファイルの縮小と混同しないでください。これは、便利で時折必要になります。

それでは、データベース設定を見て、自動縮小をオフにしてください。また、まったく同じ理由で、メンテナンスプランを縮小しないでください。同僚にその言葉を広めます。

編集:2番目の答えを思い出して、これを追加する必要があります-シュリンク操作を中断すると破損する可能性があるという一般的な誤解があります。いいえ、できません。以前はSQL Serverでシュリンクコードを所有していました-中断された場合に実行している現在のページ移動をロールバックします。

お役に立てれば!


縮小直後にインデックスを再作成できる方法はありますか?
ランスロバーツ

4
ファイルを再度成長させるため(古いインデックスを削除する前に新しいインデックスを構築する)、インデックスを再作成しませんが、再構築(古いDBCC INDEXDEFRAGまたは新しいALTER INDEX ...より多くのIO、CPU、ログ...
ポール・ランダル

自動圧縮を削除すると、srrverのメモリ使用量が高くなることに気付きました。
user193655

4

もちろん、ポールは正しいです。

すべてのDBとその自動圧縮設定を参照してください。データベースがたくさんある場合は、忍び込むでしょう。

sp_msforeachdb  @command1 = 'Select ''[?]'',DATABASEPROPERTYEX(''?'',''IsAutoShrink'')'

これはdmvのどこかにありますか。


2
sys.databasesには、フィールドis_auto_shrink(およびis_auto-close、is_auto_update_statsなど)があります
ポールランダル

素晴らしいイムグーグル:どのように私は、私たちは自動圧縮し、コード実行している良いとして構成されており、私たちのために、すべてのDBから良いレポートを生成DBSかを知るために貢献したレポートを持っていなかった
サーベルtabatabaeeヤズディ

2

それは「危険」ではありません-それは何にも損害を与えません。

しかし、大量のリクエストが来てそれらのリクエストの処理に時間がかかる直前にデータベースが停止し、高価な再配置演習を開始することを決定する可能性がある本番環境にはお勧めできません。バックアップなどの他のメンテナンス操作と一緒にスケジュール縮小操作を使用する方がはるかに優れています(実際には、バックアップ後-トランザクションログからより多くなります)。または、成長の問題がない限り、まったく縮小しない-モニターを設定して、未使用の割り当てられたスペースが特定の比率または固定サイズを超えたときにいつでも通知できます。

IIRCは、Expressを除くすべてのMSSQLエディションのすべてのデータベースでデフォルトでオフになっています。


2
シュリンクはスケジュールするべきではありません-それらが引き起こす問題のために、それらは本当にまれな操作であるべきです。バックアップ後に縮小を行うことについてのあなたのコメントがわかりません-縮小操作によって生成されたログレコードは、実行するタイミングや他のバックアップに関係なく、次のトランザクションログバックアップによって取得されます。ありがとう
ポールランダル

1

SQLのメンテナンスについて詳しく説明しているホワイトペーパーがTechNetで入手できます。

http://technet.microsoft.com/en-us/library/cc262731.aspx


残念ながら、このホワイトペーパーはSharePointのインストールのみを対象としており、実際にはいくつかのエラーがあります。ホワイトペーパーの作成者であるBill Baerに現在のSharePoint MCMクラスを教えるのに時間を費やしました。
ポールランダル

3
データベースメンテナンスの一般的な概要については、TechNet Magazineの記事「効果的なデータベースメンテナンス-technet.microsoft.com/en-us/magazine/cc671165.aspx」を参照してください。
ポールランダル

1

AutogrowとAutoshrinkの両方が有効になっているSQLサーバーを見てきました。この(比較的強力な)サーバーは非常に低速でした。これは、1日中行うのがデータベースファイルの縮小と拡大だけだったからです。自動圧縮は便利ですが、次の2つをお勧めします。

  1. デフォルトで自動縮小をオフにします。
  2. サーバー構成を文書化して、AutogrowとAutoshrinkが有効になっている場所と無効になっている場所を把握します。

1

データベースを縮小することを余儀なくされたのは、ディスク容量が少ない(運用データベースを保持するには不十分)テストサーバーでコピーを更新することだけでした。

本番データベースのファイルには十分な空き領域がありましたが、残念ながら、バックアップしたファイルと同じサイズのデータ​​ベースを復元する必要があります。したがって、バックアップする前に生産を縮小する以外に選択肢はありませんでした。(縮小には時間がかかり、多くのリソースが消費され、その後のトランザクションログの増加には問題がありました。)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.