Перенос крупной ИТ-инфраструктуры, состоящей из десятков баз данных 1С (например, 30 и более баз общей емкостью около 500 ГБ), на новый сервер СУБД SQL Server — это задача, требующая от системного администратора не только аккуратности, но и высокой степени автоматизации. Выполнение резервного копирования и последующего восстановления для каждой базы вручную через графический интерфейс SQL Server Management Studio (SSMS) займет огромное количество времени и повысит риск человеческой ошибки.
В этой статье мы подробно разберем, как оптимизировать этот процесс. Мы рассмотрим как стандартные встроенные инструменты СУБД, так и передовые методы автоматизации с помощью PowerShell, сценариев T-SQL, а также разберем административные лайфхаки для платформы 1С:Предприятие, которые позволят переключить серверы без ручной настройки каждой информационной базы.
Если базы данных не используют репликацию или моментальные снимки, самым простым и быстрым способом прямого копирования является физический перенос файлов баз данных (.mdf и .ldf). Этот метод избавляет от необходимости тратить ресурсы процессора на сжатие и распаковку бэкапов.
Разберем этот процесс по шагам:
DECLARE @dbName NVARCHAR(128);
DECLARE @sql NVARCHAR(MAX) = '';
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE database_id > 4 AND state_desc = 'ONLINE'; -- Исключаем системные базы
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + 'ALTER DATABASE [' + @dbName + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ' +
'EXEC sp_detach_db @dbname = N''' + @dbName + '''; ' + CHAR(13);
FETCH NEXT FROM db_cursor INTO @dbName;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
-- Выводим или сразу выполняем сгенерированный скрипт
PRINT @sql;
-- EXEC sp_executesql @sql; -- Раскомментируйте для автоматического выполнения
.mdf) и журналов транзакций (.ldf) на дисковые массивы нового сервера. При объеме в 500 ГБ по сети 10 Gbps этот процесс займет не более 7-10 минут.
CREATE DATABASE [Имя_Базы] ON
( FILENAME = N'D:\SQLData\Имя_Базы.mdf' ),
( FILENAME = N'L:\SQLLogs\Имя_Базы_log.ldf' )
FOR ATTACH;
Важное ограничение: Метод требует полной остановки работы с базами на время копирования файлов. Если такое время простоя недопустимо, перейдем к более гибким вариантам.
Для современных системных администраторов стандартом де-факто в управлении базами данных является использование бесплатного PowerShell-модуля dbatools. Он позволяет выполнить полный перенос всех баз данных, настроек безопасности, заданий агента и логинов буквально одной строкой кода.
Проанализируем сценарий миграции через dbatools:
Install-Module dbatools -Force
Copy-DbaDatabase -Source "SQL-OLD" -Destination "SQL-NEW" -AllDatabases -BackupRestore -NetworkShare "\\BackupServer\ShareFolder"
Почему это лучше ручного переноса? Инструмент невероятно умен. С помощью дополнительной команды Start-DbaMigration вы можете перенести не только сами базы данных, но и:
Если бизнес-процессы вашей организации не позволяют остановить работу 1С даже на пару часов, необходимых для копирования 500 ГБ данных, мы можем использовать технологию Log Shipping (доставка журналов транзакций).
Давайте разберем этот процесс по шагам:
NORECOVERY (базы будут находиться в состоянии восстановления и будут недоступны для чтения/записи).NORECOVERY).RESTORE_ONLY (исключая запись новых данных).WITH RECOVERY.Если по каким-то причинам вы не можете использовать PowerShell, мы можем автоматизировать классический подход "Резервное копирование — Восстановление" с помощью динамического T-SQL. Напишем курсор, который самостоятельно сформирует нужные команды.
Скрипт для массового создания бэкапов на старом сервере:
DECLARE @dbName NVARCHAR(128);
DECLARE @backupDir NVARCHAR(256) = 'D:\BackupTransfer\';
DECLARE @sql NVARCHAR(MAX);
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE database_id > 4 AND state_desc = 'ONLINE';
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'BACKUP DATABASE [' + @dbName + '] TO DISK = ''' + @backupDir + @dbName + '.bak'' WITH INIT, COMPRESSION, STATS = 10;';
PRINT 'Выполняется бэкап базы: ' + @dbName;
EXEC sp_executesql @sql;
FETCH NEXT FROM db_cursor INTO @dbName;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
Этот скрипт создаст файлы формата .bak со сжатием (Compression), что значительно уменьшит их объем на диске (500 ГБ баз 1С обычно сжимаются до 70-100 ГБ в зависимости от характера данных) и ускорит последующую передачу по сети.
После успешного переноса баз на новый SQL Server стандартный путь администратора — зайти в консоль администрирования кластера 1С:Предприятия и для каждой из 30+ баз вручную изменить адрес сервера СУБД. Это рутинная работа, в которой легко ошибиться.
Мы предлагаем два профессиональных способа избежать этой рутины:
Этот метод позволяет "обмануть" сервер приложений 1С. Мы заставим операционную систему сервера 1С перенаправлять сетевой трафик, предназначенный старому SQL-серверу, на адрес нового сервера.
cliconfg.exe.C:\Windows\System32\cliconfg.exe, для 32-битной: C:\Windows\SysWOW64\cliconfg.exe.Теперь при попытке сервера 1С обратиться к старому SQL-серверу сетевой стек операционной системы прозрачно перенаправит все запросы на новый СУБД. В консоли 1С ничего менять не потребуется!
Если использование псевдонимов сети по каким-то причинам нежелательно, мы можем быстро изменить настройки подключения непосредственно в конфигурационных файлах самого кластера 1С:
1C:Enterprise 8.3 Server Agent).C:\Program Files\1cv8\srvinfo\reg_1541\ (путь может отличаться в зависимости от версии платформы и настроек установки).1CV8Reg.lst. Обязательно делаем его резервную копию!1CV8Reg.lst.Все 30+ баз мгновенно начнут обращаться к новому SQL-серверу, исключая необходимость ручной работы в консоли администрирования.
Перенос большого количества баз данных в среде 1С — задача комплексная, но легко поддающаяся автоматизации. Используя связку из PowerShell (dbatools) для переноса баз и настроек прав СУБД вместе с механизмом SQL Alias (cliconfg) или прямой правкой 1CV8Reg.lst, можно провести миграцию 30 баз данных объемом 500 ГБ менее чем за час с минимальным временем простоя для конечных пользователей.