При работе с базами данных SQL Server возникает частая задача: восстановить резервную копию (файл .bak) не в исходную базу, а в совершенно новую или уже существующую, но с другим именем. Это может быть необходимо для тестирования обновлений, разработки, создания тестовых сред или просто для переноса данных. Многие пользователи сталкиваются с затруднениями, особенно когда попытка восстановления завершается ошибкой. Рассмотрим подробно, как правильно выполнить эту операцию и избежать распространенных проблем. При регулярном обслуживании таких окружений автоматическое архивирование, обновление и тестирование нескольких баз значительно экономит время администратора.
Первоначальный вопрос, можно ли восстановить базу данных SQL Server из файла .bak в другую базу, однозначно имеет утвердительный ответ — да, это возможно и является стандартной операцией. Однако, как показывает практика, без знания определенных нюансов процесс может быть осложнен ошибками.
Одной из наиболее частых ошибок, с которой мы можем столкнуться, является следующая:
ЗАГОЛОВОК: Microsoft SQL Server Management Studio
Действие Восстановить завершилось неудачно для объекта "Сервер" "SQL-SERV\GB4SQLSERV". (Microsoft.SqlServer.SmoExtended)
ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ:
При выполнении инструкции или пакета Transact-SQL возникло исключение. (Microsoft.SqlServer.ConnectionInfo)
Резервный набор данных содержит копию базы данных, отличной от существующей базы данных "zikgu_31_old_1".
RESTORE DATABASE прервано с ошибкой. (Microsoft SQL Server, ошибка: 3154)
Эта ошибка, известная как Ошибка: 3154, означает, что вы пытаетесь восстановить резервную копию базы данных, которая по своим внутренним метаданным отличается от целевой базы данных, в которую вы пытаетесь ее восстановить. SQL Server по умолчанию предотвращает такие действия, чтобы избежать случайной перезаписи данных. Давайте разберем по шагам, как правильно выполнить восстановление и обойти эту ошибку.
Прежде чем приступить к процессу восстановления, важно убедиться, что все предварительные условия соблюдены. Это поможет избежать многих потенциальных проблем, а для очистки тестовых сред от лишней информации часто применяется выборочное удаление данных организаций:
RESTORE VERIFYONLY. Она не восстанавливает базу данных, но проверяет, можно ли использовать файл резервной копии для восстановления.
RESTORE VERIFYONLY FROM DISK = N'C:\Путь\К\Вашему\Файлу\Backup.bak';
Если эта команда завершится без ошибок, значит, файл резервной копии читаем и, скорее всего, пригоден для восстановления.
.mdf) и журнала транзакций (.ldf) новой базы данных, достаточно свободного места. Недостаток места приведет к сбою восстановления..bak и на запись в каталоги, где будут созданы файлы .mdf и .ldf новой базы данных.Для большинства пользователей самым удобным способом является использование графического интерфейса SQL Server Management Studio. Разберем процесс по шагам:
.bak. Нажмите OK.OldDatabaseName, а вы хотите восстановить его как NewDatabaseName, введите NewDatabaseName в этом поле. Если вы восстанавливаете поверх существующей базы данных с другим именем, здесь также нужно указать имя целевой базы данных..mdf) и журнала (.ldf) из резервной копии, а также их текущие пути.C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\OldDatabaseName.mdf на D:\SQLData\NewDatabaseName.mdf и аналогично для файла журнала.Для более опытных пользователей или для автоматизации процессов восстановления часто используется Transact-SQL. Это дает более точный контроль над каждым параметром. Рассмотрим процесс на примере:
Прежде чем выполнить команду RESTORE DATABASE, нам необходимо узнать логические имена файлов данных и журнала, которые содержатся в файле .bak. Это можно сделать с помощью команды RESTORE FILELISTONLY:
RESTORE FILELISTONLY
FROM DISK = N'C:\Путь\К\Вашему\Файлу\Backup.bak';
Результатом выполнения этой команды будет таблица с информацией о файлах в резервной копии. Нас будут интересовать столбцы LogicalName, PhysicalName, Type. Обычно файл данных имеет Type = 'D', а файл журнала Type = 'L'.
Предположим, логические имена ваших файлов: LogicalNameDataFile (для .mdf) и LogicalNameLogFile (для .ldf).
Теперь мы можем использовать команду RESTORE DATABASE с необходимыми опциями:
USE master;
GO
ALTER DATABASE [NewDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
RESTORE DATABASE [NewDatabaseName]
FROM DISK = N'C:\Путь\К\Вашему\Файлу\Backup.bak'
WITH
FILE = 1, -- Номер резервного набора данных в файле .bak (обычно 1)
MOVE N'LogicalNameDataFile' TO N'D:\SQLData\NewDatabaseName.mdf',
MOVE N'LogicalNameLogFile' TO N'D:\SQLLogs\NewDatabaseName_log.ldf',
NOUNLOAD, -- Оставляет резервную копию загруженной для потенциальных дополнительных действий
REPLACE, -- Разрешает перезапись существующей базы данных
STATS = 10; -- Показывает прогресс восстановления каждые 10 процентов
GO
ALTER DATABASE [NewDatabaseName] SET MULTI_USER;
GO
Разберем параметры команды:
USE master; и ALTER DATABASE [NewDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;: Эти команды используются для принудительного отключения всех пользователей от целевой базы данных [NewDatabaseName] и перевода ее в однопользовательский режим перед восстановлением. Это аналог опции "Close existing connections" в SSMS. Если целевой базы данных еще не существует, то ALTER DATABASE можно пропустить.RESTORE DATABASE [NewDatabaseName]: Указываем имя новой или целевой базы данных.FROM DISK = N'C:\Путь\К\Вашему\Файлу\Backup.bak': Указываем полный путь к файлу резервной копии.WITH FILE = 1: Если файл .bak содержит несколько резервных копий, этим параметром мы указываем, какую именно копию использовать (по умолчанию 1, если копия одна).MOVE N'LogicalNameDataFile' TO N'D:\SQLData\NewDatabaseName.mdf': Эта опция (и аналогичная для файла журнала) обязательна для восстановления в другое место или под другим именем. LogicalNameDataFile (и LogicalNameLogFile) — это логические имена файлов, полученные из RESTORE FILELISTONLY, а пути после TO — это новые физические пути, куда будут помещены файлы.NOUNLOAD: Указывает, что лента (или файл) остается смонтированной после завершения операции RESTORE. В контексте файловых бэкапов это обычно некритично, но является частью стандартной практики.REPLACE: Это эквивалент флажка "Overwrite the existing database" в SSMS. Эта опция необходима для перезаписи существующей базы данных или для восстановления базы данных с другим именем.STATS = 10: Показывает индикатор выполнения восстановления в окне сообщений SSMS, обновляя его каждые 10 процентов.ALTER DATABASE [NewDatabaseName] SET MULTI_USER;: После успешного восстановления переводит базу данных обратно в многопользовательский режим, чтобы пользователи могли к ней подключаться.BACKUP DATABASE), всегда являются транзакционно согласованными, даже если база данных активна. Ошибка 3154 обычно не связана с повреждением, а с несоответствием имен, но стоит иметь в виду.WITH RECOVERY, что делает ее полностью доступной сразу после завершения операции. Опции WITH NORECOVERY или WITH STANDBY используются в более сложных сценариях, таких как восстановление цепочки бэкапов (полный + дифференциальный + журналы транзакций) или настройка зеркалирования/log shipping. Для стандартного восстановления в новую базу данных WITH RECOVERY является правильным выбором.Таким образом, восстановление базы данных SQL Server из .bak файла в другую базу — это стандартная и относительно простая операция при соблюдении нескольких ключевых правил: изменение имени целевой базы данных, корректировка путей файлов (MOVE) и использование опции перезаписи (REPLACE). Понимание этих моментов позволяет успешно выполнять задачу без лишних затруднений. После завершения миграции учета автоматическое сравнение бухгалтерских и налоговых проводок упрощает поиск расхождений между базами.