Часто в практике системного администратора 1С возникает задача создания тестовой среды. Самый надежный способ — восстановить актуальный бэкап рабочей базы в пустую тестовую базу. Однако стандартный графический интерфейс SQL Server Management Studio (SSMS) иногда подводит: зависает при выборе путей файлов или не позволяет корректно изменить настройки переименования. В таких ситуациях на помощь приходит SQL-скрипт.
Разберем подробно, как правильно написать скрипт восстановления, чтобы не «затереть» рабочую базу и избежать типичных ошибок, с которыми столкнулся автор темы.
Проанализируем основную проблему: почему SQL Server часто пытается перезаписать файлы рабочей базы, даже если в команде RESTORE DATABASE указано имя тестовой базы? Причина кроется в параметре MOVE. Многие ошибочно полагают, что в MOVE 'Имя' нужно указывать логическое имя файлов будущей тестовой базы. Это неверно.
В параметре MOVE необходимо указывать логические имена файлов, которые хранятся внутри файла бэкапа (то есть имена файлов исходной рабочей базы). Если вы укажете их неверно, SQL Server проигнорирует команду перемещения и попытается восстановить файлы по тем путям, которые прописаны в заголовке бэкапа — а это пути к вашей рабочей базе.
Перед тем как приступать к восстановлению, выясним, какие логические имена содержатся в нашем .bak файле. Рассмотрим команду FILELISTONLY:
RESTORE FILELISTONLY
FROM DISK = N'H:\Backups\WorkBase.bak'
После выполнения этой команды мы получим таблицу. Нас интересует колонка LogicalName. Обычно там два файла: один для данных (например, WorkDB) и один для лога транзакций (например, WorkDB_log). Именно эти имена мы будем использовать далее в блоке WITH MOVE.
Одной из частых проблем является ошибка: «Не удалось выполнить обработку базы данных, так как она используется в этом сеансе». Выясним причину: 1С или другие службы могут держать открытыми соединения с тестовой базой. Чтобы скрипт отработал гарантированно, переведем базу в однопользовательский режим с немедленным разрывом всех соединений.
Проанализируем следующий блок кода:
USE master;
GO
-- Переводим базу в режим одного пользователя и обрываем все соединения
ALTER DATABASE [Testovaya]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO
Команда ROLLBACK IMMEDIATE мгновенно закрывает все активные транзакции и отключает пользователей, что позволяет нам беспрепятственно начать процесс восстановления.
Теперь рассмотрим основной скрипт. Нам нужно указать новое имя базы данных, путь к бэкапу и, самое главное, новые физические пути для .mdf и .ldf файлов, чтобы они не пересекались с файлами рабочей базы.
Предположим, логические имена из шага 1 — это WorkBase и WorkBase_log. Мы хотим восстановить их в базу Testovaya.
RESTORE DATABASE [Testovaya]
FROM DISK = N'H:\Backups\WorkBase.bak' -- Путь к вашему бэкапу
WITH FILE = 1,
-- Перемещаем файл данных (логическое имя из бэкапа -> новый физический путь)
MOVE 'WorkBase' TO N'D:\SQL_Data\Testovaya.mdf',
-- Перемещаем лог транзакций (логическое имя из бэкапа -> новый физический путь)
MOVE 'WorkBase_log' TO N'D:\SQL_Logs\Testovaya_log.ldf',
NOUNLOAD,
REPLACE, -- Разрешаем перезаписать существующую базу Testovaya
STATS = 10; -- Показывать прогресс каждые 10%
GO
Обратите внимание на параметр REPLACE. Он необходим, если база Testovaya уже существует, но была создана как «другая» база. Без этого флага SQL Server выдаст ошибку безопасности, защищая вас от случайной перезаписи данных.
После успешного завершения операции не забудьте вернуть базу в обычный рабочий режим, иначе никто, кроме первого подключившегося (включая сервер 1С), не сможет с ней работать.
ALTER DATABASE [Testovaya]
SET MULTI_USER;
GO
Разберем несколько важных моментов, которые помогут избежать проблем с производительностью и доступом после «переезда» базы через бэкап.
FULL. Для тестовой базы это часто избыточно и ведет к бесконтрольному росту лога транзакций. Проанализируем команду перевода в SIMPLE:
ALTER DATABASE [Testovaya] SET RECOVERY SIMPLE;
ALTER USER.DBCC CHECKDB после восстановления, особенно если исходная база имела признаки зависаний или проблем с дисковой подсистемой.Использование скрипта вместо графического интерфейса не только решает проблему «зависаний» консоли, но и позволяет автоматизировать процесс, например, для еженедельного обновления тестовых сред из планировщика задач SQL Agent.