Как быстро и безопасно перенести несколько десятков баз SQL Server на новый сервер в среде 1С?

Системный администратор IT и автоматизация бизнеса
← На главную

Перенос крупной ИТ-инфраструктуры, состоящей из десятков баз данных 1С (например, 30 и более баз общей емкостью около 500 ГБ), на новый сервер СУБД SQL Server — это задача, требующая от системного администратора не только аккуратности, но и высокой степени автоматизации. Выполнение резервного копирования и последующего восстановления для каждой базы вручную через графический интерфейс SQL Server Management Studio (SSMS) займет огромное количество времени и повысит риск человеческой ошибки.

В этой статье мы подробно разберем, как оптимизировать этот процесс. Мы рассмотрим как стандартные встроенные инструменты СУБД, так и передовые методы автоматизации с помощью PowerShell, сценариев T-SQL, а также разберем административные лайфхаки для платформы 1С:Предприятие, которые позволят переключить серверы без ручной настройки каждой информационной базы.

Способ 1. Классический метод Detach/Attach (Отсоединение и присоединение файлов)

Если базы данных не используют репликацию или моментальные снимки, самым простым и быстрым способом прямого копирования является физический перенос файлов баз данных (.mdf и .ldf). Этот метод избавляет от необходимости тратить ресурсы процессора на сжатие и распаковку бэкапов.

Разберем этот процесс по шагам:

  1. Останавливаем работу пользователей: Завершаем все активные сеансы в 1С и останавливаем службу сервера приложений 1С:Предприятие, чтобы гарантировать отсутствие активных транзакций.
  2. Отсоединяем базы данных (Detach): Вместо того чтобы кликать по каждой базе в SSMS, мы можем сгенерировать единый скрипт для отключения всех пользовательских баз данных. На старом сервере выполняем следующий T-SQL запрос:

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; -- Раскомментируйте для автоматического выполнения
  1. Копируем файлы: Физически переносим файлы данных (.mdf) и журналов транзакций (.ldf) на дисковые массивы нового сервера. При объеме в 500 ГБ по сети 10 Gbps этот процесс займет не более 7-10 минут.
  2. Присоединяем базы на новом сервере (Attach): Для массового присоединения файлов пишем аналогичный скрипт. Скрипт сканирует целевую папку или сопоставляет имена баз с путями. Шаблон команды для одной базы выглядит так:

CREATE DATABASE [Имя_Базы] ON 
( FILENAME = N'D:\SQLData\Имя_Базы.mdf' ),
( FILENAME = N'L:\SQLLogs\Имя_Базы_log.ldf' )
FOR ATTACH;

Важное ограничение: Метод требует полной остановки работы с базами на время копирования файлов. Если такое время простоя недопустимо, перейдем к более гибким вариантам.

Способ 2. Автоматизация миграции с помощью PowerShell и модуля dbatools

Для современных системных администраторов стандартом де-факто в управлении базами данных является использование бесплатного PowerShell-модуля dbatools. Он позволяет выполнить полный перенос всех баз данных, настроек безопасности, заданий агента и логинов буквально одной строкой кода.

Проанализируем сценарий миграции через dbatools:

  1. Установим модуль на административной машине или непосредственно на одном из серверов:

Install-Module dbatools -Force

  1. Запустим процесс переноса баз данных. Модуль автоматически сделает резервные копии на старом сервере, перенесет их на новый через промежуточную сетевую папку и восстановит с сохранением структуры:

Copy-DbaDatabase -Source "SQL-OLD" -Destination "SQL-NEW" -AllDatabases -BackupRestore -NetworkShare "\\BackupServer\ShareFolder"

Почему это лучше ручного переноса? Инструмент невероятно умен. С помощью дополнительной команды Start-DbaMigration вы можете перенести не только сами базы данных, но и:

Способ 3. Перенос баз с минимальным простоем: Log Shipping (Доставка журналов)

Если бизнес-процессы вашей организации не позволяют остановить работу 1С даже на пару часов, необходимых для копирования 500 ГБ данных, мы можем использовать технологию Log Shipping (доставка журналов транзакций).

