Программно определить доступное свободное место в базе данных? - PullRequest
6 голосов
/ 29 мая 2009

Хорошо, я попытался найти этот ответ, но безуспешно. На нашем сервере SQL Server работает около 50 баз данных, которые я должен проверять почти каждый день, чтобы узнать, можно ли освободить какое-либо пространство за счет сокращения. Наши накопители, как правило, заполняются, поэтому это почти ежедневная задача.

Есть ли быстрый способ проверить, в каких базах данных действительно есть свободное место? Кто-нибудь знает о системной / пользовательской хранимой процедуре или системном представлении, которые могут генерировать список для каждой базы данных, и сколько свободного места доступно для сокращения в этой базе данных?

Кстати, используя sql server 2005.

Ответы [ 4 ]

5 голосов
/ 29 мая 2009

Выполнить 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)
3 голосов
/ 29 мая 2009

Ответ заключается не в том, чтобы беспокоиться о том, сколько свободного места имеется в базах данных, а в том, чтобы вместо этого выполнять задачу еженедельного или еженедельного обслуживания, которая запускает уплотнение. Скорее всего, вы не сжимаете свои файлы журналов (это то место, где у меня обычно был самый большой рост).

Запустите полное резервное копирование, затем запустите резервное копирование журнала транзакций с помощью TRUNCATE_ONLY и, как только оно завершится, запустите DBCC SHRINKFILE () для ваших файлов журналов и баз данных.

Тогда вам нужно только следить за общим доступным дисковым пространством, а не за ростом отдельной базы данных.

Сжатие базы данных SQL Server . Вам абсолютно НЕОБХОДИМО выполнить полное резервное копирование и резервное копирование журнала транзакций, прежде чем это сработает.

Вы можете получить информацию об отдельных загруженных файлах, запустив «select * from master.dbo.sysdatabases» и запустив «select * from [dbname] .. sysfiles». Я не на 100%, я не касался экземпляра SQL Server почти год, sysfiles могут быть в «основной» базе данных.

1 голос
/ 29 мая 2009

Возможно что-то в представлениях WMI или SQL. Но я должен спросить - как стоимость вашего времени, потраченного на это каждый день, по сравнению с покупкой некоторых дисков?

0 голосов
/ 29 мая 2009

Вы можете использовать либо 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
...