Как перенести базу SQL Server на другой сервер вместе с логинами и паролями?

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

Перенос базы данных MS SQL Server с одного экземпляра на другой — задача стандартная, но она часто сопровождается серьезной проблемой: потерей прав доступа и учетных записей пользователей (логинов). Если просто сделать бэкап и восстановить его на новом сервере, то учетные записи, созданные на уровне сервера (SQL Logins), не перенесутся автоматически. В этом материале мы разберем, как выполнить миграцию так, чтобы сохранить все пароли (даже если вы их не знаете) и избежать ошибок авторизации в 1С:Предприятии.

Понимаем архитектуру безопасности SQL Server

Прежде чем приступать к переносу, давайте проанализируем, почему обычное копирование файлов .mdf и .ldf не решает задачу. В Microsoft SQL Server система безопасности разделена на два уровня:

  1. Уровень сервера (Logins): Хранятся в системной базе master. Это входные данные (логин и зашифрованный пароль), по которым сервер узнает пользователя.
  2. Уровень базы данных (Users): Хранятся внутри конкретной пользовательской базы. Это права доступа к таблицам и процедурам.

Связь между ними осуществляется не по имени, а по уникальному идентификатору SID (Security Identifier). При переносе базы на новый сервер пользователи внутри базы остаются, но их "партнеров" в системной базе master нового сервера нет. Наша задача — перенести эти логины с сохранением их оригинальных SID и хешей паролей.

Метод 1: Использование скрипта sp_help_revlogin

Рассмотрим наиболее надежный и классический способ, который рекомендует 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 гарантирует, что идентификатор будет идентичен старому серверу. Нам остается только скопировать этот результат, переключиться на новый сервер и выполнить его там.

Метод 2: Автоматизация через dbatools (PowerShell)

Если нам нужно перенести большое количество настроек или мы хотим избежать ручного выполнения скриптов, воспользуемся современным инструментом dbatools. Это библиотека PowerShell, которая де-факто является стандартом для администраторов баз данных.

Для переноса логинов достаточно одной команды. Рассмотрим пример, где мы копируем логины с сервера "OldServer" на "NewServer":

Copy-DbaLogin -Source "OldServer" -Destination "NewServer"

Этот метод хорош тем, что он автоматически переносит не только логины и пароли, но и связанные с ними серверные роли (например, sysadmin или processadmin), что критично для полноценной работы сервера 1С.

Решение проблемы «осиротевших» пользователей (Orphaned Users)

Даже если мы перенесли логины, иногда связь между логином сервера и пользователем базы может "отвалиться" (особенно если 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';

Эта команда автоматически сопоставит пользователя базы с одноименным логином сервера.

Особенности настройки для 1С:Предприятие

После того как база и логины успешно перенесены на новый экземпляр SQL Server, нам необходимо обновить настройки на стороне 1С. Посмотрим на последовательность действий:

  1. Откроем Консоль администрирования серверов 1С:Предприятия.
  2. Найдем нашу информационную базу в списке.
  3. В свойствах базы изменим параметр "Сервер баз данных" (укажем имя нового SQL-сервера).
  4. Если при переносе изменился логин или пароль администратора СУБД, который 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С, сохранив работоспособность всех учетных записей без необходимости ручного ввода паролей.

← На главную