6

わかりました、私はこの答えを探し回ってみましたが、運がありませんでした。SQL Serverには約50のデータベースがあり、縮小によってスペースを解放できるかどうかを確認するために、ほぼ毎日チェックする必要があります。私たちのドライブはいっぱいになる傾向があるので、これがほとんど毎日のタスクである理由です。

どのデータベースに実際に使用可能な空き領域があるかを確認する簡単な方法はありますか?すべてのデータベースのリストを生成できるシステム/カスタムストアドプロシージャまたはシステムビューと、そのデータベースで縮小できる空き領域の量を知っている人はいますか?

ちなみに、SQLServer2005を使用しています。

4

4 に答える 4

5

データベースごとにsp_spacedusedを実行します。

--temporary table to hold database names
CREATE TABLE #Databases (name varchar(255))

INSERT INTO #Databases
SELECT name FROM master..sysdatabases

DECLARE abc CURSOR FOR
   SELECT name FROM #Databases

DECLARE @name varchar(255)
DECLARE @sql nvarchar(1024)

OPEN abc

FETCH NEXT FROM abc INTO @name

WHILE @@FETCH_STATUS = 0 
BEGIN
   --build sql to switch to that database...
   SET @sql = 'USE '+@name
   PRINT @sql
   EXECUTE (@sql)

   --and run spaceused on it
   SET @sql = 'EXECUTE sp_spaceused @UpdateUsage=True'
   PRINT @sql
   EXECUTE (@sql)

   FETCH NEXT FROM ABC INTO @name
END

CLOSE abc
DEALLOCATE abc
DROP TABLE #Databases

特異な結果のサンプル

T-SQLを実行します。

USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True

結果:

database_name: Contoso
database_size:     85.13 MB
unallocated_space: 15.41 MB

reserved:         70,368 KB (68.7 MB)
data:             42,944 KB (41.9 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,224 KB ( 3.1 MB)

シュリンク:

DBCC SHRINKDATABASE (Contoso)

スペースをもう一度確認してください。

EXECUTE sp_spaceused @UpdateUsage=True

結果:

database_name: Contoso
database_size:     69.81 MB
unallocated_space:  0.20 MB

reserved:         70,256 KB (68.6 MB)
data:             43,024 KB (42.0 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,032 KB ( 3.0 MB)
于 2009-05-29T14:09:29.717 に答える
3

答えは、データベースにどれだけの空き領域があるかを心配するのではなく、代わりに、圧縮を実行する夜間または毎週のメンテナンスタスクを実行することです。ログファイルを圧縮していない可能性があります(これは私が通常最も成長した場所です)。

完全バックアップを実行してから、TRUNCATE_ONLYを使用してトランザクションログバックアップを実行し、それが完了したら、ログファイルとデータベースでDBCC SHRINKFILE()を実行します。

次に、使用可能なディスクスペースの合計を監視するだけでよく、個々のデータベースの増加は監視できません。

SQLServerシュリンクデータベース。これが機能する前に、完全バックアップとトランザクションログバックアップを実行する必要があります。

'select * from master.dbo.sysdatabases'を実行し、'select * from [dbname] .. sysfiles'を実行すると、ロードされた個々のファイルに関する情報を取得できます。私は100%ではありません。ほぼ一年、SQL Serverインスタンスに触れていません。sysfileは、「マスター」データベースにある可能性があります。

于 2009-05-29T14:04:51.083 に答える
1

おそらくWMIまたはSQLビューの何か。しかし、私は尋ねなければなりません-これを毎日いじくり回す時間のコストは、いくつかのディスクドライブを購入するのと比べてどうですか?

于 2009-05-29T13:39:31.570 に答える
0

sp_spaceusedを使用してその結果を消費するか、sys.allocations_unitsテーブルを調べて、使用されたページの総数をカウントすることができます。複数のNDFがある場合があるため、「データベース」レベルではなくファイルレベルで確認する必要があります。sys.database_filesから始めて、データベースファイル内のすべてのファイルを表示します。サイズ列には、データベース内のページの総数が含まれます。sys.allocation_unitsからの合計ページを合計して、使用済みページを取得します。

with sum_au as (
select data_space_id
    , sum(total_pages) as total_pages
    from sys.allocation_units au 
    group by data_space_id)
select ds.name
    , df.size
    , total_pages as in_use 
    from sys.database_files df
    join sys.data_spaces ds on df.data_space_id = ds.data_space_id
    join sum_au au on au.data_space_id = ds.data_space_id
于 2009-05-29T16:12:43.673 に答える