Развертывание тестовой базы из актуального бэкапа рабочей базы — это стандартная задача для администратора 1С и SQL. Автоматизация этого процесса позволяет каждое утро иметь свежие данные для разработки и тестирования, не тратя время на рутинные действия в SQL Server Management Studio (SSMS). В рамках данной статьи мы разберем, как превратить ручное восстановление в полностью автоматический процесс, работающий по расписанию.
Самый надежный и «правильный» способ внутри экосистемы Microsoft SQL Server — это создание задания (Job) в SQL Server Agent. Этот компонент предназначен специально для выполнения регламентных задач. Рассмотрим, как составить сценарий, который сначала создаст свежий бэкап рабочей базы, а затем восстановит его поверх тестовой.
Для начала нам необходимо подготовить скрипт RESTORE. Важно понимать, что при восстановлении базы под другим именем или на другом сервере, нам нужно «переложить» файлы данных (.mdf) и логов (.ldf) в правильные папки. Проанализируем пример кода:
-- 1. Создаем бэкап рабочей базы
BACKUP DATABASE [WorkDB]
TO DISK = N'D:\BACKUP\WorkDB_Full.bak'
WITH NOFORMAT, INIT, NAME = N'WorkDB-Full Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
-- 2. Восстанавливаем в тестовую базу
RESTORE DATABASE [TestDB]
FROM DISK = N'D:\BACKUP\WorkDB_Full.bak'
WITH FILE = 1,
MOVE N'WorkDB_LogicalName' TO N'D:\SQLData\TestDB.mdf',
MOVE N'WorkDB_Log_LogicalName' TO N'D:\SQLLogs\TestDB_log.ldf',
NOUNLOAD, REPLACE, STATS = 5;
Разберем параметры этого скрипта подробнее:
RESTORE FILELISTONLY) и физический путь, где должен лежать файл тестовой базы.TestDB данными из бэкапа WorkDB.Если вам сложно составить пути вручную, воспользуйтесь хитростью, которую предоставляет SSMS. В окне восстановления базы данных, после того как вы выбрали файл бэкапа, настроили пути в разделе «Files» и поставили галочку «Overwrite the existing database (WITH REPLACE)», не нажимайте кнопку «ОК». Вместо этого в верхней части окна найдите кнопку Script и выберите «Script Action to New Query Window».
Программа сама сгенерирует идеальный T-SQL код со всеми путями и именами файлов. Вам останется только скопировать его в задание агента.
Часто автоматическое восстановление прерывается ошибкой: The database could not be exclusively locked to perform the operation. Это происходит потому, что в тестовой базе кто-то остался или зависло фоновое задание. Чтобы скрипт отработал гарантированно, перед восстановлением нужно принудительно перевести базу в однопользовательский режим.
Добавим в начало нашего сценария следующий блок кода:
USE [master];
GO
ALTER DATABASE [TestDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- Сюда вставляем основной скрипт RESTORE...
ALTER DATABASE [TestDB] SET MULTI_USER;
GO
Команда ROLLBACK IMMEDIATE мгновенно обрывает все активные транзакции и выкидывает пользователей, позволяя процессу восстановления беспрепятственно захватить базу.
При разворачивании копии базы 1С крайне важно не допустить ситуации, когда тестовая база начнет рассылать реальные счета клиентам или обмениваться данными с «Честным знаком». После восстановления базы через SQL, платформа 1С «не знает», что она стала тестовой.
Рассмотрим способы защиты:
/ScheduledJobsDeny.Params базы данных 1С, чтобы заблокировать регламентные задания прямо в SQL. Однако это требует осторожности, так как структура таблиц может меняться между версиями платформы.rac.exe. С ее помощью можно написать батник, который после восстановления базы в SQL подключится к кластеру 1С и установит флаг «Блокировка регламентных заданий включена» для данной информационной базы.Тестовые базы, как правило, не нуждаются в возможности восстановления на определенный момент времени (Point-in-time recovery). Чтобы лог транзакций (.ldf) не раздувался до невероятных размеров, мы рекомендуем после восстановления переводить базу в простую модель восстановления.
Проанализируем пример команды для оптимизации:
ALTER DATABASE [TestDB] SET RECOVERY SIMPLE;
GO
USE [TestDB];
DBCC SHRINKFILE (N'WorkDB_Log_LogicalName' , 1);
GO
Это позволит существенно сэкономить место на сервере, особенно если рабочая база имеет большой объем транзакций.
Для современных системных администраторов отличным выбором будет использование PowerShell. Модуль dbatools позволяет восстановить базу одной короткой командой, которая сама справится с переименованием файлов и закрытием сессий. Это выглядит примерно так:
Restore-DbaDatabase -SqlInstance "ИмяСервера" -Path "D:\Backup\Work.bak" -DatabaseName "TestDB" -WithReplace
Такой подход делает скрипты более читаемыми и легкими в поддержке, чем нагромождение команд в sqlcmd.
Важное предостережение: Будьте предельно внимательны с именами баз в скриптах. Ошибка в одной букве может привести к тому, что вы случайно затрете рабочую базу тестовыми данными. Всегда проверяйте скрипт на «песочнице» перед установкой в планировщик на сервере.