MSSQL Error 3145: The backup set holds a backup of different database — Решение
Ошибка 3145 возникает при попытке восстановить резервную копию базы данных поверх существующей целевой базы, когда имя исходной базы данных, зафиксированное внутри бэкапа, отличается от имени восстанавливаемой базы данных.
- Сообщение:
The backup set holds a backup of a database other than the existing database(Severity 16, State 1). - Невозможность развернуть бэкап рабочей базы в базу с другим именем (например,
acc_prod.bakвacc_test). - Сбой шагов восстановления в планах обслуживания и автоматизированных конвейерах CI/CD.
1. Проверка метаданных бэкапа
RESTORE HEADERONLY
FROM DISK = N'D:\Backups\SourceDatabase.bak';Обратите внимание на значение в поле DatabaseName.
2. Использование директивы WITH REPLACE
Для явного подтверждения перезаписи существующей базы данных бэкапом другой базы используйте параметр WITH REPLACE:
USE [master];
GO
ALTER DATABASE [TargetDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
RESTORE DATABASE [TargetDatabase]
FROM DISK = N'D:\Backups\SourceDatabase.bak'
WITH
MOVE N'SourceDB_Data' TO N'D:\MSSQL\Data\TargetDatabase.mdf',
MOVE N'SourceDB_Log' TO N'D:\MSSQL\Data\TargetDatabase_log.ldf',
REPLACE,
STATS = 10;
GO
ALTER DATABASE [TargetDatabase] SET MULTI_USER;
GO3. Восстановление в новое имя (если базы Target еще не существует)
Если база данных создается с нуля, просто опустите директиву REPLACE, но обязательно укажите WITH MOVE:
RESTORE DATABASE [NewDatabaseName]
FROM DISK = N'D:\Backups\SourceDatabase.bak'
WITH
MOVE N'SourceDB_Data' TO N'D:\MSSQL\Data\NewDatabaseName.mdf',
MOVE N'SourceDB_Log' TO N'D:\MSSQL\Data\NewDatabaseName_log.ldf',
STATS = 10; Частые вопросы (FAQ)
Зачем SQL Server требует флаг WITH REPLACE?
Флаг WITH REPLACE служит защитным барьером от случайной перезаписи критической базы данных бэкапом совершенно другой информационной системы.
В чем отличие ошибки 3145 от ошибки 3154?
Ошибки идентичны по смыслу: 3145 генерируется старыми версиями ядра СУБД или при определенных вызовах OLE DB, тогда как 3154 — стандартное сообщение современного движка. Обе устраняются параметром WITH REPLACE.
Сохранятся ли пользователи и права после перезаписи через WITH REPLACE?
Нет. База будет полностью заменена состоянием из бэкапа, включая всех локальных пользователей базы данных (database users), схемы и разрешения.
Что делать с потерянными пользователями (Orphaned Users) после восстановления?
Свяжите пользователей базы с серверными логинами через процедуру: EXEC sp_change_users_login 'Auto_Fix', 'username'.