Давайте разберем этот процесс по шагам:

  1. За несколько дней до планируемого перехода делаем полные резервные копии (Full Backup) всех 30+ баз на старом сервере и восстанавливаем их на новом сервере СУБД в режиме NORECOVERY (базы будут находиться в состоянии восстановления и будут недоступны для чтения/записи).
  2. Настраиваем автоматическое резервное копирование журнала транзакций (Transaction Log) на старом сервере каждые 15–30 минут с последующим восстановлением этих логов на новом сервере (также в режиме NORECOVERY).
  3. В день миграции:
    • Объявляем технический перерыв и отключаем всех пользователей от 1С.
    • Снимаем финальный бэкап журнала транзакций (Tail-Log Backup) на старом сервере, что переводит исходные базы в режим RESTORE_ONLY (исключая запись новых данных).
    • Накатываем этот финальный лог на новом сервере, используя инструкцию WITH RECOVERY.
  4. Все базы мгновенно становятся доступными на новом сервере в максимально актуальном состоянии. Время простоя сокращается до нескольких минут, необходимых на финальное применение логов и переключение серверов.

Способ 4. Динамический T-SQL скрипт для Backup/Restore

Если по каким-то причинам вы не можете использовать 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 ГБ в зависимости от характера данных) и ускорит последующую передачу по сети.

Лайфхак для 1С: Как не перенастраивать 30+ баз в консоли кластера вручную

После успешного переноса баз на новый SQL Server стандартный путь администратора — зайти в консоль администрирования кластера 1С:Предприятия и для каждой из 30+ баз вручную изменить адрес сервера СУБД. Это рутинная работа, в которой легко ошибиться.

Мы предлагаем два профессиональных способа избежать этой рутины:

Вариант А. Использование SQL Server Alias (Псевдоним)

Этот метод позволяет "обмануть" сервер приложений 1С. Мы заставим операционную систему сервера 1С перенаправлять сетевой трафик, предназначенный старому SQL-серверу, на адрес нового сервера.

  1. На сервере приложений 1С запускаем встроенную утилиту Windows через командную строку: cliconfg.exe.
  2. Если у вас используется 64-битный сервер 1С (что является стандартом), обязательно настройте утилиту как для 32-битных, так и для 64-битных подключений. Путь для 64-битной версии: C:\Windows\System32\cliconfg.exe, для 32-битной: C:\Windows\SysWOW64\cliconfg.exe.
  3. Переходим на вкладку Alias (Псевдоним).
  4. Нажимаем кнопку Add (Добавить).
  5. Выбираем сетевой протокол TCP/IP.
  6. В поле Server alias (Псевдоним сервера) вводим точное имя старого SQL-сервера.
  7. В поле Connection parameters (Параметры подключения) указываем IP-адрес или доменное имя нового SQL-сервера.
  8. Сохраняем изменения.

Теперь при попытке сервера 1С обратиться к старому SQL-серверу сетевой стек операционной системы прозрачно перенаправит все запросы на новый СУБД. В консоли 1С ничего менять не потребуется!

Вариант Б. Массовая правка конфигурационного файла кластера 1С

Если использование псевдонимов сети по каким-то причинам нежелательно, мы можем быстро изменить настройки подключения непосредственно в конфигурационных файлах самого кластера 1С:

  1. Останавливаем службу сервера приложений 1С (1C:Enterprise 8.3 Server Agent).
  2. Переходим в каталог хранения настроек кластера. По умолчанию он располагается по пути: C:\Program Files\1cv8\srvinfo\reg_1541\ (путь может отличаться в зависимости от версии платформы и настроек установки).
  3. Находим файл конфигурации баз данных 1CV8Reg.lst. Обязательно делаем его резервную копию!
  4. Открываем файл с помощью любого текстового редактора (например, Notepad++).
  5. С помощью инструмента автозамены (сочетание клавиш Ctrl + H) находим строку с именем или IP-адресом старого SQL-сервера и заменяем ее на имя нового сервера во всем документе.
  6. Сохраняем изменения в файле 1CV8Reg.lst.
  7. Запускаем службу сервера 1С.

Все 30+ баз мгновенно начнут обращаться к новому SQL-серверу, исключая необходимость ручной работы в консоли администрирования.

Резюме

Перенос большого количества баз данных в среде 1С — задача комплексная, но легко поддающаяся автоматизации. Используя связку из PowerShell (dbatools) для переноса баз и настроек прав СУБД вместе с механизмом SQL Alias (cliconfg) или прямой правкой 1CV8Reg.lst, можно провести миграцию 30 баз данных объемом 500 ГБ менее чем за час с минимальным временем простоя для конечных пользователей.

← На главную