При работе с базами данных на бесплатной редакции MS SQL Server Express можно столкнуться с критической ошибкой: Could not allocate space for object 'dbo.FileStore' in database 'DocsBSPU' because the 'PRIMARY' filegroup is full. При этом просмотр свойств диска показывает, что свободное место на сервере есть, а настройка автоувеличения (autogrowth) файловой группы не дает результатов. Рассмотрим причину появления этой проблемы и подробно разберем способы её решения.
Проанализируем ситуация с точки зрения ограничений СУБД. Начиная с версии SQL Server 2008 R2 Express, разработчики Microsoft установили жесткое аппаратное ограничение: максимальный суммарный размер физических файлов данных базы (файлы с расширениями .mdf и .ndf) не может превышать 10240 МБ (10 ГБ).
Как только размер файлов данных базы достигает этого предела, внутренний движок СУБД блокирует дальнейшее расширение базы и игнорирует настройки autogrowth, даже если параметр автоувеличения установлен на 500 МБ или более. При этом на жестком диске сервера может оставаться не один терабайт свободного пространства. Ограничение не распространяется на файлы журнала транзакций (.ldf) и данные в хранилищах FILESTREAM, но таблицы с бинарными данными (такие как dbo.FileStore) находятся именно в файловой группе PRIMARY, что приводит к сбою при записи новых файлов.
Разберем распространенную ситуацию: администратор устанавливает редакцию SQL Server Standard рядом с существующим экземпляром Express (например, создавая именованный экземпляр SERVER\SQLSTANDART), переносит базу, но ошибка повторяется, а размер базы не увеличивается.
Проблема заключается в маршрутизации подключений. По умолчанию экземпляр Express работает как экземпляр по умолчанию или занимает стандартный TCP-порт 1433. При параллельной установке новому экземпляру Standard назначается динамический порт. Если в системе не запущен и не настроен компонент SQL Server Browser (UDP-порт 1434), клиентские приложения не могут корректно определить порт нового экземпляра и продолжают подключаться к правому (старому) экземпляру Express, где лимит 10 ГБ продолжает действовать.
Рассмотрим подробнее по шагам все варианты решения данной проблемы:
Если на сервере установлена редакция Express, её можно обновить до Standard «на месте» без полной переустановки службы и пересоздания баз данных:
Если создается новый экземпляр SQL Server Standard рядом с Express, выполним следующие шаги:
1434 для работы службы поиска экземпляров.14333).ИмяСервера,14333 или укажем точное имя экземпляра ИмяСервера\ИмяЭкземпляра.Если переполненная таблица (например, dbo.FileStore) используется для хранения прикрепленных файлов и документов 1С (например, в 1С:Документооборот, 1С:ERP или 1С:УТ), оптимальным решением станет перенос файлов в файловые тома на диске:
.mdf на десятки гигабайт и вернуться в рамки лимита Express-версии.Если из базы уже были удалены устаревшие данные, физический файл базы может сохранять размер 10 ГБ за счет зарезервированного, но пустого пространства внутри файла. В этом случае выполним сжатие базы данных через SQL Server Management Studio или с помощью T-SQL команд:
-- Проверка имени файла данных и выполнение сжатия
USE DocsBSPU;
GO
DBCC SHRINKFILE (N'DocsBSPU_Data', 8000);
GO
Параметр задает целевой размер файла в мегабайтах. Процедура освободит неиспользуемое пространство на диске и сбросит объем файла ниже порога 10240 МБ.