Ответ 1
ОК, он работает. Оказывается, что тома NTFS, в котором находятся файлы DB, сильно фрагментирована. Остановил SQL Server, дефрагментировал все это, и все это было прекрасно с тех пор.
Наша база данных в настоящее время находится на уровне 64 ГБ, и одно из наших приложений начало сбой со следующей ошибкой:
System.Data.SqlClient.SqlException
: Не удалось выделить пространство для объекта'cnv.LoggedUnpreparedSpos'.'PK_LoggedUnpreparedSpos'
в базе данных'travelgateway'
, потому что файловая группа'PRIMARY'
заполнена. Создайте дисковое пространство, удалив ненужные файлы, отбросьте объекты в файловой группе, добавив дополнительные файлы в файловую группу или установив автозапуск для существующих файлов в файловой группе.
Я дважды проверил все: всем файлам в одной файловой группе разрешено автозагрузку с разумными приращениями (100 МБ для файла данных, 10% для файла журнала), доступно более 100 Гб свободного места для база данных, tempdb
установлена на автостраду, а также на большом диске свободного места на диске.
Чтобы решить проблему, я добавил второй файл в файловую группу, и ошибка исчезла. Но я чувствую себя неловко в этой ситуации.
Где проблема, ребята?
ОК, он работает. Оказывается, что тома NTFS, в котором находятся файлы DB, сильно фрагментирована. Остановил SQL Server, дефрагментировал все это, и все это было прекрасно с тех пор.
Антон
В качестве лучшей практики нельзя создавать объекты пользователя в основной файловой группе. Когда у вас есть пропускная способность, создайте новую группу файлов и переместите пользовательские объекты и оставьте объекты системы первичными.
Следующие запросы помогут вам определить пространство, используемое в каждом файле, и верхние таблицы с наибольшим количеством строк и если есть кучи. Это хорошая отправная точка для изучения этой проблемы.
SELECT
ds.name as filegroupname
, df.name AS 'FileName'
, physical_name AS 'PhysicalName'
, size/128 AS 'TotalSizeinMB'
, size/128.0 - CAST(FILEPROPERTY(df.name, 'SpaceUsed') AS int)/128.0 AS 'AvailableSpaceInMB'
, CAST(FILEPROPERTY(df.name, 'SpaceUsed') AS int)/128.0 AS 'ActualSpaceUsedInMB'
, (CAST(FILEPROPERTY(df.name, 'SpaceUsed') AS int)/128.0)/(size/128)*100. as '%SpaceUsed'
FROM sys.database_files df LEFT OUTER JOIN sys.data_spaces ds
ON df.data_space_id = ds.data_space_id;
EXEC xp_fixeddrives
select t.name as TableName,
i.name as IndexName,
p.rows as Rows
from sys.filegroups fg (nolock) join sys.database_files df (nolock)
on fg.data_space_id = df.data_space_id join sys.indexes i (nolock)
on df.data_space_id = i.data_space_id join sys.tables t (nolock)
on i.object_id = t.object_id join sys.partitions p (nolock)
on t.object_id = p.object_id and i.index_id = p.index_id
where fg.name = 'PRIMARY' and t.type = 'U'
order by rows desc
select t.name as TableName,
i.name as IndexName,
p.rows as Rows
from sys.filegroups fg (nolock) join sys.database_files df (nolock)
on fg.data_space_id = df.data_space_id join sys.indexes i (nolock)
on df.data_space_id = i.data_space_id join sys.tables t (nolock)
on i.object_id = t.object_id join sys.partitions p (nolock)
on t.object_id = p.object_id and i.index_id = p.index_id
where fg.name = 'PRIMARY' and t.type = 'U' and i.index_id = 0
order by rows desc
Иди в ту же проблему, и, по-видимому, работа над дефрагментацией началась. Но это было совсем немного. Выключает сервер, на котором работает клиент, работает Express version
и имеет лимит лицензирования около 10gb
.
Итак, хотя размер был установлен как "неограниченный", это было не так.
Я также столкнулся с той же проблемой, где начальный размер dtabase установлен в 4Gb, а авторазработка устанавливается на 1Mb. Виртуальный зашифрованный TrueCrypt-накопитель, на котором была установлена база данных, как представляется, имеет много места.
Я изменил пару (выше) вещей:
DBCC SHRINKDATABASE('...')
Все, что мне мало пользы (я мог бы вставить еще несколько записей, но вскоре столкнулся с той же проблемой). Файл подкачки, упомянутый Tobbi, заставил меня попробовать большой виртуальный диск. (Несмотря на то, что мой диск не должен содержать никаких таких системных файлов, так как я запускаю его без его установки много раз.)
При создании этого вопроса я столкнулся с вопросом TrueCrypt, если я собираюсь хранить файлы размером более 4 ГБ (как показано в этом вопросе SuperUser).
После этих последних двух я преуспел, и я предполагаю, что этот последний сделал трюк. Я думаю, что TrueCrypt выбирает файловую систему exfat (как описано здесь), которая ограничивает все файлы до 4 ГБ. (Так что мне, вероятно, не нужно было расширять диск, но я все равно.)
Это, вероятно, очень редкий случай с границами, но, возможно, это помогает кому-то.
Сделайте одно, перейти к свойствам базы данных выбирать файлы и увеличивать начальный размер базы данных и установите основную файловую группу как автоинкремент. Перезагрузите сервер sql.
Вы сможете использовать базу данных как раньше.
Я обнаружил, что это происходит потому, что: http://support.microsoft.com/kb/913399
SQL Server выпускает только все страницы, которые использует таблица кучи, когда выполняются следующие условия: происходит удаление в этой таблице. блокировка на уровне стола. Примечание. Таблица кучи - это любая таблица, которая не связан с кластеризованным индексом.
Если страницы не освобождены, другие объекты в базе данных не могут повторно использовать страницы.
Однако, когда вы включаете уровень изоляции на основе версий на уровне строк в SQL Server 2005, страницы не могут быть выпущены, даже если блокировка на уровне таблицы.
Решение Microsoft: http://support.microsoft.com/kb/913399
Чтобы обойти эту проблему, используйте один из следующих способов: Включите подсказку TABLOCK в инструкции DELETE, если строка уровень изоляции на основе версий не включен. Например, используйте который похож на следующий:
DELETE FROM TableName WITH (TABLOCK)
Примечание представляет имя таблицы. Используйте TRUNCATE TABLE, если вы хотите удалить все записи в таблице. Например, используйте оператор, аналогичный следующему:
TRUNCATE TABLE TableName
Создайте кластерный индекс в столбце таблицы. Для большего информацию о том, как создать кластерный индекс в таблице, см. Тема "Создание кластерного индекса" в SQL
В нижней части ссылки вы заметите, что НЕ отмечено, что она применяется к SQL Server 2008, но я думаю, что она делает
Я столкнулся с одной и той же проблемой. Причина заключалась в том, что файл виртуальной памяти "pagefile.sys" находился на том же диске, что и наши файлы данных для наших баз данных (D: drive). Он удвоился по размеру и заполнил диск, но окна не собирали его, то есть выглядели так, будто у нас было 80 ГБ бесплатно, когда мы на самом деле этого не сделали.
Перезапуск SQL-сервера не помог, возможно, дефрагментация дала бы OS время, чтобы освободить файл подкачки, но мы только перезагрузили сервер и voila, файл подкачки сжался, и все работало нормально.
Интересно, что в течение 30 минут, которые мы изучали, окна не вычисляли размер файла pagefile.sys вообще (80gb). После перезагрузки окна нашли файл подкачки и включили его в общий объем использования диска (теперь 40gb - который все еще слишком большой).
просьба указать тип роста файла базы данных, если его ограничение делает его неограниченным
наша проблема заключалась в том, что жесткий диск был до нулевого места.