"Основная файловая группа заполнена" в стандарте SQL Server 2008 без видимых причин

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

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

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

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

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

9 ответов


хорошо, он работает. Оказывается, что Том NTFS, где находились файлы БД, получил сильно фрагментирован. Остановил 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, а autogrowth установлен на 1Mb. Виртуальный зашифрованный диск TrueCrypt, на котором находилась база данных, казалось, имел много места.

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

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

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

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

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

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

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

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


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

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


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

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

интересно то, что в течение 30 минут, которые мы исследовали, windows не рассчитала размер файла подкачки.представление SYS на всех (80Гб). После перезагрузки windows нашла файл подкачки и включила его размер в общее использование диска (Теперь 40gb - который все еще слишком большой).


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


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

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

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

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

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

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

удалить из TableName с (TABLOCK)

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

усечь таблицу TableName

создайте кластеризованный индекс в столбце таблицы. For more сведения о создании кластерный индекс на таблице, см. Раздел" Создание кластеризованного индекса " в SQL

вы заметите в нижней части ссылки, что не отмечено, что это относится к SQL Server 2008, но я думаю, что это делает


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