Untuk melakukan failover, Pertama-tama Anda harus mengalihkan mode replikasi instans SQL Server dengan menggunakan Transact-SQL (T-SQL).
Kemudian, Anda dapat melakukan failover dan beralih peran dengan menggunakan PowerShell.
Beralih mode replikasi (Failover ke SQL MI)
Replikasi antara SQL Server dan SQL Managed Instance tidak sinkron secara default. Jika Anda melakukan failover dari SQL Server ke Azure SQL Managed Instance, sebelum Anda melakukan failover pada database, alihkan tautan ke mode sinkron di SQL Server dengan menggunakan Transact-SQL (T-SQL).
Catatan
- Lewati langkah ini jika Anda melakukan failover dari SQL Managed Instance ke SQL Server 2022.
- Replikasi sinkron di seluruh jarak jaringan yang besar mungkin memperlambat transaksi pada replika utama.
Jalankan skrip T-SQL berikut di SQL Server untuk mengubah mode replikasi grup ketersediaan terdistribusi dari asinkron ke sinkronisasi. Mengganti:
-
<DAGName>
dengan nama grup ketersediaan terdistribusi (digunakan untuk membuat tautan).
-
<AGName>
dengan nama grup ketersediaan yang dibuat di SQL Server (digunakan untuk membuat tautan).
-
<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_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
Sekarang setelah Anda mengalihkan SQL Server ke mode komit sinkron, replikasi antara dua instans dilakukan secara sinkron. Jika Anda perlu membalikkan status ini, ikuti langkah yang sama dan atur ke AVAILABILITY_MODE
ASYNCHRONOUS_COMMIT
.
Periksa nilai LSN pada SQL Server dan SQL Managed Instance
Untuk menyelesaikan failover atau migrasi, konfirmasikan bahwa replikasi ke sekunder telah selesai. Untuk ini, pastikan nomor urutan log (LSN) dalam catatan log untuk SQL Server dan SQL Managed Instance sama.
Awalnya, diharapkan bahwa LSN pada primer lebih tinggi daripada LSN pada sekunder. Latensi jaringan dapat menyebabkan replikasi tertinggal agak di belakang primer. Karena beban kerja telah dihentikan pada primer, LSN akan cocok 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 diperkeras.
-- 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 berfungsi pada General Purpose SQL Managed Instance. Untuk Business Critical SQL Managed Instance, hapus komentar and drs.is_primary_replica = 1
di akhir skrip. Pada tingkat layanan Business Critical, filter ini memastikan bahwa detail hanya dibaca dari replika utama.
-- 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
Atau, Anda juga dapat menggunakan perintah Get-AzSqlInstanceLink PowerShell atau az sql mi link show Azure CLI untuk mengambil LastHardenedLsn
properti untuk tautan Anda di SQL Managed Instance untuk memberikan informasi yang sama dengan kueri T-SQL sebelumnya.
Penting
Pastikan sekali lagi bahwa beban kerja Anda dihentikan pada server utama. Periksa apakah LSN pada SQL Server dan SQL Managed Instance cocok, dan bahwa LSN tetap cocok dan tidak berubah selama beberapa waktu. LSN yang stabil pada kedua instance menunjukkan log ekor telah direplikasi ke sekunder dan beban kerja telah dihentikan secara efektif.
Jika Anda ingin menggunakan PowerShell untuk melakukan failover database antara SQL Server 2022 dan SQL Managed Instance saat masih mempertahankan tautan, atau untuk melakukan failover dengan kehilangan data untuk versi SQL Server apa pun, gunakan Wizard Failover antara SQL Server dan Managed Instance di SSMS untuk menghasilkan skrip untuk lingkungan Anda. Anda dapat melakukan failover yang direncanakan dari replika utama atau replika sekunder. Untuk melakukan failover paksa, sambungkan ke replika sekunder.
Untuk memutuskan tautan dan menghentikan replikasi saat Anda melakukan failover atau memigrasikan database Anda terlepas dari versi SQL Server, gunakan perintah Hapus-AzSqlInstanceLink PowerShell atau tautan az sql mi hapus Azure CLI.
Perhatian
- Sebelum failover, hentikan beban kerja pada database sumber untuk memungkinkan database yang direplikasi benar-benar mengejar dan failover tanpa kehilangan data. Jika terjadi failover paksa, atau jika tautan terputus sebelum LSN cocok, data mungkin hilang.
- Melakukan failover pada database di SQL Server 2019 dan versi yang lebih lama akan memutus dan menghapus tautan antara dua replika. Anda tidak dapat melakukan failback ke primer awal.
Contoh skrip berikut memutus tautan dan mengakhiri replikasi antara replika Anda, sehingga database bisa dibaca dan ditulis di kedua instans. Ganti:
-
<ManagedInstanceName>
dengan nama instans terkelola Anda.
-
<DAGName>
dengan nama tautan yang Anda failover (output dari properti Name
dari perintah Get-AzSqlInstanceLink
yang dijalankan sebelumnya).
# 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
Ketika failover berhasil, tautan dihilangkan dan tidak ada lagi. Database SQL Server dan database SQL Managed Instance dapat menjalankan beban kerja baca/tulis karena sekarang sepenuhnya independen.
Penting
Setelah berhasil melakukan failover ke SQL Managed Instance, arahkan ulang aplikasi Anda secara manual string koneksi ke FQDN instans terkelola SQL untuk menyelesaikan proses migrasi atau failover dan terus berjalan di Azure.
Setelah tautan dihilangkan, Anda dapat menyimpan grup ketersediaan di SQL Server, tetapi Anda harus menghilangkan grup ketersediaan terdistribusi untuk menghapus metadata tautan dari SQL Server. Langkah tambahan ini hanya diperlukan saat melakukan failover dengan menggunakan PowerShell karena SSMS melakukan tindakan ini untuk Anda.
Untuk menghilangkan grup ketersediaan terdistribusi Anda, ganti nilai berikut lalu jalankan sampel kode T-SQL:
-
<DAGName>
dengan nama grup ketersediaan terdistribusi di SQL Server (digunakan untuk membuat tautan).
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <DAGName>
GO