web-dev-qa-db-ja.com

ディスク領域がいっぱいですが、データベースで使用可能な論理領域

SSDドライブに常駐するかなり大きなMS SQL 2008R2データベースがあります。ドライブ自体の容量は約110 GBであり、データベースファイルはドライブ上の唯一のファイルです。

データベースは「シンプル」リカバリモードで、.MDFと.LDFの2つのファイルしかありません。

MDFの現在のサイズは109Gbですが、SSMSは「空き容量」が(「一般」プロパティページで)ほぼ18Gbあることを教えてくれます。ファイルをShrinkingする動作を実行すると、空き領域が18 GBあることもわかります。SSMSは、データベースサイズが約132 GBであることも通知します。

私が読んだことから、shrinkは本当に悪い考えです。ただし、レプリケーションエラーが発生し始めています(could not allocate space for object)。以前にデータベースを縮小しようとしましたが、数時間以内にファイルは元のサイズに戻りました。

どうすればよいですか?明らかに18Gbの空き領域がある場合、SQLは自動的にその空き領域を使用する必要がありますか?それとも、次のように単純ですか。本当に、より多くのディスク領域が必要ですか。

5
KenD

データが移動されているため、データベース内でスペースを利用できます。おそらく、非常に高レベルのページ分割があるか、以前にデータファイルを拡張させていたデータの大部分を最近削除した可能性があります。

SQL Serverは、データベースファイル内の領域を解放しても、データベースファイルを自動的に縮小しません。これは、論理的には、その領域を一度使用した場合、再度使用することを前提としているためです。一時的にスペースを解放しただけの場合、自動拡張は高価なイベントであり、不要になる可能性があります(その間にすべての空きスペースで何ができましたか?)。同じ理由で、一時的にスペースを取り戻そうとするべきではありません。データを追加するときに、SQL Serverに18 GBの使用可能なスペースを使用させるだけです。今後18 GBを超える追加のスペースが必要になると思われる場合(この場合、他のディスクにファイルを追加するか、より大きいディスクに移動する必要があります)。

sp_spaceused(そして今見ているUIダイアログ)は、テーブル/インデックス/ファイルに関するメタデータの同期の問題が原因で、可能な範囲よりも多くのスペースを返す可能性があります。正確なスペースが反映されていることを確認するには、次のコマンドを実行します。

DBCC UPDATEUSAGE(0);

カウント/スペースを修正するためにインデックスの再構築が必要になるシナリオも見ましたが、SQL Server 2000以降、そのような特定のケースは見ていません。

(これは、データベースがすでに複数のディスクにまたがっている単純なケースではないかと思います。そうでない場合は、質問でそのことを述べたことでしょう。)

とはいえ、データファイルを縮小すると、ほぼ即座にデータファイルが拡大するという事実から、実際にスペースを使用していると考えられますが、それを解放している大きな削除または更新も実行している必要があります(18 GBが表示される場合)自由)。残念ながら、データファイルが拡大してからそれ自体がクリアされる理由を正確に確認することは不可能です。おそらく、大きなテーブルを切り詰め/再設定したり、大規模なアーカイブ操作を実行したりするトランザクションがあるとします。

8
Aaron Bertrand

SQL Serverは、ファイル(.mdfまたは.ldf)が必要なときにディスクスペースを割り当てます(もちろん、設定に応じて)。トランザクションログ(.ldf)がクリアされていても、データ(。 mdf)は削除されます。
それがあなたが18Gb of "Space Available"、そしてそのスペースはディスク内ではなく、ファイル内でのみ使用できます(割り当てられています).
それも、縮小しても効果がなかった理由です-DBCC SHRINK[FILE|DATABASE]は、非常に大規模な操作の後に役立つ場合があります-あなたの場合、割り当て解除されたスペースは後で再割り当てされたため、それが必要でした。

トランザクションログファイル(.ldf)が別のディスクにある場合、または複数のデータファイルがある(および他のファイルが別のディスクにある)場合、データベースがドライブよりも大きくなることがあります。

不要な古いデータがあり、削除できる可能性があります。
そのような操作の後、縮小はおそらく役に立つでしょう。

別のオプションは、古いレコードを別のディスク上の別の [〜#〜] file [〜#〜] 上のパーティションまたはテーブルにアーカイブすることです。

もちろん、前のオプションで満足できない場合は、データベース全体を別の(大きい)ディスクに移動できます。

1
Roi Gavish