Миграция базы данных SCCM на другой SQL Server

Обновлено 02.05.2022

sccm logo

Добрый день! Уважаемые читатели и гост одного из крупнейших IT блогов в рунете Pyatilistnik.org. В прошлый раз мы с вами разобрали назначение порта управления ipmi, научились производить его настройку и управление. Идем далее и сегодня не менее интересная тема, я хочу с вами вместе произвести перенос базы данных System Center Configuration Manager на другой инстансе или SQL хост, покажу с какими подводными камнями мне пришлось столкнуться. Это оказался интересный опыт.

Постановка задачи

И так у меня есть виртуальная машина со службой System Center Configuration Manager, появились более новые сервера MS SQL Server, из которых был собран новый кластер. Было принято решение базу данных SCCM перенести на новый кластерный инстанс.

Схема текущей инфраструктуры

Вот список участвующих серверов:

  • ✅ Сервер SCCM02 - Собственно сервер System Center Configuration Manager
  • ✅ Сервер SQL01 - Сервер. где на текущий момент располагается БД
  • ✅ Сервер SCCMDB - Сервер куда мы будем переносить БД

Небольшие подготовительные требования

Перед любыми работами, что вы будите производить вы должны выполнить некоторые приготовления. Чтобы ваша миграция базы данных увенчалась успехом, вы обязаны на новом сервере SQL дать права администратора для учетной записи сервера, где крутиться System Center Configuration Manager. То есть в моем случае на SCCMDB нужно дать права для SCCM02.

Запустите окно "Выполнить"  и введите там:

У вас откроется окно управления локальными группами и пользователями. Перейдите в раздел с группами и найдите там администраторов. Откройте ее и добавьте в нее объект компьютера SCCM02. Сохраните настройки.

Добавление прав на SQL для сервера sccm

После этого сервер  базой данных рекомендуют перезагрузить. Кстати сервер с SCCM, так же перед сменой всех настроек лучше перезагрузить, чтобы не мешали отложенные установки обновлений и тому подобное.

Если прав не дать, то будет ошибка:

Failed to connect to the SQL Server, connection type: MODIFY_OLD_MASTER_ACCESS. $$<Configuration Manager Setup><01-27-2022 00:41:48.073-180><thread=10452 (0x28D4)>
INFO: SQL Connection failed. Connection: MODIFY_OLD_MASTER_ACCESS, Type: Unsecure $$<Configuration Manager Setup><01-27-2022 00:41:48.073-180><thread=10452 (0x28D4)>

ERROR: Failed to set database owner to sysadmin. $$<Configuration Manager Setup><01-27-2022 12:50:38.017-180><thread=9904 (0x26B0)>
ERROR: Failed to set database owner to sysadmin. $$<Configuration Manager Setup><01-27-2022 12:50:38.017-180><thread=9904 (0x26B0)>
ERROR Failed to configure database options on SQL Server. $$<Configuration Manager Setup><01-27-2022 12:50:38.017-180><thread=9904 (0x26B0)>

ERROR: Failed to create SQL Server certificate on server SCCMD.pyatilistnik.org Configuration Manager Setup 27.01.2022 14:32:58 12856 (0x3238)
ERROR: Failed to create SQL Server [SCCMD.pyatilistnik.org] certificate remotely. Configuration Manager Setup 27.01.2022 14:32:58 12856 (0x3238)
~===================== Failed Configuration Manager Server Setup - Modify Site Settings ===================== Configuration Manager Setup 27.01.2022 14:32:58 12856 (0x3238)

Failed to create SQL Server certificate on server

Алгоритм переноса БД SCCM на другой сервер

С права разобрались, давайте приступать. На сервере System Center Configuration Manager вы должны открыть командную строку от имени администратора и остановить ряд служб. Для этого перейдите в расположение C:\Program Files\Microsoft Configuration Manager\bin\X64\00000409 и запустите preinst.exe /stopsite.

cd C:\Program Files\Microsoft Configuration Manager\bin\X64\00000409

preinst.exe /stopsite

терпеливо ожидаем завершения операции.

остановка служб SCCM

Далее потушим еще с помощью PowerShell оставшиеся службы, выполните в консоли:

