web-dev-qa-db-ja.com

MS SQL Serverを入手してディスク容量を解放する

不十分に管理されたデータベーステーブルは巨大なものに成長しました。孤児のレコードの48+ギグ。私はそれをクリーンアップして、危険なほどにいっぱいになったハードドライブを通常の状態に戻そうとしています。このテーブルから約4億個のレコードを削除します。これは、私が入力しているときに実行されています。ハードドライブ領域の低下は見られませんが、システムテーブルクエリでメモリの低下が見られます。テーブルサイズを取得するために実行しています。データベースは「単純復旧モデル」を使用しています。

これに類似した多くの質問があり、データベースを縮小する必要があると回答しています。しかし、彼らは断片化されたデータなどのためにこれがどれほど悪い/怖いのかを説明し続けます.

  1. データベースはこのサイズであってはならないので。それを縮小することは私にとってまだ悪いですか?
  2. これは本番データベースです。縮小すると、ダウンタイムが発生したり、データベースがロックされたりしますか?
  3. SQL Server Management Studioには、データベース、ファイルの2つの圧縮オプションがあります。私の状況を考えると、最良の選択肢は何でしょうか?
  4. dBに必要な空き領域の割合に関するルールはありますか?

シュリンクのタグの説明を読んでも、やりたくありません。別の方法はありますか?

9
jackncoke

このテーブルから約4億個のレコードを削除します。

うまくいけば、 チャンクで実行しています -トランザクションログの肥大化を避けるため.

ハードドライブの空き容量が減少していないことに注意してください

スペースを解放するためにデータベースファイルを明示的に縮小する必要があるため、この操作は必要ありません。レコードを削除するだけです SQLサーバーはOSにスペースを解放しません

  1. データベースはこのサイズであってはならないので。それを縮小することは私にとってまだ悪いですか?

データベースのサイズを適切に事前設定する必要があるため、これは一般的に悪い習慣です。データベースが[〜#〜] [〜#〜]でないことを100%確信している場合、再びこのサイズになります データベースを縮小しても問題ありません(シナリオでは)

  1. これは本番データベースです。縮小すると、ダウンタイムが発生したり、データベースがロックされたりしますか?

データベースの縮小は非常にIO=集中的です。メンテナンス期間中またはアクティビティが最小限のときにDBCC SHRINKFILEを使用して縮小することをお勧めします。

  1. Management Studioでは、データベースまたはファイルの2つのオプションがあります。私の状況を考えると、最良の選択肢は何でしょうか?

縮小するには、TSQLを使用する必要があります。 (あなたが尋ねたので、圧縮[〜#〜]ファイル[〜#〜]はデータベースの代わりに行く方法です)。 shrink database in chunks-tsql スクリプトを使用して、チャンク単位で圧縮できます。

縮小すると、インデックスが断片化されることに注意してください。

  1. dBに必要な空き領域の割合に関するルールはありますか?

データベースのディスク容量要件の見積もり の記事を参照してください。修正規則はありません。データベースがどのように拡大することが予想されるかを考慮する必要があります。 データベースの自動拡張 も考慮する必要があります。

参考資料: トランザクションログが増加し続ける、または領域不足になる理由

14
Kin Shah

sQL ServerでDBが縮小することが多いため、心配する必要があります。 SQL 2005のストレージエンジンの責任者であるPaul Randalは、ShrinkDBは非常に貧弱に書かれていると述べています。一番最後にデータを取り、それを一番最初に置いて空のスペースを見つけ、DBファイルの「終わり」に空きスペースができるまでこれを続けます。この時点で、SQL Serverからスペースを解放し、OSに戻すことができます。データベースファイルを効果的に元に戻しているため、通常は大量の断片化が発生します。彼の見解は このブログ投稿 またはこの MCM内部ビデオ で読むことができます。

すべての場合と同様に、実際にこれらを最初に環境でテストする必要があります。データを別のファイルグループに移動することをお勧めします。クラスタ化インデックスを使用してオンラインでインデックスを再構築し、新しいファイルグループでインデックスを再作成できます。次に、古いものをドロップしてスペースを解放し、断片化をほとんどなくすことができます。これが機能している間、これは約120%余分なスペースを必要とすることに注意してください。これの問題は、あなたが持っていないように見える追加の空きスペースさえも必要とすることです。これはエンタープライズ機能です。

空き領域がそれほど多くない場合は、弾丸をかまして、DBを少しずつゆっくりと縮小して、長時間実行されるプロセスを回避する必要があります。データは大幅に断片化され、すべてのインデックスを再作成する必要があることに注意してください。すべてのインデックスを再作成した後、使用済みスペースを少し増やして、追加の空きスペースを確保することに注意してください。ブレントのアドバイス ここ を参照してください。

どれだけの空き容量が必要かというと、断片化とファイル拡張のアクティビティにどれだけ余裕を持っているかということです。 IFIが有効になっていると、ファイルの増加はほとんど瞬時ですが、それでも断片化が発生します。大まかな目安としては、必要だと思うだけのスペースを事前に割り当てるか、必要に応じて、増加を監視し、チャンク単位で定期的に調整することです。これにより、物理的な断片化が抑えられます。

また、ログファイルの増加はより重要です。ログファイルを追加すると、VLF=断片化が発生する可能性があります。これにより、復元が非常に遅くなり、チェックポイントや切り捨てに影響を与える可能性があります。- ここにいくつかあります 断片化したログのパフォーマンスリスク。 a各データベースでDBCC LOGINFO();。Kim Trippあたりの数を50程度に保つようにしてください。ただし、数百に達する場合は、断片化の問題があり、操作をサポートするためにログファイルを拡張する必要がありました。 Paul Randalによるログファイルの内容は、1週間成長させてインデックスを再作成することです。これは良い点かもしれません。万が一に備えて、もう少し空き領域を増やすことができます。ログが断片化されていないことを確認してくださいDBCC LOGINFO();を使用した場合も同様ですが、もしそうであれば、大きく成長したことを意味します このメソッド を使用して、ログファイルを縮小および再展開します。

5
Ali Razeghi

ストレージのニーズを評価し、ハードウェア/ホスティングサービスを適切に計画するために必要な時間内にサーバーがクラッシュしないように、十分に縮小しても問題ありません(質問4を参照)。いいえ、ロックされません。 restrictions を参照してください。物事をシンプルに保つため、データベースを縮小します。

専門知識を契約して調査を実施し、計画を作成することをお勧めします。

2
user41207