«Основная файловая группа заполнена» в стандарте SQL Server 2008 без видимой причины - PullRequest
46 голосов
/ 23 декабря 2009

Наша база данных в настоящее время на 64 ГБ, и одно из наших приложений начало сбой со следующей ошибкой:

System.Data.SqlClient.SqlException: Не удалось выделить место для объекта 'cnv.LoggedUnpreparedSpos'.'PK_LoggedUnpreparedSpos' в базе данных 'travelgateway', поскольку файловая группа 'PRIMARY' заполнена. Создайте место на диске, удалив ненужные файлы, удалив объекты в файловой группе, добавив дополнительные файлы в файловую группу или установив автоматический рост для существующих файлов в файловой группе.

Я дважды проверил все: все файлы в одной файловой группе могут автоматически расти с приемлемыми приращениями (100 МБ для файла данных, 10% для файла журнала), для свободного В базе данных tempdb также настроен на автоматическое наращивание с большим количеством свободного места на жестком диске.

Чтобы решить проблему, я добавил второй файл в файловую группу, и ошибка исчезла. Но я чувствую себя неловко из-за всей этой ситуации.

Где здесь проблема, ребята?

Ответы [ 10 ]

27 голосов
/ 26 марта 2010

ОК, все заработало. Оказывается, что том NTFS, в котором находились файлы БД, был сильно фрагментирован. Остановил SQL Server, дефрагментировал все это и с тех пор все было нормально.

19 голосов
/ 25 декабря 2009

Anton

Рекомендуется не создавать пользовательские объекты в основной файловой группе. Если у вас есть пропускная способность, создайте новую файловую группу, переместите объекты пользователя и оставьте системные объекты первичными.

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

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
18 голосов
/ 23 января 2015

столкнулся с той же проблемой, и сначала дефрагментация, казалось, работала. Но это было на короткое время. Получается, что сервер, который использовал клиент, работал с Express version, а его лицензионный лимит составляет около 10gb.

Так что, хотя размер был установлен как «неограниченный», это не так.

3 голосов
/ 14 ноября 2014

Сделай одну вещь, перейти к свойствам базы данных выбрать файлы и увеличить исходный размер базы данных и установить первичную файловую группу как автоинкрементную. Перезапустите сервер sql.

Вы сможете использовать базу данных, как и раньше.

3 голосов
/ 29 ноября 2012

Я также столкнулся с той же проблемой, когда начальный размер базы данных установлен в 4 ГБ, а для автоматического роста - 1 МБ. Кажется, на виртуальном зашифрованном диске TrueCrypt, на котором находилась база данных, достаточно места.

Я изменил пару (выше) вещей:

  • Я переключил службу Windows для Sql Server Express с автоматический на ручной , так что работает только «обычный» Sql Server. (Даже при том, что я использую Sql Server 2008 R2, который должен позволить 10 ГБ.)
  • Я изменил автоматический рост с 1 МБ до 10%
  • Я изменил размер приращения автоматического увеличения с 10% до 1000 МБ
  • Я дефрагментировал диск
  • Я сжал базу данных:
    • вручную DBCC SHRINKDATABASE('...')
    • автоматически щелкните правой кнопкой мыши на базе данных | "свойства" | "Авто Сжатие" | «Усеченный журнал на контрольной точке»)

Все безрезультатно (я мог вставить еще несколько записей, но вскоре столкнулся с той же проблемой). Файл подкачки, упомянутый Тобби, заставил меня попробовать виртуальный диск большего размера. (Даже если мой диск не должен содержать такие системные файлы, так как я работаю без монтирования большую часть времени.)

  • Я сделал новый виртуальный диск большего размера с TrueCrypt

При создании я столкнулся с вопросом TrueCrypt, если я собираюсь хранить файлы размером более 4 ГБ (, как показано в этом вопросе SuperUser ).

  • Я сказал TrueCrypt, что буду хранить файлы размером более 4 ГБ

После этих двух последних у меня все было хорошо, и я предполагаю, что этот последний сделал свое дело. Я думаю, что TrueCrypt выбирает файловую систему exfat (, как описано здесь ), которая ограничивает все файлы 4 ГБ. (Так что мне, вероятно, не нужно было увеличивать диск, но я все равно это сделал.)

Это, вероятно, очень редкий пограничный случай, но, возможно, он кому-нибудь поможет.

2 голосов
/ 10 января 2013

Пожалуйста, проверьте тип файла базы данных, если его ограничение делает его неограниченным

2 голосов
/ 19 июля 2012

Я просто столкнулся с той же проблемой. Причина была в том, что файл виртуальной памяти "pagefile.sys" находился на том же диске, что и наши файлы данных для наших баз данных (диск D:). Он удвоился в размерах и заполнил диск, но окна его не поднимали, то есть выглядело так, как будто у нас было 80 ГБ свободно, когда мы на самом деле этого не сделали.

Перезапуск SQL-сервера не помог, возможно, дефрагментация даст ОС время освободить файл подкачки, но мы просто перезагрузили сервер и вуаля, файл подкачки сжался, и все работало нормально.

Интересно то, что в течение 30 минут, которые мы исследовали, окна вообще не вычисляли размер pagefile.sys (80 ГБ). После перезапуска Windows обнаружил файл подкачки и включил его размер в общее использование диска (сейчас 40 ГБ - что все еще слишком много).

2 голосов
/ 23 декабря 2009

Я обнаружил, что это происходит потому, что: http://support.microsoft.com/kb/913399

SQL Server освобождает только все страницы, которые использует таблица кучи, когда выполняются следующие условия: происходит удаление в этой таблице. удерживается блокировка на уровне таблицы. Примечание Таблица кучи - это любая таблица, которая не связан с кластеризованным индексом.

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

Однако при включении уровня изоляции на основе управления версиями строк в База данных SQL Server 2005, страницы не могут быть освобождены, даже если удерживается блокировка на уровне таблицы.

Решение Microsoft: http://support.microsoft.com/kb/913399

Чтобы обойти эту проблему, используйте один из следующих методов: Включить подсказку TABLOCK в инструкцию DELETE, если строка Уровень изоляции на основе версий не включен. Например, используйте утверждение, которое похоже на следующее:

УДАЛИТЬ ИЗ TableName WITH (TABLOCK)

Примечание представляет название таблицы. Используйте TRUNCATE Оператор TABLE, если вы хотите удалить все записи в таблице. Например, используйте оператор, который похож на следующее:

TRUNCATE TABLE TableName

Создать кластеризованный индекс по столбцу таблицы. Для большего информацию о том, как создать кластерный индекс для таблицы, см. Тема «Создание кластерного индекса» в SQL

Внизу ссылки вы заметите, что НЕ отмечено, что она применима к SQL Server 2008, но я думаю, что это так

1 голос
/ 01 июня 2019

По моему опыту, это сообщение появляется, когда в основном файле (.mdf) нет места для сохранения метаданных базы данных. Этот файл включает системные таблицы, и они только сохраняют свои данные в него.

Оставьте немного места в файле, и команды снова будут работать. Вот и все, наслаждайся

0 голосов
/ 21 октября 2016

наша проблема заключалась в том, что на жестком диске было недостаточно свободного места.

...