Stop-Service -Name AI_UPDATE_SERVICE_POINT
Stop-Service -Name CONFIGURATION_MANAGER_UPDATE
Stop-Service -Name SMS_NOTIFICATION_SERVER

Далее убедимся, что службы потушены:

Get-Service -Name AI_UPDATE_SERVICE_POINT
Get-Service -Name CONFIGURATION_MANAGER_UPDATE
Get-Service -Name SMS_NOTIFICATION_SERVER

Перезапуск служб System Center Configuration Manager

Далее на старом сервере MS SQL делаете полную резервную копию базы данных ConfigMgr.

Просмотрите текущие настройки базы данных на SQL01

Всегда полезно посмотреть перед любыми действиями текущие настройки на SQL сервере. Делать, это нужно для проверки совместимостей по требованиям вендора. Первое, что я всегда вам советую, это посмотреть версию SQL, для этого в PowerShell выполните:

Invoke-Sqlcmd -Query "SELECT @@version" | Format-Table –Wrap -AutoSize

Еще посмотрим сопоставление сервера (Collation)

Invoke-Sqlcmd -Query "SELECT CONVERT (varchar, SERVERPROPERTY('collation'));"

И проверим интеграцию CLR. Значение run_value, равное 1, означает, что оно включено.

Invoke-Sqlcmd -Query "sp_configure 'clr enabled'"

текущие настройки базы данных на SQL01

Так же советую вам посмотреть текущие настройки на самой БД SCCM. Для этого выполните запрос:

select name, collation_name, user_access_desc, is_read_only, state_desc, is_trustworthy_on, is_broker_enabled,is_honor_broker_priority_on from sys.databases

Проверка конфигурации БД sccm на работающем SQL сервере

Так же очень полезно вывести и сохранить себе все текущие права на SQL сервере, это может потом помочь в траблшутинге.

