Melakukan fail over (memigrasikan) database dengan link melalui skrip T-SQL dan PowerShell - Azure SQL Managed Instance
BERLAKU UNTUK:
Azure SQL Managed Instance
Artikel ini mengajarkan Anda cara menggunakan skrip Transact-SQL (T-SQL) dan PowerShell serta link Managed Instance untuk melakukan fail over (memigrasi) database Anda dari SQL Server ke SQL Managed Instance.
Catatan
- Link adalah fitur dari Azure SQL Managed Instance dan saat ini dalam pratinjau. Anda juga dapat menggunakan wizard SQL Server Management Studio (SSMS) untuk menggagalkan database dengan link.
- Skrip PowerShell dalam artikel ini membuat panggilan REST API di sisi SQL Managed Instance.
Failover database dari SQL Server ke SQL Managed Instance memutuskan link antara dua database. Failover menghentikan replikasi dan membiarkan kedua database dalam keadaan independen, siap untuk beban kerja baca/tulis individu.
Untuk mulai memigrasikan database Anda ke SQL Managed Instance, pertama-tama hentikan semua beban kerja aplikasi di SQL Server selama jam pemeliharaan Anda. Hal ini memungkinkan SQL Managed Instance untuk mengejar replikasi database dan bermigrasi ke Azure sambil mengurangi kehilangan data.
Meskipun database utama adalah bagian dari grup ketersediaan Always On, Anda tidak dapat mengaturnya ke mode baca-saja. Anda perlu memastikan bahwa aplikasi Anda tidak melakukan transaksi ke SQL Server.
Mengalihkan mode replikasi
Replikasi antara SQL Server dan SQL Managed Instance asinkron secara default. Sebelum memigrasi database Anda ke Azure, alihkan link ke mode sinkron. Replikasi sinkron di seluruh jarak jaringan yang besar mungkin memperlambat transaksi pada instans SQL Server utama.
Beralih dari mode asinkron ke mode sinkronisasi memerlukan perubahan mode replikasi pada SQL Managed Instance dan SQL Server.
Mengalihkan mode replikasi (SQL Managed Instance)
Gunakan skrip PowerShell berikut untuk memanggil REST API yang mengubah mode replikasi dari asinkron menjadi sinkron pada SQL Managed Instance. Sebaiknya Anda membuat panggilan REST API menggunakan Azure Cloud Shell di portal Azure. Dalam skrip, ganti:
<YourSubscriptionID>dengan ID langganan Anda.<ManagedInstanceName>dengan nama instans terkelola Anda.<DAGName>dengan nama grup ketersediaan terdistribusi tempat Anda ingin mendapatkan status.
# Run in Azure Cloud Shell
# ====================================================================================
# POWERSHELL SCRIPT TO SWITCH REPLICATION MODE SYNC-ASYNC ON MANAGED INSTANCE
# USER CONFIGURABLE VALUES
# (C) 2021-2022 SQL Managed Instance product group
# ====================================================================================
# Enter your Azure subscription ID
$SubscriptionID = "<SubscriptionID>"
# Enter your managed instance name – for example, "sqlmi1"
$ManagedInstanceName = "<ManagedInstanceName>"
# Enter the distributed availability group name (the link name)
$DAGName = "<DAGName>"
# ====================================================================================
# INVOKING THE API CALL -- THIS PART IS NOT USER CONFIGURABLE
# ====================================================================================
# Log in and select a subscription if needed
if ((Get-AzContext ) -eq $null)
{
echo "Logging to Azure subscription"
Login-AzAccount
}
Select-AzSubscription -SubscriptionName $SubscriptionID
# Build a URI for the API call
#
$miRG = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
$uriFull = "https://management.azure.com/subscriptions/" + $SubscriptionID + "/resourceGroups/" + $miRG+ "/providers/Microsoft.Sql/managedInstances/" + $ManagedInstanceName + "/distributedAvailabilityGroups/" + $DAGName + "?api-version=2021-05-01-preview"
echo $uriFull
# Build the API request body
#
$bodyFull = "{`"properties`":{`"ReplicationMode`":`"sync`"}}"
echo $bodyFull
# Get an authentication token and build the header
#
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$currentAzureContext = Get-AzContext
$profileClient = New-Object Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient($azProfile)
$token = $profileClient.AcquireAccessToken($currentAzureContext.Tenant.TenantId)
$authToken = $token.AccessToken
$headers = @{}
$headers.Add("Authorization", "Bearer "+"$authToken")
# Invoke the API call
#
echo "Invoking API call switch Async-Sync replication mode on Managed Instance"
Invoke-WebRequest -Method PATCH -Headers $headers -Uri $uriFull -ContentType "application/json" -Body $bodyFull
Mengalihkan mode replikasi (SQL Server)
Gunakan skrip T-SQL berikut di SQL Server untuk mengubah mode replikasi grup ketersediaan terdistribusi di SQL Server dari asinkron menjadi sinkronisasi. Mengganti:
<DAGName>dengan nama grup ketersediaan terdistribusi.<AGName>dengan nama grup ketersediaan yang dibuat di SQL Server.<ManagedInstanceName>dengan nama instans terkelola Anda.
-- 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);
Untuk mengonfirmasi bahwa Anda telah berhasil mengubah mode replikasi link, gunakan tampilan manajemen dinamis berikut. Hasil menunjukkan status SYNCHRONOUS_COMIT.
-- 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
Sekarang setelah Anda mengalihkan SQL Managed Instance dan SQL Server ke mode sinkronisasi, replikasi antara dua entitas menjadi sinkron. Jika Anda perlu membalikkan status ini, ikuti langkah yang sama dan atur status asinkron untuk SQL Server dan SQL Managed Instance.
Periksa nilai LSN pada SQL Server dan SQL Managed Instance
Untuk menyelesaikan migrasi, konfirmasikan bahwa replikasi telah selesai. Untuk itu, pastikan bahwa nomor urut log (LSN) yang menunjukkan catatan log yang ditulis untuk SQL Server dan SQL Managed Instance sama.
Awalnya, LSN SQL Server diharapkan lebih tinggi daripada LSN SQL Managed Instance. Latensi jaringan dapat menyebabkan SQL Managed Instance agak tertinggal di belakang instans SQL Server utama. Karena beban kerja telah dihentikan di SQL Server, Anda harus mengharapkan LSN untuk mencocokkan dan berhenti berubah setelah beberapa waktu.
Gunakan kueri T-SQL berikut di SQL Server untuk membaca LSN dari log transaksi terakhir yang direkam. Ganti <DatabaseName> dengan nama database Anda dan cari nomor LSN terakhir yang diperketat.
-- 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>'
Gunakan kueri T-SQL berikut pada SQL Managed Instance untuk membaca LSN terakhir yang diperketat untuk database Anda. Ganti <DatabaseName> dengan nama database Anda.
Kueri ini akan berfungsi pada instans terkelola Tujuan Umum. Untuk instans terkelola Kritis Bisnis, Anda harus menghapus komentar and drs.is_primary_replica = 1 di akhir skrip. Pada Kritis Bisnis, filter ini memastikan bahwa hanya detail replika utama yang dibaca.
-- Run on a 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
Verifikasi sekali lagi bahwa beban kerja Anda dihentikan di SQL Server. Periksa apakah nomor urutan log pada SQL Server dan SQL Managed Instance cocok, serta nomor urutan logtetap cocok dan tidak berubah untuk beberapa waktu. LSN yang stabil pada kedua instans menunjukkan bahwa log tail telah direplikasi ke SQL Managed Instance dan beban kerja dihentikan secara efektif.
Memulai failover database dan memigrasikan ke Azure
Panggil panggilan REST API untuk melakukan fail over database Anda melalui link dan menyelesaikan migrasi Anda ke Azure. Panggilan REST API memutus tautan dan mengakhiri replikasi ke SQL Managed Instance. Database yang direplikasi menjadi baca/tulis pada instans terkelola.
Gunakan API berikut untuk memulai failover database ke Azure. Ganti:
<YourSubscriptionID>dengan ID langganan Azure Anda.<RG>dengan grup sumber daya tempat instans terkelola Anda disebarkan.<ManagedInstanceName>dengan nama instans terkelola Anda.<DAGName>dengan nama grup ketersediaan terdistribusi yang dibuat di SQL Server.
# Run in Azure Cloud Shell
# ====================================================================================
# POWERSHELL SCRIPT TO FAIL OVER AND MIGRATE DATABASE WITH SQL MANAGED INSTANCE LINK
# USER CONFIGURABLE VALUES
# (C) 2021-2022 SQL Managed Instance product group
# ====================================================================================
# Enter your Azure subscription ID
$SubscriptionID = "<SubscriptionID>"
# Enter your managed instance name – for example, "sqlmi1"
$ManagedInstanceName = "<ManagedInstanceName>"
# Enter the distributed availability group link name
$DAGName = "<DAGName>"
# ====================================================================================
# INVOKING THE API CALL -- THIS PART IS NOT USER CONFIGURABLE.
# ====================================================================================
# Log in and select a subscription if needed
if ((Get-AzContext ) -eq $null)
{
echo "Logging to Azure subscription"
Login-AzAccount
}
Select-AzSubscription -SubscriptionName $SubscriptionID
# Build a URI for the API call
#
$miRG = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
$uriFull = "https://management.azure.com/subscriptions/" + $SubscriptionID + "/resourceGroups/" + $miRG+ "/providers/Microsoft.Sql/managedInstances/" + $ManagedInstanceName + "/distributedAvailabilityGroups/" + $DAGName + "?api-version=2021-05-01-preview"
echo $uriFull
# Get an authentication token and build the header
#
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$currentAzureContext = Get-AzContext
$profileClient = New-Object Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient($azProfile)
$token = $profileClient.AcquireAccessToken($currentAzureContext.Tenant.TenantId)
$authToken = $token.AccessToken
$headers = @{}
$headers.Add("Authorization", "Bearer "+"$authToken")
# Invoke the API call
#
Invoke-WebRequest -Method DELETE -Headers $headers -Uri $uriFull -ContentType "application/json"
Membersihkan grup ketersediaan
Setelah Anda memutuskan link dan memigrasikan database ke Azure SQL Managed Instance, pertimbangkan untuk membersihkan grup ketersediaan dan sumber daya grup ketersediaan terdistribusi dari SQL Server jika tidak lagi diperlukan.
Dalam kode berikut, ganti:
<DAGName>dengan nama grup ketersediaan terdistribusi di SQL Server.<AGName>dengan nama grup ketersediaan di SQL Server.
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <DAGName>
GO
DROP AVAILABILITY GROUP <AGName>
GO
Dengan langkah ini, Anda telah menyelesaikan migrasi database dari SQL Server ke SQL Managed Instance.
Langkah berikutnya
Untuk informasi lebih lanjut tentang fitur link, baca artikel berikut:
- Managed Instance Link – Menyambungkan SQL Server ke Azure yang dirancang ulang
- Menyiapkan lingkungan Anda untuk link Managed Instance
- Menggunakan link Managed Instance dengan skrip untuk mereplikasi database
- Menggunakan link Managed Instance melalui SQL Server Management Studio untuk mereplikasi database
- Menggunakan link Managed Instance melalui SQL Server Management Studio untuk memigrasikan database