장애 조치(failover)하려면 먼저 T-SQL(Transact-SQL)을 사용하여 복제 모드 SQL Server 인스턴스를 전환해야 합니다.
그런 다음, PowerShell을 사용하여 장애 조치(failover)하고 역할을 전환할 수 있습니다.
복제 모드 전환(SQL MI로 장애 조치(failover))
SQL Server 및 SQL Managed Instance 간의 복제는 기본적으로 비동기식입니다.
SQL Server에서 Azure SQL Managed Instance로 장애 조치(failover)하는 경우 데이터베이스를 장애 조치하기 전에 T-SQL(Transact-SQL)을 사용하여 SQL Server의 동기 모드로 링크를 전환합니다.
참고 사항
- SQL Managed Instance에서 SQL Server 2022로 장애 조치(failover)하는 경우 이 단계를 건너뜁니다.
- 멀리 떨어져 있는 네트워크 간에 동기 복제를 사용하면 주 복제본에서 트랜잭션 속도가 저하될 수 있습니다.
SQL Server에서 다음 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
으로 설정합니다.
SQL Server 및 SQL Managed Instance에서 LSN 값 확인
장애 조치(failover) 또는 마이그레이션을 완료하려면 보조 항목으로의 복제가 완료되었는지 확인합니다. 이렇게 하려면 SQL Server 및 SQL Managed Instance 모두의 로그 레코드에 있는 LSN(로그 시퀀스 번호)이 같아야 합니다.
처음에는 주 항목의 LSN이 보조 항목의 LSN보다 높을 수 있습니다. 네트워크 대기 시간으로 인해 복제가 주 항목보다 다소 지연될 수 있습니다. 워크로드가 주 항목에서 중지되었으므로 일정 시간 후에 LSN이 일치하고 변경이 중지됩니다.
SQL Server에서 다음 T-SQL 쿼리를 사용하여 마지막으로 기록된 트랜잭션 로그의 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>'
SQL Managed Instance에서 다음 T-SQL 쿼리를 사용하여 데이터베이스에 대해 마지막으로 강화된 LSN을 읽습니다.
<DatabaseName>
을 데이터베이스 이름으로 바꿉니다.
이 쿼리는 범용 SQL Managed Instance에서 작동합니다. 중요 비즈니스용 SQL Managed Instance의 경우 스크립트 끝에서 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 show Azure CLI 명령을 사용하여 이전 T-SQL 쿼리와 같은 정보를 제공하도록 SQL Managed Instance에서 링크의 LastHardenedLsn
속성을 페치할 수 있습니다.
Important
워크로드가 주 복제본에서 중지되었는지 다시 한 번 확인합니다. SQL Server와 SQL Managed Instance 둘 다의 LSN이 일치하는지, 그리고 일정 시간 동안 일치하고 변경되지 않은 상태로 유지되는지 확인합니다. 두 인스턴스의 안정적인 LSN는 비상 로그가 보조 복제본으로 복제되었으며 워크로드가 효과적으로 중지되었음을 나타냅니다.
데이터베이스 장애 조치(failover)
PowerShell을 사용하여 링크를 계속 유지하면서 SQL Server 2022 및 SQL Managed Instance 사이에서 데이터베이스를 장애 조치(failover)하거나 모든 버전의 SQL Server에 대해 장애 조치(failover)를 수행하려면(데이터 손실 발생) SSMS에서 SQL Server 및 Managed Instance 간 장애 조치(failover) 마법사를 사용하여 환경에 맞는 스크립트를 생성합니다. 주 복제본이나 보조 복제본에서 계획된 장애조치를 수행할 수 있습니다. 강제 장애 조치(failover)를 수행하려면 보조 복제본에 연결합니다.
SQL Server 버전에 관계없이 데이터베이스를 장애 조치(failover)하거나 마이그레이션할 때 링크를 끊고 복제를 중지하려면 Remove-AzSqlInstanceLink PowerShell 또는 az sql mi link delete Azure CLI 명령을 사용합니다.
주의
- 장애 조치(failover)를 수행하기 전에 원본 데이터베이스에서 워크로드를 중지하여 복제된 데이터베이스가 데이터 손실 없이 완전히 파악하고 장애 조치(failover)할 수 있도록 합니다. 강제 장애 조치(failover)를 수행하거나 LSN이 일치하기 전에 링크를 끊으면 데이터가 손실될 수 있습니다.
- SQL Server 2019 이전 버전에서 데이터베이스를 장애 조치(failover)하면 두 복제본(replica) 간의 링크가 끊기고 제거됩니다. 초기 주 복제본으로 장애 복구(failback)할 수 없습니다.
다음 샘플 스크립트에서는 링크를 끊고 복제본(replica) 간의 복제를 종료하므로 두 인스턴스 모두에서 데이터베이스를 읽고 쓸 수 있습니다. 바꾸기:
-
<ManagedInstanceName>
을 관리되는 인스턴스의 이름으로 바꿉니다.
-
<DAGName>
을 장애 조치(failover)하는 링크의 이름으로 바꿉니다(위에서 이전에 실행한 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
장애 조치(failover)가 성공하면 링크가 삭제되고 더 이상 존재하지 않습니다. SQL Server 데이터베이스 및 SQL Managed Instance 데이터베이스는 이제 완전히 독립되었으므로 모두 읽기/쓰기 워크로드를 실행할 수 있습니다.
Important
SQL Managed Instance로 장애 조치(failover)가 성공하면 마이그레이션 또는 장애 조치(failover) 프로세스를 완료하고 Azure에서 계속 실행되도록 애플리케이션 연결 문자열을 SQL Managed Instance FQDN으로 수동으로 다시 지정합니다.
링크를 삭제한 후 SQL Server에서 가용성 그룹을 유지할 수 있지만 SQL Server에서 링크 메타데이터를 제거하려면 분산 가용성 그룹을 삭제해야 합니다. 이 추가 단계의 경우 SSMS에서는 자동으로 이 작업을 수행하기 때문에 PowerShell을 사용하여 장애 조치(failover)하는 경우에만 필요합니다.
분산 가용성 그룹을 삭제하려면 다음 값을 바꾼 다음, 샘플 T-SQL 코드를 실행합니다.
-
<DAGName>
을 SQL Server의 분산 가용성 그룹의 이름(링크를 만드는 데 사용됨)으로 바꿉니다.
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <DAGName>
GO