Перенос базы данных MS SQL Server с одного экземпляра на другой — задача стандартная, но она часто сопровождается серьезной проблемой: потерей прав доступа и учетных записей пользователей (логинов). Если просто сделать бэкап и восстановить его на новом сервере, то учетные записи, созданные на уровне сервера (SQL Logins), не перенесутся автоматически. В этом материале мы разберем, как выполнить миграцию так, чтобы сохранить все пароли (даже если вы их не знаете) и избежать ошибок авторизации в 1С:Предприятии.
Прежде чем приступать к переносу, давайте проанализируем, почему обычное копирование файлов .mdf и .ldf не решает задачу. В Microsoft SQL Server система безопасности разделена на два уровня:
master. Это входные данные (логин и зашифрованный пароль), по которым сервер узнает пользователя.Связь между ними осуществляется не по имени, а по уникальному идентификатору SID (Security Identifier). При переносе базы на новый сервер пользователи внутри базы остаются, но их "партнеров" в системной базе master нового сервера нет. Наша задача — перенести эти логины с сохранением их оригинальных SID и хешей паролей.
Рассмотрим наиболее надежный и классический способ, который рекомендует Microsoft. Мы создадим на старом сервере специальную хранимую процедуру, которая сформирует готовый T-SQL скрипт для воссоздания всех логинов на новом сервере.
Разберем по шагам, как это сделать. Сначала на исходном (старом) сервере необходимо запустить скрипт, который создает две процедуры: sp_hexadecimal и sp_help_revlogin. Эти процедуры позволяют выгрузить пароли в двоичном виде.
После создания процедур выполним следующую команду в SQL Server Management Studio (SSMS):
EXEC sp_help_revlogin;
В результате выполнения мы получим список команд CREATE LOGIN. Обратите внимание на их структуру:
CREATE LOGIN [ИмяПользователя]
WITH PASSWORD = 0x0100456A... HASHED,
SID = 0x89AD...;
Проанализируем этот код: параметр HASHED указывает серверу, что мы передаем уже зашифрованный пароль, а SID гарантирует, что идентификатор будет идентичен старому серверу. Нам остается только скопировать этот результат, переключиться на новый сервер и выполнить его там.
Если нам нужно перенести большое количество настроек или мы хотим избежать ручного выполнения скриптов, воспользуемся современным инструментом dbatools. Это библиотека PowerShell, которая де-факто является стандартом для администраторов баз данных.
Для переноса логинов достаточно одной команды. Рассмотрим пример, где мы копируем логины с сервера "OldServer" на "NewServer":
Copy-DbaLogin -Source "OldServer" -Destination "NewServer"
Этот метод хорош тем, что он автоматически переносит не только логины и пароли, но и связанные с ними серверные роли (например, sysadmin или processadmin), что критично для полноценной работы сервера 1С.
Даже если мы перенесли логины, иногда связь между логином сервера и пользователем базы может "отвалиться" (особенно если SID по какой-то причине не совпали). Таких пользователей называют "осиротевшими".
Выясним причину проблемы: внутри базы данных SQL пользователь ссылается на SID, которого нет в таблице sys.server_principals нового сервера. Чтобы исправить это, воспользуемся командой ALTER USER. Проанализируем ситуацию на примере пользователя User1C:
USE [Имя_Вашей_Базы];
ALTER USER [User1C] WITH LOGIN = [User1C];
Для старых версий (таких как SQL 2008, упомянутый в теме) можно использовать системную процедуру:
EXEC sp_change_users_login 'Auto_Fix', 'User1C';
Эта команда автоматически сопоставит пользователя базы с одноименным логином сервера.
После того как база и логины успешно перенесены на новый экземпляр SQL Server, нам необходимо обновить настройки на стороне 1С. Посмотрим на последовательность действий:
Важный момент: если сервер 1С и SQL Server находятся на разных машинах, убедитесь, что на новом SQL сервере разрешены удаленные подключения по протоколу TCP/IP и открыт порт 1433 в брандмауэре.
Не забудем про регламентные задания SQL Server Agent. В 1С они часто используются для бэкапов, обновления статистики и переиндексации. Эти задания хранятся в базе msdb и не переносятся вместе с основной базой.
Рекомендуем на старом сервере нажать правой кнопкой мыши на каждое задание и выбрать "Script Job as" -> "CREATE To" -> "New Query Editor Window". Полученный скрипт нужно выполнить на новом сервере. Аналогично стоит поступить со связанными серверами (Linked Servers), если они использовались для интеграции 1С с другими системами.
Мы разобрали комплексный подход к миграции базы данных. Главный секрет успеха здесь заключается в сохранении SID при создании логинов на новом сервере. Использование скрипта sp_help_revlogin или модуля dbatools позволяет сделать это прозрачно для пользователей и системы 1С, сохранив работоспособность всех учетных записей без необходимости ручного ввода паролей.