;WITH Logins AS (
SELECT prn.name PrincipalName
,prn.default_database_name
,rol.name RoleName
FROM sys.server_principals prn
LEFT OUTER JOIN sys.server_role_members mem
ON prn.principal_id = mem.member_principal_id
LEFT OUTER JOIN sys.server_principals rol
ON mem.role_principal_id = rol.principal_id
WHERE prn.is_disabled = 0
AND prn.type IN ('U','G')
AND prn.name NOT LIKE @@SERVERNAME+N'%'
)
SELECT N'USE [master];' AS CommandsToKeepAndRun
UNION ALL
-- Logins
SELECT N'IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = N'''+PrincipalName+N''')
CREATE LOGIN ['+PrincipalName+N'] FROM WINDOWS WITH DEFAULT_DATABASE = ['+ISNULL(default_database_name,N'master')+N'];
'
FROM Logins
UNION ALL
-- Server Roles
SELECT N'IF (
SELECT ISNULL(rol.name,N''NULL'')
FROM sys.server_principals prn
LEFT OUTER JOIN sys.server_role_members mem
ON prn.principal_id = mem.member_principal_id
LEFT OUTER JOIN sys.server_principals rol
ON mem.role_principal_id = rol.principal_id
WHERE prn.name = N'''+PrincipalName+N'''
) != N'''+RoleName+N'''
ALTER SERVER ROLE '+RoleName+N' ADD MEMBER ['+PrincipalName+N'];
'
FROM Logins
WHERE RoleName IS NOT NULL
UNION ALL
-- Server Permissions Extended:
SELECT CASE prm.class
WHEN 100 THEN prm.state_desc+' '+prm.permission_name+' TO ['+pal.name+'];' COLLATE SQL_Latin1_General_CP1_CI_AS
WHEN 105 THEN prm.state_desc+' '+prm.permission_name+' ON ENDPOINT :: ['+(SELECT name FROM sys.endpoints WHERE endpoint_id = prm.major_id)+'] TO ['+pal.name+'];' COLLATE SQL_Latin1_General_CP1_CI_AS
END
FROM sys.server_permissions prm
INNER JOIN sys.server_principals pal
ON prm.grantee_principal_id = pal.principal_id
AND pal.is_disabled = 0
AND pal.name NOT LIKE @@SERVERNAME+N'%'
AND pal.type IN ('U','G')
UNION ALL
SELECT N'GO';
--Courtesy: Ivan Semin--

скрипт вывода прав в SQL

Резервное копирование базы данных на старом сервере

Для того, чтобы сделать резервную копию базы данных SCCM выберите ее и из контекстного меню пройдите в пункт "Tasks - Back Up".

резервное копирование БД sccm

Выберите место назначения резервной копии на диске и добавьте резервную копию в место сохранения файла. Выберите расширение .bak.

Резервное копирование базы данных на старом сервере

Перейдите на вкладку "Media option" и выставите настройки по проверке резервной копии и контрольных сумм "Verify backup when finished" и "Perform checksum before writing to media".

Проверка резервной копии SQL

Запускаем. Ход резервного копирования можно посмотреть запросом:

select command
,CAST(total_elapsed_time/1000.0/60.0 AS NUMERIC(8,2)) AS [Elapsed Min]
,CAST(estimated_completion_time/1000.0/60.0 AS NUMERIC(8,2)) AS [ETA Min]
,CAST(estimated_completion_time/1000.0/60.0/60.0 AS NUMERIC(8,2)) AS [ETA Hours]
,CAST(percent_complete AS NUMERIC(8,2)) AS [Percent Complete]
from sys.dm_exec_requests
where session_id = (select max(spid) from master.dbo.sysprocesses with (nolock) where cmd in ('RESTORE DATABASE','BACKUP DATABASE'))

Восстановите базу данных сайта ConfigMgr на новом SQL Server

Переносите резервную копию БД на новый сервер и восстанавливаете. Если вам необходимо с нуля установить SQL Server, то об этом я подробно рассказывал. На новом SQL Server выбираем раздел "Database" и через контекстное меню выбираем пункт "Restore Database".

Восстановление БД sccm

Выберите "Device"  - "Add", после чего находим в папке нужную резервную копию.

выбор резервной копии БД sccm

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

Расположение файлов резервных копий на старом сервере

Запускайте процесс восстановления. После нужно проверить. Есть ряд нюансов:

  • ✅Вы должны для учетной записи компьютера SCCM в базах выставить вот такие роли. Откройте свойства учетной записи через SQL Server Management Studio. Для БД master: db_datareader, db_datawriter, db_owner, public. 

Права доступа на базу master

Для БД самого SCCM вот такие галочки нужно проставить: db_datareader, db_datawriter, db_owner, public.

Права доступа на базу SCCM

  • ✅Во вторых убедитесь, что параметры описанные выше включены в БД SCCM, команда та же:

select name, collation_name, user_access_desc, is_read_only, state_desc, is_trustworthy_on, is_broker_enabled,is_honor_broker_priority_on from sys.databases

Если по трем параметрам у вас значение "0", а так скорее всего и будет, то необходимо их активировать.

USE master
ALTER DATABASE CM_CM2 SET ENABLE_BROKER
ALTER DATABASE CM_CM2 SET TRUSTWORTHY ON
ALTER DATABASE CM_CM2 SET HONOR_BROKER_PRIORITY ON

И по необходимости для clr enabled

EXECUTE sp_configure 'clr enabled', 1;
RECONFIGURE WITH OVERRIDE;

Мастер перенастройки System Center Configuration Manager на другой SQL Server

Теперь, когда вы удостоверились, что все права выданы правильно, можно приступать к изменению сервера SQL. На сервере SCCm откройте пуск и найдите там Configuration Manager Setup.

запуск мастера Configuration Manager Setup

Так же найти его можно по пути:

"C:\Program Files\Microsoft Configuration Manager\bin\X64\setup.exe"

На вводном экране просто нажимаем "Next".

Вводное окно мастера Configuration Manager Setup Wizard

Выберите пункт "Perform site maintenance or reset this site".

Выполняем обслуживание сайта onfiguration Manager Setup Wizard

Далее пункт "Modify SQL Server configuration".

Изменение настроек SQL вConfiguration Manager Setup Wizard

Теперь самое интересное, вам нужно указать сервер баз данных на котором у вас теперь БД SCCM, тут есть несколько нюансов:

  1. 🛠Если у вас на SQL сервер больше нет других инстансов, то его можно не указывать
  2. 🛠Так же если инстанс один и порт стандартный 1433, то можно не указывать, в противном случае пропишите через запятую
  3. Порт 4022 от Service Broker оставьте какое есть

Прописывание нового SQL сервера в Configuration Manager Setup Wizard

Далее если связь установлена, то начнется процесс миграции БД SCCM. Еще из наблюдений, до изменения, база данных находилась на кластерном инстансе, он был не доступен, при попытке смены месторасположения сервера SQL и инстанса, мастер еще минут 25-30 пытался обратиться по старому адресу, это видно по логам, где этот кэш я не знаю.

*** [08001][10061][Microsoft][SQL Server Native Client 11.0]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. Configuration Manager Setup 02.05.2022 17:51:15 9048 (0x2358)
*** Failed to connect to the SQL Server, connection type: SQL160.PYATILISTNIK.ORG DB160\CM_CM2. Configuration Manager Setup 02.05.2022 17:51:15 9048 (0x2358)
INFO: SQL Connection failed. Connection: SQL160.PYATILISTNIK.ORG DB160\CM_CM2, Type: Unsecure Configuration Manager Setup 02.05.2022 17:51:15 9048 (0x2358)
ERROR: SQL Connection failed. Connection: SQL160.PYATILISTNIK.ORG DB160\CM_CM2, Type: Unsecure Configuration Manager Setup 02.05.2022 17:51:18 9048 (0x2358)
WARN: GetSCCMOldLogins: Failed to get sql connection. Configuration Manager Setup 02.05.2022 17:51:18 9048 (0x2358)

SQL Connection failed. Connection

Потом если все хорошо в логе все побелеет😁. Дожидаемся когда мастер закончит свою работу. При желании можете изучить лог.

Успешно выполненная миграция БД SCCM

<05-02-2022 18:41:09> ********************************************* 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:09> ***** ConfigMgr Setup Bootstrapper ***** 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:09> ********************************************* 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:09> Commandline: 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:09> "C:\Program Files\Microsoft Configuration Manager\bin\X64\SetupWpf.exe" 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:09> INFO: Checking dotnet framework versions... 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:09> INFO: Dotnet 3.5 installed 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:09> Starting SetupWpf.exe... 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:21> ***************************************************** 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:21> ***** Exiting ConfigMgr Setup Bootstrapper ***** 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 18:41:21> ***************************************************** 01.01.1601 0:00:00 3728437280 (0xDE3B7020)
<05-02-2022 19:38:44> ********************************************* 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:38:44> ***** ConfigMgr Setup Bootstrapper ***** 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:38:44> ********************************************* 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:38:44> Commandline: 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:38:44> "C:\Program Files\Microsoft Configuration Manager\bin\X64\SetupWpf.exe" 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:38:44> INFO: Checking dotnet framework versions... 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:38:44> INFO: Dotnet 3.5 installed 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:38:44> Starting SetupWpf.exe... 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:40:50> ***************************************************** 01.01.1601 0:00:00 3730853936 (0xDE605030)
<05-02-2022 19:40:50> ***** Exiting ConfigMgr Setup Bootstrapper ***** 01.01.1601 0:00:00 3730853936 (0xDE605030)

Не спешите запускать System Center Configuration Manager, еще службы WMI должны выполнить свои настройки, на это уходит минут 10. После этого можно запускать консоль, а еще лучше перезагрузитесь.

Службы wmi Provider Host

Что еще можно посоветовать после миграции БД SCCM

  • ✅Создайте тестовый пакет и распространите его на тестовые точки распространения.
  • ✅Запланируйте перемещение служб отчетов со старого сервера SQL на новый сервер SQL вместе с пользовательскими отчетами.
  • ✅Проверьте sitecomp.log на наличие операции начальной загрузки после перемещения БД.
  • ✅Проверьте журналы систем сайта, подключающихся к базе данных, таких как MP, WSUS и т. д

На этом у меня все, с вами был Иван Сёмин, автор и создатель IT проекта Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *