В этой статье описывается, как выполнить отработку отказа базы данных, связанной между SQL Server и Управляемый экземпляр SQL Azure с помощью SQL Server Management Studio (SSMS) или PowerShell для аварийного восстановления или миграции.
Необходимые компоненты
Чтобы выполнить отработку отказа баз данных на вторичную реплику по ссылке, необходимо выполнить следующие предварительные требования:
Если вы готовы выполнить отработку отказа базы данных на вторичную реплику, сначала остановите все рабочие нагрузки приложений на первичной реплике во время обслуживания. Это позволяет репликации базы данных перехватывать вторичный объект, чтобы вы могли выполнить отработку отказа в дополнительный объект без потери данных. Убедитесь, что приложения не фиксируют транзакции в основной, прежде чем выполнять отработку отказа.
Отработка отказа базы данных
Вы можете выполнить отработку отказа связанной базы данных с помощью Transact-SQL (T-SQL), SQL Server Management Studio или PowerShell.
Чтобы выполнить плановая отработка отказа для ссылки, используйте следующую команду T-SQL в первичной реплике:
ALTER AVAILABILITY GROUP [<DAGname>] FAILOVER
Для выполнения принудительной отработки отказа используйте следующую команду T-SQL на вторичной реплике:
ALTER AVAILABILITY GROUP [<DAGname>] FORCE_FAILOVER_ALLOW_DATA_LOSS
Используйте мастер отработки отказа между SQL Server и Управляемый экземпляр в SSMS, чтобы выполнить отработку отказа базы данных из базы данных-источника на вторичную реплику.
Вы можете выполнить плановая отработка отказа из первичной или вторичной реплики. Для принудительной отработки отказа подключитесь к вторичной реплике.
Внимание
Прежде чем выполнить отработку отказа, остановите рабочую нагрузку в исходной базе данных, чтобы реплицированная база данных полностью перехватывалась и отработка отказа без потери данных. Если вы выполняете принудительное отработка отказа, вы можете потерять данные.
Отработка отказа базы данных в SQL Server 2019 и более ранних версиях прерывает работу и удаляет связь между двумя репликами. Не удается вернуться к исходному первичному источнику.
Чтобы выполнить отработку отказа базы данных, выполните следующие действия.
Откройте SSMS и подключитесь к любой реплике.
В обозреватель объектов щелкните правой кнопкой мыши реплицированную базу данных, наведите указатель мыши на ссылку Управляемый экземпляр SQL Azure и выберите отработку отказа... чтобы открыть мастер отработки отказа между SQL Server и Управляемый экземпляр. Если у вас несколько ссылок из одной базы данных, разверните группыдоступности в группе доступности AlwaysOn в обозреватель объектов и щелкните правой кнопкой мыши распределенную группу доступности для ссылки, которую требуется выполнить отработку отказа. Выберите отработка отказа... чтобы открыть мастер отработки отказа между SQL Server и Управляемый экземпляр для этой конкретной ссылки.
На странице Введите выберите Далее.
На странице "Выбор типа отработки отказа" отображаются сведения о каждой реплике, роли выбранной базы данных и поддерживаемых типах отработки отказа. Вы можете инициировать отработку отказа из любой реплики. При выборе принудительной отработки отказа необходимо установить флажок, чтобы указать, что может возникнуть потенциальная потеря данных. Выберите Далее.
Примечание.
Если вы выполняете миграцию на Управляемый экземпляр SQL Azure, выберите плановую отработку отказа.
На странице входа в Azure и удаленном экземпляре:
Выберите вход , чтобы указать учетные данные и войти в учетную запись Azure.
В зависимости от типа отработки отказа, выбранного на предыдущей странице, параметр входа работает по-разному. Для плановая отработка отказа вход в удаленный экземпляр (SQL Server или Управляемый экземпляр SQL) является обязательным. Для принудительной отработки отказа подписывание является необязательным, так как поддерживаются следующие два сценария:
Истинное аварийное восстановление: так как основной экземпляр обычно недоступен во время истинной аварии, вход невозможен, и пользователь должен немедленно выполнить отработку отказа в дополнительный экземпляр, что делает его новым первичным экземпляром. После устранения сбоя ссылка находится в несогласованном состоянии, так как обе реплики теперь находятся в основной роли (сценарий разделения мозга).
Аварийное восстановление. Выполнение аварийного восстановления с принудительной отработкой отказа не рекомендуется, так как может возникнуть потенциальная потеря данных. Однако во время детализации, так как основной экземпляр доступен, вход поддерживается, и вы можете изменить роли обоих реплик, чтобы избежать сценария разделения мозга.
На странице операций после отработки отказа параметры отличаются между SQL Server 2022 и более ранними версиями и не удалось ли подключиться к основному экземпляру.
Для SQL Server 2022 можно остановить репликацию между репликами, которая удаляет ссылку и распределенную группу доступности после завершения отработки отказа. Если вы хотите сохранить ссылку и продолжить репликацию данных между репликами, оставьте флажок без флажка. Если вы решили удалить ссылку, можно также установить флажок, чтобы удалить группу доступности, если вы создали ее исключительно для репликации базы данных в Azure, и ее больше не нужно. Установите флажки, которые соответствуют вашему сценарию, и нажмите кнопку "Далее".
Для SQL Server 2019 и более ранних версий параметр "Удалить ссылку" установлен по умолчанию, и ее невозможно снять, так как отработка отказа Управляемый экземпляр SQL останавливает репликацию, разрывает ссылку и удаляет распределенную группу доступности. Установите флажок, чтобы указать, что ссылка будет удалена, а затем нажмите кнопку "Далее".
(Необязательно) Если вы смогли войти в экземпляр SQL Server на предыдущей странице, вы также можете удалить группу доступности в экземпляре SQL Server после принудительной отработки отказа, установив флажок в разделе "Очистка ".
На странице "Сводка" просмотрите действия. При необходимости выберите скрипт для создания скрипта , чтобы можно было легко выполнить отработку отказа базы данных с помощью той же ссылки в будущем. Нажмите кнопку "Готово", когда вы будете готовы выполнить отработку отказа базы данных.
После завершения всех шагов на странице Результаты отобразятся флажки рядом с выполненными действиями. Теперь можно закрыть окно.
Если вы решили сохранить ссылку для SQL Server 2022, вторичная становится новой первичной, ссылка по-прежнему активна, и вы можете вернуться к вторичной.
Если вы находитесь в SQL Server 2019 и более ранних версиях или если вы решили удалить ссылку для SQL Server 2022, ссылка удаляется и больше не существует после завершения отработки отказа. Исходная база данных и целевая база данных на каждой реплике могут выполнять рабочую нагрузку чтения и записи. Они полностью независимы.
Внимание
После успешного отработки отказа до Управляемый экземпляр SQL вручную укажите строка подключения приложения в полное доменное имя управляемого экземпляра SQL, чтобы завершить миграцию или выполнить отработку отказа и продолжить работу в Azure.
Чтобы выполнить отработку отказа, сначала необходимо переключить режимы репликации экземпляра SQL Server с помощью Transact-SQL (T-SQL).
Затем можно выполнить отработку отказа и переключить роли с помощью PowerShell.
Переключение режима репликации (отработка отказа на SQL MI)
Репликация между SQL Server и Управляемый экземпляр SQL по умолчанию является асинхронной. Если вы выполняете отработку отказа из SQL Server в Управляемый экземпляр SQL Azure, перед отработой отказа базы данных переключитесь на синхронный режим на SQL Server с помощью Transact-SQL (T-SQL).
Примечание.
Пропустите этот шаг, если выполняется отработка отказа с Управляемый экземпляр SQL на SQL Server 2022.
Синхронная репликация между большими сетевыми расстояниями может замедлить транзакции на первичной реплике.
Выполните следующий скрипт T-SQL на SQL Server, чтобы изменить режим репликации распределенной группы доступности с асинхронной синхронизации. Заменять:
<DAGName> с именем распределенной группы доступности (используется для создания ссылки).
<AGName> с именем группы доступности, созданной на SQL Server (используется для создания ссылки).
<ManagedInstanceName> именем управляемого экземпляра;
-- Run on SQL Server
-- Sets the distributed availability group to a synchronous commit.
-- ManagedInstanceName example: 'sqlmi1'
USE master
GO
ALTER AVAILABILITY GROUP [<DAGName>]
MODIFY
AVAILABILITY GROUP ON
'<AGName>' WITH
(AVAILABILITY_MODE = SYNCHRONOUS_COMMIT),
'<ManagedInstanceName>' WITH
(AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
Чтобы убедиться, что режим репликации функции связи успешно изменен, используйте следующее динамическое административное представление. Результаты указывают на состояние SYNCHRONOUS_COMMIT.
-- Run on SQL Server
-- Verifies the state of the distributed availability group
SELECT
ag.name, ag.is_distributed, ar.replica_server_name,
ar.availability_mode_desc, ars.connected_state_desc, ars.role_desc,
ars.operational_state_desc, ars.synchronization_health_desc
FROM
sys.availability_groups ag
join sys.availability_replicas ar
on ag.group_id=ar.group_id
left join sys.dm_hadr_availability_replica_states ars
on ars.replica_id=ar.replica_id
WHERE
ag.is_distributed=1
Теперь, когда вы переключили SQL Server на режим синхронной фиксации, репликация между двумя экземплярами синхронна. Если необходимо изменить это состояние, выполните те же действия и задайте для нее AVAILABILITY_MODE значение ASYNCHRONOUS_COMMIT.
Проверка значений номеров LSN как в SQL Server, так и в Управляемом экземпляре SQL
Чтобы завершить отработку отказа или миграцию, убедитесь, что репликация на дополнительный объект завершена. Для этого убедитесь, что номера последовательности журналов (LSN) в записях журнала для SQL Server и Управляемый экземпляр SQL одинаковы.
Первоначально ожидается, что LSN на первичном сервере выше, чем LSN на вторичном. Задержка в сети может привести к задержке репликации несколько за основной. Так как рабочая нагрузка остановлена на основном сервере, имена LSN будут соответствовать и перестать изменяться через некоторое время.
Используйте следующий запрос T-SQL в SQL Server, чтобы считать номер LSN последнего записанного журнала транзакций. Замена:
<DatabaseName> с именем базы данных и найдите последний защищенный номер LSN.
-- Run on SQL Server
-- Obtain the last hardened LSN for the database on SQL Server.
SELECT
ag.name AS [Replication group],
db.name AS [Database name],
drs.database_id AS [Database ID],
drs.group_id,
drs.replica_id,
drs.synchronization_state_desc AS [Sync state],
drs.end_of_log_lsn AS [End of log LSN],
drs.last_hardened_lsn AS [Last hardened LSN]
FROM
sys.dm_hadr_database_replica_states drs
inner join sys.databases db on db.database_id = drs.database_id
inner join sys.availability_groups ag on drs.group_id = ag.group_id
WHERE
ag.is_distributed = 1 and db.name = '<DatabaseName>'
Используйте следующий запрос T-SQL в Управляемом экземпляре SQL, чтобы считать последний зафиксированный номер LSN для базы данных. Замените <DatabaseName> именем базы данных.
Этот запрос работает с Управляемый экземпляр SQL общего назначения. Для критически важный для бизнеса Управляемый экземпляр SQL раскомментируйте and drs.is_primary_replica = 1 его в конце скрипта. На уровне служб критически важный для бизнеса этот фильтр гарантирует, что сведения считываются только из основной реплики.
-- Run on SQL managed instance
-- Obtain the LSN for the database on SQL Managed Instance.
SELECT
db.name AS [Database name],
drs.database_id AS [Database ID],
drs.group_id,
drs.replica_id,
drs.synchronization_state_desc AS [Sync state],
drs.end_of_log_lsn AS [End of log LSN],
drs.last_hardened_lsn AS [Last hardened LSN]
FROM
sys.dm_hadr_database_replica_states drs
inner join sys.databases db on db.database_id = drs.database_id
WHERE
db.name = '<DatabaseName>'
-- for Business Critical, add the following as well
-- AND drs.is_primary_replica = 1
Кроме того, можно использовать команду Get-AzSqlInstanceLink PowerShell или az sql mi link, чтобы получить LastHardenedLsn свойство для ссылки на Управляемый экземпляр SQL, чтобы предоставить те же сведения, что и предыдущий запрос T-SQL.
Внимание
Убедитесь, что рабочая нагрузка остановлена на первичной. Убедитесь, что LSN в SQL Server и Управляемый экземпляр SQL совпадают, и что они остаются совпадающими и неизменными в течение некоторого времени. Стабильные LSN в обоих экземплярах указывают, что журнал хвоста реплицируется во вторичную и рабочая нагрузка фактически останавливается.
Отработка отказа базы данных
Если вы хотите использовать PowerShell для отработки отказа базы данных между SQL Server 2022 и Управляемый экземпляр SQL при сохранении связи или для отработки отказа с потерей данных для любой версии SQL Server, используйте мастер отработки отказа между SQL Server и Управляемый экземпляр в SSMS для создания скрипта для вашей среды. Вы можете выполнить плановая отработка отказа из первичной или вторичной реплики. Для принудительной отработки отказа подключитесь к вторичной реплике.
Чтобы разорвать ссылку и остановить репликацию при отработке отказа или переносе базы данных независимо от версии SQL Server, используйте команду Remove-AzSqlInstanceLink PowerShell или az sql mi link delete Azure CLI.
Внимание
Прежде чем выполнить отработку отказа, остановите рабочую нагрузку в исходной базе данных, чтобы позволить реплицированной базе данных полностью выполнить перехват и отработку отказа без потери данных. Если вы выполняете принудительной отработки отказа или если вы прерываете ссылку до сопоставления LSN, может потерять данные.
Отработка отказа базы данных в SQL Server 2019 и более ранних версиях прерывает работу и удаляет связь между двумя репликами. Не удается вернуться к исходному первичному источнику.
Следующий пример скрипта нарушает связь и завершает репликацию между репликами, что делает базу данных чтением и записью в обоих экземплярах. Замена:
<ManagedInstanceName> именем управляемого экземпляра;
<DAGName> с именем отработки отказа ссылки (выходные данные свойства Name из Get-AzSqlInstanceLink команды, выполненной ранее выше).
# Run in Azure Cloud Shell (select PowerShell console)
# =============================================================================
# POWERSHELL SCRIPT TO FAIL OVER OR MIGRATE DATABASE TO AZURE
# ===== Enter user variables here ====
# Enter your managed instance name – for example, "sqlmi1"
$ManagedInstanceName = "<ManagedInstanceName>"
$LinkName = "<DAGName>"
# ==== Do not customize the following cmdlet ====
# Find out the resource group name
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
# Failover the specified link
Remove-AzSqlInstanceLink -ResourceGroupName $ResourceGroup |
-InstanceName $ManagedInstanceName -Name $LinkName -Force
После успешной отработки отказа ссылка удаляется и больше не существует. База данных SQL Server и база данных Управляемый экземпляр SQL могут выполнять рабочие нагрузки чтения и записи, так как они теперь полностью независимы.
Внимание
После успешного отработки отказа до Управляемый экземпляр SQL вручную укажите строка подключения приложения в полное доменное имя управляемого экземпляра SQL, чтобы завершить миграцию или выполнить отработку отказа и продолжить работу в Azure.
После удаления ссылки можно сохранить группу доступности в SQL Server, но необходимо удалить распределенную группу доступности, чтобы удалить метаданные ссылки из SQL Server. Этот дополнительный шаг необходим только при отработки отказа с помощью PowerShell, так как SSMS выполняет это действие.
Чтобы удалить распределенную группу доступности, замените следующее значение и запустите пример кода T-SQL:
<DAGName> с именем распределенной группы доступности в SQL Server (используется для создания ссылки).
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <DAGName>
GO
Просмотр базы данных после отработки отказа
Для SQL Server 2022, если вы решили сохранить ссылку, можно проверить, существует ли распределенная группа доступности в обозреватель объектов в SQL Server Management Studio.
При удалении ссылки во время отработки отказа можно использовать обозреватель объектов для подтверждения отсутствия распределенной группы доступности. Если вы решили сохранить группу доступности, база данных по-прежнему будет синхронизирована.
Очистка после отработки отказа
Если после успешной отработки отказа не выбрана ссылка, отработка отказа с помощью SQL Server 2022 не прерывает эту ссылку. Вы можете сохранить ссылку после отработки отказа, которая оставляет группу доступности и активна распределенная группа доступности. Дополнительные действия не требуются.
Удаление ссылки удаляет только распределенную группу доступности и оставляет группу доступности активной. Вы можете сохранить группу доступности или удалить ее.
Если вы решите удалить группу доступности, замените следующее значение и запустите пример кода T-SQL:
<AGName> с именем группы доступности на SQL Server (используется для создания ссылки).
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <AGName>
GO
Несогласованное состояние после принудительной отработки отказа
После принудительной отработки отказа может возникнуть сценарий разделения мозга, в котором обе реплики находятся в основной роли, оставляя ссылку в несогласованном состоянии. Это может произойти, если выполнить отработку отказа на вторичную реплику во время аварии, а затем первичная реплика возвращается в режим "в сети".
Во-первых, убедитесь, что вы находитесь в сценарии разделения мозга. Это можно сделать с помощью SQL Server Management Studio (SSMS) или Transact-SQL (T-SQL).
Подключитесь как к управляемому экземпляру SQL Server, так и к управляемому экземпляру SQL в SSMS, а затем в обозреватель объектов разверните реплики доступности в узле группы доступности AlwaysOn. Если две разные реплики перечислены как основное, вы находитесь в сценарии разделения мозга.
Кроме того, можно запустить следующий скрипт T-SQL как в SQL Server, так и в Управляемый экземпляр SQL, чтобы проверить роль реплик:
-- Execute on SQL Server and SQL Managed Instance
declare @link_name varchar(max) = '<DAGName>'
USE MASTER
GO
SELECT
ag.name [Link name],
rs.role_desc [Link role]
FROM
sys.availability_groups ag
join sys.dm_hadr_availability_replica_states rs
on ag.group_id = rs.group_id
WHERE
rs.is_local = 1 and ag.name = @link_name
GO
Если оба экземпляра перечисляют другую первичную роль в столбце роли "Ссылка", вы находитесь в сценарии разделения мозга.
Чтобы устранить разделенное состояние мозга, сначала создайте резервную копию на любой реплике, которая была исходной первичной. Если исходный источник был SQL Server, создайте резервную копию журнала хвоста. Если исходный основной объект был Управляемый экземпляр SQL, выполните резервную копию только для копирования. После завершения резервного копирования установите распределенную группу доступности на вторичную роль для реплики, которая использовалась для исходной первичной, но теперь будет новой вторичной.
Например, в случае истинной аварии при условии, что вы принудили отработку отказа рабочей нагрузки SQL Server на Управляемый экземпляр SQL Azure, и планируете продолжить выполнение рабочей нагрузки на Управляемый экземпляр SQL, создайте резервную копию журналов хвоста в SQL Server, а затем задайте распределенную группу доступности вторичной роли в SQL Server, например следующий пример:
--Execute on SQL Server
USE MASTER
ALTER availability group [<DAGName>]
SET (role = secondary)
GO
Затем выполните плановую отработку отказа вручную из Управляемый экземпляр SQL в SQL Server с помощью ссылки, например в следующем примере:
--Execute on SQL Managed Instance
USE MASTER
ALTER availability group [<DAGName>] FAILOVER
GO
Связанный контент
Чтобы использовать ссылку, выполните следующие действия.