Восстановление бэкапа MSSQL с перемещением файлов: опция MOVE
Ошибки несовпадения файловой структуры при развертывании бэкапов на других серверах:
- Ошибка
The operating system returned the error '3(The system cannot find the path specified.)' (Error 3634 / 3156); - Файлы исходной базы располагались на дисках
E:\Data\иL:\Logs\, а на целевом сервере есть только дискD:\; - Конфликт имен при попытке развернуть копию рабочей базы рядом под новым именем (например,
ERP_1C_TEST).
1. Получение точных логических имен файлов внутри бэкапа
Перед формированием запроса восстановления выгрузите таблицу метаданных архива:
RESTORE FILELISTONLY
FROM DISK = N'E:\Backup\ERP_1C_Prod.bak';Обратите внимание на значения в колонке LogicalName и Type (D — данные, L — лог, S — filestream).
2. Восстановление базы с переназначением путей (WITH MOVE)
Скрипт развертывания базы на новые физические пути:
USE [master];
GO
RESTORE DATABASE [ERP_1C_STAGE]
FROM DISK = N'E:\Backup\ERP_1C_Prod.bak'
WITH
MOVE N'ERP_1C_Primary_Data' TO N'D:\MSSQL\Data\ERP_1C_Stage.mdf',
MOVE N'ERP_1C_Secondary_Data' TO N'D:\MSSQL\Data\ERP_1C_Stage_1.ndf',
MOVE N'ERP_1C_Log' TO N'D:\MSSQL\Log\ERP_1C_Stage.ldf',
REPLACE,
STATS = 10;
GO3. Восстановление дифференциальных бэкапов и логов после MOVE
При накатке последующих файлов цепочки (Diff и Log) опцию MOVE указывать не требуется, так как пути уже зафиксированы при первичном восстановлении Full бэкапа с NORECOVERY:
-- 1. Full с MOVE и NORECOVERY
RESTORE DATABASE [ERP_1C_STAGE] FROM DISK = N'E:\Backup\Full.bak'
WITH MOVE N'ERP_1C_Data' TO N'D:\Data\ERP_Stage.mdf',
MOVE N'ERP_1C_Log' TO N'D:\Log\ERP_Stage.ldf', NORECOVERY;
-- 2. Diff без MOVE
RESTORE DATABASE [ERP_1C_STAGE] FROM DISK = N'E:\Backup\Diff.bak' WITH NORECOVERY;
-- 3. Log с финализацией базы
RESTORE LOG [ERP_1C_STAGE] FROM DISK = N'E:\Backup\Log.trn' WITH RECOVERY;
GO Частые вопросы (FAQ)
Что произойдет, если забыть указать параметр WITH MOVE на сервере с другой буквой диска?
SQL Server попытается создать файлы данных по оригинальным путям, прописанным в бэкапе. Если таких папок или букв дисков не существует, восстановление мгновенно прервется с ошибкой операционной системы Error 3156.
Как с помощью PowerShell автоматизировать генерацию команды RESTORE с MOVE?
Используйте командлет dbatools: Restore-DbaDatabase -SqlInstance 'TARGET-SQL' -Path 'E:\Backup\Prod.bak' -DatabaseName 'ERP_TEST' -DestinationDataDirectory 'D:\Data' -DestinationLogDirectory 'D:\Log'.
Нужно ли переименовывать логические имена файлов внутри базы после MOVE?
Нет, логические имена (LogicalName) не влияют на работу СУБД. Но при необходимости их можно изменить через команду: ALTER DATABASE [ERP_1C_STAGE] MODIFY FILE (NAME = N'OldName', NEWNAME = N'NewName').
Что делать, если целевой диск меньше исходного, но занято всего 20% объема базы?
Бэкап восстанавливает исходный физический размер файлов. Если исходный MDF был 1 ТБ (хотя данных внутри 100 ГБ), целевой диск должен иметь не менее 1 ТБ свободного места. Сожмите файл на источнике перед бэкапом, если требуется перенос на меньший диск.