Как исправить ошибку «Could not allocate space for object in database because the PRIMARY filegroup is full» в SQL Server Express?

Системный администратор IT и автоматизация бизнеса
← На главную

При работе с базами данных на бесплатной редакции 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 рядом не всегда решает проблему сразу

Разберем распространенную ситуацию: администратор устанавливает редакцию SQL Server Standard рядом с существующим экземпляром Express (например, создавая именованный экземпляр SERVER\SQLSTANDART), переносит базу, но ошибка повторяется, а размер базы не увеличивается.

Проблема заключается в маршрутизации подключений. По умолчанию экземпляр Express работает как экземпляр по умолчанию или занимает стандартный TCP-порт 1433. При параллельной установке новому экземпляру Standard назначается динамический порт. Если в системе не запущен и не настроен компонент SQL Server Browser (UDP-порт 1434), клиентские приложения не могут корректно определить порт нового экземпляра и продолжают подключаться к правому (старому) экземпляру Express, где лимит 10 ГБ продолжает действовать.

Способы решения проблемы переполнения базы

Рассмотрим подробнее по шагам все варианты решения данной проблемы:

Вариант 1. Переход на SQL Server Standard без переустановки (In-Place Upgrade)

Если на сервере установлена редакция Express, её можно обновить до Standard «на месте» без полной переустановки службы и пересоздания баз данных:

  1. Запустим Центр установки SQL Server (SQL Server Installation Center) с дистрибутива редакции Standard или Enterprise.
  2. Перейдем в раздел Maintenance (Обслуживание) и выберем пункт Edition Upgrade (Обновление редакции).
  3. Следуем указаниям мастера, указав лицензионный ключ продукта и выбрав действующий экземпляр Express. Процедура обновит бинарные файлы службы и снимет лимит в 10 ГБ с сохранением всех пользовательских баз и настроек прав.

Вариант 2. Корректная настройка подключений при параллельной установке

Если создается новый экземпляр SQL Server Standard рядом с Express, выполним следующие шаги:

  1. Убедимся, что служба SQL Server Browser запущена и имеет тип запуска «Автоматически».
  2. В брандмауэре Windows откроем UDP-порт 1434 для работы службы поиска экземпляров.
  3. В оснастке SQL Server Configuration Manager для экземпляра Standard перейдем в раздел SQL Server Network Configuration -> Protocols for [InstanceName], включим протокол TCP/IP и зададим явный статичный порт (например, 14333).
  4. В строке подключения 1С или внешнего приложения явно укажем порт через запятую: ИмяСервера,14333 или укажем точное имя экземпляра ИмяСервера\ИмяЭкземпляра.

Вариант 3. Вынос бинарных данных (хранилища файлов) из базы 1С

Если переполненная таблица (например, dbo.FileStore) используется для хранения прикрепленных файлов и документов 1С (например, в 1С:Документооборот, 1С:ERP или 1С:УТ), оптимальным решением станет перенос файлов в файловые тома на диске:

  1. В конфигурации 1С перейдем в настройки хранения файлов (Администрирование -> Настройки пользователей и прав -> Настройки работы с файлами).
  2. Включим опцию Хранить файлы в томах на диске.
  3. Создадим новый том и укажем сетевой или локальный путь к папке на сервере.
  4. Запустим штатную обработку перегрузки файлов из базы данных в тома хранения. Это позволит сократить физический размер файла .mdf на десятки гигабайт и вернуться в рамки лимита Express-версии.

Вариант 4. Очистка и сжатие нераспределенного пространства (Shrink)

Если из базы уже были удалены устаревшие данные, физический файл базы может сохранять размер 10 ГБ за счет зарезервированного, но пустого пространства внутри файла. В этом случае выполним сжатие базы данных через SQL Server Management Studio или с помощью T-SQL команд:


-- Проверка имени файла данных и выполнение сжатия
USE DocsBSPU;
GO
DBCC SHRINKFILE (N'DocsBSPU_Data', 8000);
GO

Параметр задает целевой размер файла в мегабайтах. Процедура освободит неиспользуемое пространство на диске и сбросит объем файла ниже порога 10240 МБ.

← На главную