Траблшутинг нехватки дискового пространства при RESTORE в MSSQL
- Ошибка
There is insufficient free space on disk volume 'D:\' to create the database(Error 3257 / 1105). - Операция восстановления аварийно прерывается на этапе аллокации файлов данных или журнала транзакций.
- Размер несжатых файлов внутри бэкапа существенно превышает емкость целевого раздела.
1. Получение точных размеров и логических имен файлов внутри бэкапа
RESTORE FILELISTONLY
FROM DISK = N'E:\Backups\HeavyDatabase.bak';Обратите внимание на колонку Size (размер в байтах) для каждого логического файла.
2. Восстановление с распределением файлов по разным физическим дискам (WITH MOVE)
RESTORE DATABASE [HeavyDatabase]
FROM DISK = N'E:\Backups\HeavyDatabase.bak'
WITH
MOVE N'HeavyDb_Data' TO N'D:\SQLData\HeavyDatabase_Data.mdf',
MOVE N'HeavyDb_Index' TO N'E:\SQLIndexes\HeavyDatabase_Index.ndf',
MOVE N'HeavyDb_Log' TO N'L:\SQLLogs\HeavyDatabase_Log.ldf',
REPLACE, RECOVERY, STATS = 5;3. Включение мгновенной инициализации файлов (Instant File Initialization, IFI)
IFI позволяет мгновенно аллоцировать место под MDF/NDF файлы без долгой перезаписи секторов нулями:
- Откройте
secpol.msc(Локальная политика безопасности). - Перейдите: Локальные политики -> Назначение прав пользователя -> Выполнение задач по обслуживанию томов (Perform volume maintenance tasks).
- Добавьте сервисную учетную запись службы SQL Server Engine и перезапустите инстанс.
Частые вопросы (FAQ)
Распространяется ли Instant File Initialization на файлы журналов транзакций (LDF)?
Нет. По соображениям безопасности ядра СУБД файлы журналов (.ldf) всегда принудительно инициализируются нулями, поэтому скорость создания лога зависит исключительно от скорости записи накопителя.
Почему размер бэкапа .bak был 50 ГБ, а для восстановления требуется 500 ГБ?
Бэкап сжимается алгоритмом BACKUP WITH COMPRESSION и содержит только занятые страницы. При восстановлении SQL Server резервирует полный исходный размер файлов базы, включая пустое нераспределенное пространство.
Можно ли восстановить базу на диск меньшего объема, если реальных данных там немного?
Напрямую через RESTORE нельзя, так как размер выделяется по метаданным заголовка. Необходимо сначала сделать DBCC SHRINKFILE на исходном сервере, снять новый бэкап и затем восстановить его.
Как проверить, активирована ли Instant File Initialization на сервере?
Выполните запрос: SELECT instant_file_initialization_enabled FROM sys.dm_server_services WHERE servicename LIKE 'SQL Server%';