Mereplikasi database dengan fitur link melalui skrip T-SQL dan PowerShell - Azure SQL Managed Instance

BERLAKU UNTUK: Azure SQL Managed Instance

Artikel ini menunjukkan cara menggunakan skrip Transact-SQL (T-SQL) dan PowerShell untuk mereplikasi database Anda dari SQL Server ke Azure SQL Managed Instance menggunakan link Instans Terkelola.

Catatan

  • Link merupakan fitur dari Azure SQL Managed Instance dan saat ini berada dalam pratinjau. Anda juga dapat menggunakan wizard SQL Server Management Studio (SSMS) untuk menyiapkan link replikasi database Anda.
  • Skrip PowerShell dalam artikel ini memanggil REST API Azure SQL Managed Instance.

Prasyarat

Untuk mereplikasi database ke Azure SQL Managed Instance, Anda memerlukan prasyarat berikut:

Mereplikasi database

Gunakan petunjuk berikut untuk menyiapkan link antara instans SQL Server dan instans terkelola Anda secara manual. Setelah link dibuat, database sumber Anda akan mendapatkan salinan replika baca-saja di instans terkelola target Anda.

Catatan

Link hanya mendukung replikasi database pengguna. Replikasi database sistem tidak didukung. Untuk mereplikasi objek tingkat instans (disimpan dalam database master atau msdb), sebaiknya buat skrip dan jalankan skrip T-SQL pada instans tujuan.

Terminologi dan konvensi penamaan

Saat menjalankan skrip dari panduan pengguna ini, pastikan untuk tidak salah mengira nama SQL Server dan SQL Managed Instance sebagai nama domain yang sepenuhnya memenuhi syarat (FQDN). Tabel berikut menjelaskan hal yang sebenarnya diwakili oleh berbagai nama dan cara mendapatkan nilainya:

Terminologi Deskripsi Cara mengetahuinya
Nama SQL Server Juga disebut nama pendek SQL Server. Misalnya: sqlserver1. Ini bukan nama domain yang sepenuhnya memenuhi syarat. Jalankan SELECT @@SERVERNAME dari T-SQL.
FQDN SQL Server Nama domain yang sepenuhnya memenuhi syarat untuk instans SQL Server Anda. Misalnya: sqlserver1.domain.com. Lihat konfigurasi jaringan (DNS) Anda di lokal, atau nama server jika Anda menggunakan mesin virtual (VM) Azure.
Nama SQL Managed Instance Juga disebut nama pendek SQL Managed Instance. Misalnya: managedinstance1. Lihat nama instans terkelola Anda di portal Azure.
FQDN SQL Managed Instance Nama domain yang sepenuhnya memenuhi syarat dari nama SQL Managed Instance Anda. Misalnya: managedinstance1.6d710bcf372b.database.windows.net. Lihat nama host di halaman ringkasan SQL Managed Instance di portal Azure.
Nama domain yang dapat diselesaikan Nama DNS yang dapat diselesaikan ke alamat IP. Misalnya, menjalankan nslookup sqlserver1.domain.com akan menghasilkan alamat IP seperti 10.0.1.100. Gunakan nslookup dari perintah.

Membangun kepercayaan di antara instans

Langkah pertama dalam menyiapkan link adalah membangun kepercayaan antar dua instans dan mengamankan titik akhir yang digunakan untuk berkomunikasi dan mengenkripsi data di seluruh jaringan. Grup ketersediaan terdistribusi menggunakan titik akhir pencerminan database grup ketersediaan yang ada, daripada menggunakan titik akhir khususnya sendiri. Inilah sebabnya keamanan dan kepercayaan antara dua entitas perlu dikonfigurasi untuk titik akhir pencerminan database grup ketersediaan.

Kepercayaan berbasis sertifikat merupakan satu-satunya cara yang didukung untuk mengamankan titik akhir pencerminan database di SQL Server dan SQL Managed Instance. Jika Anda memiliki grup ketersediaan yang menggunakan Autentikasi Windows, Anda perlu menambahkan kepercayaan berbasis sertifikat ke titik akhir pencerminan yang ada sebagai opsi autentikasi sekunder. Anda dapat melakukan ini dengan menggunakan pernyataan ALTER ENDPOINT.

Penting

Sertifikat dibuat dengan tanggal dan waktu kedaluwarsa. Sertifikat harus dirotasi sebelum kedaluwarsa.

Berikut adalah gambaran umum proses mengamankan titik akhir pencerminan database dari SQL Server dan SQL Managed Instance:

  1. Buat sertifikat di SQL Server dan dapatkan kunci umum.
  2. Dapatkan kunci umum sertifikat SQL Managed Instance.
  3. Tukar kunci umum antara SQL Server dan SQL Managed Instance.

Bagian berikut mendeskripsikan langkah-langkahnya secara mendetail.

Membuat sertifikat di SQL Server dan mengimpor kunci umum ke SQL Managed Instance

Pertama, buat kunci master di SQL Server dan buat sertifikat autentikasi:

-- Run on SQL Server
-- Create a master key encryption password
-- Keep the password confidential and in a secure place
USE MASTER
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_password>'
GO

-- Create the SQL Server certificate for the instance link
USE MASTER
GO

DECLARE @sqlserver_certificate_name NVARCHAR(MAX) = N'Cert_' + @@servername  + N'_endpoint'
DECLARE @sqlserver_certificate_subject NVARCHAR(MAX) = N'Certificate for ' + @sqlserver_certificate_name
DECLARE @create_sqlserver_certificate_command NVARCHAR(MAX) = N'CREATE CERTIFICATE [' + @sqlserver_certificate_name + '] WITH SUBJECT = ''' + @sqlserver_certificate_subject + ''', EXPIRY_DATE = ''03/30/2025'''
EXEC sp_executesql @stmt = @create_sqlserver_certificate_command
GO

Kemudian, gunakan kueri T-SQL berikut di SQL Server untuk memverifikasi bahwa sertifikat telah dibuat:

-- Run on SQL Server
USE MASTER
GO
SELECT * FROM sys.certificates

Dalam hasil kueri, Anda akan mengetahui bahwa sertifikat telah dienkripsi dengan kunci master.

Anda kini bisa mendapatkan kunci umum sertifikat yang dihasilkan di SQL Server:

-- Run on SQL Server
-- Show the public key of the generated SQL Server certificate
USE MASTER
GO
DECLARE @sqlserver_certificate_name NVARCHAR(MAX) = N'Cert_' + @@servername  + N'_endpoint'
DECLARE @PUBLICKEYENC VARBINARY(MAX) = CERTENCODED(CERT_ID(@sqlserver_certificate_name));
SELECT @PUBLICKEYENC AS PublicKeyEncoded;

Simpan nilai PublicKeyEncoded dari output, karena Anda akan membutuhkannya untuk langkah berikutnya.

Untuk langkah selanjutnya, gunakan PowerShell dengan modul Az.Sql yang diinstal, versi 3.5.1 atau yang lebih baru. Atau gunakan Azure Cloud Shell online untuk menjalankan perintah karena selalu diperbarui dengan versi modul terbaru.

Jalankan skrip PowerShell berikut. (Jika Anda menggunakan Cloud Shell, isi informasi pengguna yang diperlukan, salin, tempelkan ke Cloud Shell, lalu jalankan skrip.) Ganti:

  • <SubscriptionID> dengan ID langganan Azure Anda.
  • <ManagedInstanceName> dengan nama pendek instans terkelola Anda.
  • <PublicKeyEncoded> dengan bagian umum sertifikat SQL Server dalam format biner yang dihasilkan pada langkah sebelumnya. Ini adalah nilai string panjang yang dimulai dengan 0x.
# Run in Azure Cloud Shell
# ===============================================================================
# POWERSHELL SCRIPT TO IMPORT SQL SERVER CERTIFICATE TO MANAGED INSTANCE
# USER CONFIGURABLE VALUES
# (C) 2021-2022 SQL Managed Instance product group
# ===============================================================================
# Enter your Azure subscription ID
$SubscriptionID = "<YourSubscriptionID>"

# Enter your managed instance name – for example, "sqlmi1"
$ManagedInstanceName = "<YourManagedInstanceName>"

# Enter the name for the server trust certificate – for example, "Cert_sqlserver1_endpoint"
$certificateName = "<YourServerTrustCertificateName>"

# Insert the certificate public key blob that you got from SQL Server – for example, "0x1234567..."

$PublicKeyEncoded = "<PublicKeyEncoded>"

# ===============================================================================
# INVOKING THE API CALL -- REST OF THE SCRIPT 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 the 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 + "/serverTrustCertificates/" + $certificateName + "?api-version=2021-08-01-preview"
echo $uriFull

# Build the API request body.
#
$bodyFull = "{ `"properties`":{ `"PublicBlob`":`"$PublicKeyEncoded`" } }"

echo $bodyFull 

# Get auth token and build the HTTP request 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 API call
#
Invoke-WebRequest -Method PUT -Headers $headers -Uri $uriFull -ContentType "application/json" -Body $bodyFull

Operasi ini akan menghasilkan stempel waktu keberhasilan pengunggahan kunci privat sertifikat SQL Server ke SQL Managed Instance.

Mendapatkan kunci umum sertifikat dari SQL Managed Instance dan impor ke SQL Server

Sertifikat untuk mengamankan titik akhir untuk link dibuat secara otomatis. Bagian ini menjelaskan cara mendapatkan kunci umum sertifikat dari SQL Managed Instance dan cara mengimpor ke SQL Server.

Gunakan SQL Server Management Studio untuk menyambungkan ke SQL Managed Instance. Jalankan prosedur tersimpan sp_get_endpoint_certificate untuk mendapatkan kunci umum sertifikat:

-- Run on a managed instance
EXEC sp_get_endpoint_certificate @endpoint_type = 4

Salin seluruh kunci umum (yang dimulai dengan 0x) dari SQL Managed Instance. Jalankan kueri berikut di SQL Server dengan mengganti <InstanceCertificate> dengan nilai kunci. Anda tidak perlu menggunakan tanda kutip.

Penting

Nama sertifikat harus SQL Managed Instance FQDN.

-- Run on SQL Server
USE MASTER
CREATE CERTIFICATE [<SQLManagedInstanceFQDN>]
FROM BINARY = <InstanceCertificate>

Terakhir, verifikasi semua sertifikat yang dibuat dengan menggunakan tampilan manajemen dinamis (DMV) berikut:

-- Run on SQL Server
SELECT * FROM sys.certificates

Membuat titik akhir pencerminan di SQL Server

Jika Anda memiliki grup ketersediaan atau titik akhir pencerminan yang ada di SQL Server, langkah berikutnya adalah membuat titik akhir pencerminan di SQL Server dan mengamankannya dengan sertifikat. Jika Anda tidak memiliki grup ketersediaan atau titik akhir pencerminan yang ada, langsung ke bagian berikutnya, yakni Mengubah titik akhir yang ada.

Untuk memverifikasi bahwa Anda tidak memiliki titik akhir pencerminan database yang telah dibuat, gunakan skrip berikut:

-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT * FROM sys.database_mirroring_endpoints WHERE type_desc = 'DATABASE_MIRRORING'

Jika kueri sebelumnya tidak menampilkan titik akhir pencerminan database yang ada, jalankan skrip berikut di SQL Server. Langkah akan ini membuat titik akhir pencerminan database yang baru di port 5022 dan mengamankan titik akhir dengan sertifikat.

-- Run on SQL Server
-- Create a connection endpoint listener on SQL Server
USE MASTER
CREATE ENDPOINT database_mirroring_endpoint
    STATE=STARTED   
    AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
    FOR DATABASE_MIRRORING (
        ROLE=ALL,
        AUTHENTICATION = CERTIFICATE <SQL_SERVER_CERTIFICATE>,
        ENCRYPTION = REQUIRED ALGORITHM AES
    )  
GO

Validasi bahwa titik akhir pencerminan telah dibuat dengan menjalankan skrip berikut di SQL Server:

-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT
    name, type_desc, state_desc, role_desc,
    connection_auth_desc, is_encryption_enabled, encryption_algorithm_desc
FROM 
    sys.database_mirroring_endpoints

Titik akhir pencerminan dibuat dengan autentikasi sertifikat dan enkripsi AES diaktifkan.

Mengubah titik akhir yang ada

Catatan

Lewati langkah ini jika Anda baru saja membuat titik akhir pencerminan baru. Gunakan langkah ini hanya jika Anda menggunakan grup ketersediaan yang ada dengan titik akhir pencerminan database yang ada.

Jika Anda menggunakan grup ketersediaan yang ada untuk link, atau jika ada titik akhir pencerminan database, pertama-tama pastikan bahwa ketentuan wajib untuk link berikut terpenuhi:

  • Jenisnya harus menggunakan DATABASE_MIRRORING.
  • Autentikasi koneksi harus menggunakan CERTIFICATE.
  • Enkripsi harus diaktifkan.
  • Algoritma enkripsi harus menggunakan AES.

Jalankan kueri berikut di SQL Server guna melihat detail untuk titik akhir pencerminan database yang ada:

-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT
    name, type_desc, state_desc, role_desc, connection_auth_desc,
    is_encryption_enabled, encryption_algorithm_desc
FROM
    sys.database_mirroring_endpoints

Jika output menunjukkan bahwa titik akhir DATABASE_MIRRORINGconnection_auth_desc yang ada bukan berupa CERTIFICATE, atau encryption_algorthm_desc bukan AES, titik akhir perlu diubah untuk memenuhi persyaratan.

Di SQL Server, titik akhir pencerminan database yang sama digunakan untuk grup ketersediaan dan grup ketersediaan terdistribusi. Jika titik akhir connection_auth_desc Anda adalah NTLM (autentikasi Windows) atau KERBEROS, dan Anda memerlukan autentikasi Windows untuk grup ketersediaan yang ada, Anda dapat mengubah titik akhir untuk menggunakan beberapa metode autentikasi dengan mengalihkan opsi autentikasi ke NEGOTIATE CERTIFICATE. Dengan perubahan ini, grup ketersediaan yang ada dapat menggunakan autentikasi Windows sekaligus menggunakan autentikasi sertifikat untuk SQL Managed Instance.

Demikian pula, jika enkripsi tidak menyertakan SEL dan Anda memerlukan enkripsi RC4, Anda dapat mengubah titik akhir untuk menggunakan kedua algoritma. Untuk mengetahui detail tentang kemungkinan opsi untuk pengubahan titik akhir, lihat halaman dokumentasi untuk sys.database_mirroring_endpoints.

Skrip berikut adalah contoh cara mengubah titik akhir pencerminan database yang ada di SQL Server. Ganti:

  • <YourExistingEndpointName> dengan nama titik akhir yang ada.
  • <CERTIFICATE-NAME> dengan nama sertifikat SQL Server yang dihasilkan.

Bergantung pada konfigurasi spesifik Anda, Anda mungkin perlu menyesuaikan skrip lebih lanjut. Anda juga dapat menggunakan SELECT * FROM sys.certificates untuk mendapatkan nama sertifikat yang dibuat di SQL Server.

-- Run on SQL Server
-- Alter the existing database mirroring endpoint to use CERTIFICATE for authentication and AES for encryption
USE MASTER
ALTER ENDPOINT <YourExistingEndpointName>   
    STATE=STARTED   
    AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
    FOR DATABASE_MIRRORING (
        ROLE=ALL,
        AUTHENTICATION = WINDOWS NEGOTIATE CERTIFICATE <CERTIFICATE-NAME>,
        ENCRYPTION = REQUIRED ALGORITHM AES
    )
GO

Setelah Anda menjalankan kueri titik akhir ALTER dan mengatur mode autentikasi ganda ke Windows dan sertifikat, gunakan lagi kueri ini untuk menampilkan detail titik akhir pencerminan database:

-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT
    name, type_desc, state_desc, role_desc, connection_auth_desc,
    is_encryption_enabled, encryption_algorithm_desc
FROM
    sys.database_mirroring_endpoints

Anda telah berhasil memodifikasi titik akhir pencerminan database untuk link SQL Managed Instance.

Membuat grup ketersediaan di SQL Server

Jika Anda tidak memiliki grup ketersediaan yang ada, maka langkah berikutnya adalah membuatnya di SQL Server. Buat grup ketersediaan dengan parameter berikut untuk link:

  • Nama SQL Server
  • Nama database
  • Mode kegagalan MANUAL
  • Mode seeding AUTOMATIC

Pertama, temukan nama SQL Server Anda dengan menjalankan pernyataan T-SQL berikut:

-- Run on SQL Server
SELECT @@SERVERNAME AS SQLServerName 

Lalu, gunakan skrip berikut untuk membuat grup ketersediaan di SQL Server. Ganti:

  • <SQLServerName> dengan nama instans SQL Server Anda.

  • <AGName> dengan nama grup ketersediaan Anda. Untuk beberapa database, Anda harus membuat beberapa grup ketersediaan. Link Instans Terkelola memerlukan satu database untuk setiap grup ketersediaan. Pertimbangkan untuk memberi nama setiap grup ketersediaan sehingga namanya mencerminkan database yang sesuai - misalnya AG_<db_name>.

    Catatan

    Fitur link mendukung satu database per link. Untuk mereplikasi beberapa database di instans, buat link untuk setiap database individu. Misalnya, untuk mereplikasi 10 database ke SQL Managed Instance, buat 10 link individu.

  • <DatabaseName> dengan nama database yang ingin Anda replikasi.

  • <SQLServerIP> dengan alamat IP SQL Server. Anda dapat menggunakan nama host SQL Server uang dapat diselesaikan sebagai alternatif, namun Anda perlu memastikan bahwa nama tersebut dapat diselesaikan dari jaringan virtual SQL Managed Instance.

-- Run on SQL Server
-- Create the primary availability group on SQL Server
USE MASTER
CREATE AVAILABILITY GROUP [<AGName>]
WITH (CLUSTER_TYPE = NONE)
    FOR database [<DatabaseName>]  
    REPLICA ON   
        '<SQLServerName>' WITH   
            (  
            ENDPOINT_URL = 'TCP://<SQLServerIP>:5022',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC
            );
GO

Pertimbangkan skenario berikut:

  • Link saat ini mendukung replikasi satu database per grup ketersediaan. Anda dapat mereplikasi beberapa database ke SQL Managed Instance dengan menyiapkan beberapa link.
  • Kolase antara SQL Server dan SQL Managed Instance harus sama. Ketidakcocokan dalam kolase dapat menyebabkan ketidakcocokan dalam kapitalisasi nama server dan mencegah keberhasilan koneksi dari SQL Server ke SQL Managed Instance.
  • Kesalahan 1475 menunjukkan bahwa Anda perlu memulai rantai cadangan baru dengan membuat cadangan penuh tanpa opsi COPY ONLY.

Dalam kode berikut, ganti:

  • <DAGName> dengan nama grup ketersediaan terdistribusi Anda. Saat mereplikasi beberapa database, Anda memerlukan satu grup ketersediaan dan satu grup ketersediaan terdistribusi untuk setiap database. Pertimbangkan untuk menamai setiap item yang sesuai - misalnya, DAG_<db_name>.
  • <AGName> dengan nama grup ketersediaan yang Anda buat di langkah sebelumnya.
  • <SQLServerIP> dengan alamat IP SQL Server dari langkah sebelumnya. Anda dapat menggunakan nama host SQL Server sebagai alternatif, namun pastikan bahwa nama tersebut dapat diselesaikan dari jaringan virtual SQL Managed Instance.
  • <ManagedInstanceName> dengan nama pendek instans terkelola Anda.
  • <ManagedInstnaceFQDN> dengan nama domain yang sepenuhnya memenuhi syarat dari instans terkelola Anda.
-- Run on SQL Server
-- Create a distributed availability group for the availability group and database
-- ManagedInstanceName example: 'sqlmi1'
-- ManagedInstanceFQDN example: 'sqlmi1.73d19f36a420a.database.windows.net'
USE MASTER
CREATE AVAILABILITY GROUP [<DAGName>]
  WITH (DISTRIBUTED) 
  AVAILABILITY GROUP ON  
  '<AGName>' WITH 
  (
    LISTENER_URL = 'TCP://<SQLServerIP>:5022',
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL,
    SEEDING_MODE = AUTOMATIC,
    SESSION_TIMEOUT = 20
  ),
  '<ManagedInstanceName>' WITH
  (
    LISTENER_URL = 'tcp://<ManagedInstanceFQDN>:5022;Server=[<ManagedInstanceName>]',
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL,
    SEEDING_MODE = AUTOMATIC
  );
GO

Memverifikasi grup ketersediaan

Gunakan skrip berikut untuk membuat daftar atas semua grup ketersediaan dan grup ketersediaan terdistribusi di instans SQL Server. Pada titik ini, status grup ketersediaan Anda harus connected, dan status grup ketersediaan terdistribusi Anda harus disconnected. Status grup ketersediaan terdistribusi akan dipindahkan ke connected hanya jika telah digabungkan dengan SQL Managed Instance.

-- Run on SQL Server
-- This will show that the availability group and distributed availability group have been created on SQL Server.
SELECT * FROM sys.availability_groups

Atau, Anda dapat menggunakan Management Studio Object Explorer untuk menemukan grup ketersediaan dan grup ketersediaan terdistribusi. Perluas folder Selalu Dalam Ketersediaan Tinggi lalu folder Grup Ketersediaan.

Langkah terakhir dari proses penyiapan adalah membuat link. Saat ini, Anda menyelesaikan hal ini dengan melakukan panggilan REST API.

Anda dapat memanggil panggilan API langsung ke Azure dengan menggunakan berbagai klien API. Untuk menyederhanakan proses, masuk ke portal Azure dan jalankan skrip PowerShell berikut dari Azure Cloud Shell. Ganti:

  • <SubscriptionID> dengan ID langganan Azure Anda.
  • <ManagedInstanceName> dengan nama pendek instans terkelola Anda.
  • <AGName> dengan nama grup ketersediaan yang dibuat di SQL Server.
  • <DAGName> dengan nama grup ketersediaan terdistribusi yang dibuat di SQL Server.
  • <DatabaseName> dengan database yang direplikasi di grup ketersediaan di SQL Server.
  • <SQLServerAddress> dengan alamat instans SQL Server. Hal ini dapat berupa nama DNS, alamat IP publik, atau bahkan alamat IP pribadi. Alamat yang disediakan harus dapat diselesaikan dari node back-end yang menghosting instans terkelola.
# Run in Azure Cloud Shell
# =============================================================================
# POWERSHELL SCRIPT FOR CREATING 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 availability group name that was created on SQL Server
$AGName = "<AGName>"
# Enter the distributed availability group name that was created on SQL Server
$DAGName = "<DAGName>"
# Enter the database name that was placed in the availability group for replication
$DatabaseName = "<DatabaseName>"
# Enter the SQL Server address
$SQLServerAddress = "<SQLServerAddress>"

# =============================================================================
# INVOKING THE API CALL -- THIS PART IS NOT USER CONFIGURABLE
# =============================================================================
# Log in to the subscription if needed
if ((Get-AzContext ) -eq $null)
{
    echo "Logging to Azure subscription"
    Login-AzAccount
}
Select-AzSubscription -SubscriptionName $SubscriptionID
# -----------------------------------
# Build the URI for the API call
# -----------------------------------
echo "Building API URI"
$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
# -----------------------------------
echo "Buildign API request body"
$bodyFull = @"
{
    "properties":{
        "TargetDatabase":"$DatabaseName",
        "SourceEndpoint":"TCP://$SQLServerAddress`:5022",
        "PrimaryAvailabilityGroupName":"$AGName",
        "SecondaryAvailabilityGroupName":"$ManagedInstanceName",
    }
}
"@
echo $bodyFull 
# -----------------------------------
# Get the 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 to have Managed Instance join DAG on SQL Server"
$response = Invoke-WebRequest -Method PUT -Headers $headers -Uri $uriFull -ContentType "application/json" -Body $bodyFull
echo $response

Hasil operasi ini akan menjadi stempel waktu keberhasilan eksekusi permintaan untuk membuat link.

Untuk memverifikasi bahwa koneksi telah dibuat antara SQL Managed Instance dan SQL Server, jalankan kueri berikut di SQL Server. Koneksi tidak akan terjadi secara instan setelah Anda melakukan panggilan API. Diperlukan waktu hingga satu menit agar DMV mulai menunjukkan koneksi yang berhasil. Terus segarkan DMV hingga koneksi muncul sebagai CONNECTED untuk replika SQL Managed Instance.

-- Run on SQL Server
SELECT
    r.replica_server_name AS [Replica],
    r.endpoint_url AS [Endpoint],
    rs.connected_state_desc AS [Connected state],
    rs.last_connect_error_description AS [Last connection error],
    rs.last_connect_error_number AS [Last connection error No],
    rs.last_connect_error_timestamp AS [Last error timestamp]
FROM
    sys.dm_hadr_availability_replica_states rs
    JOIN sys.availability_replicas r
    ON rs.replica_id = r.replica_id

Setelah koneksi dibuat, tampilan Database Instans Terkelola di Management Studio awalnya menunjukkan database yang direplikasi dalam status Memulihkan saat fase seeding awal bergerak dan memulihkan pencadangan penuh database. Setelah database dipulihkan, replikasi harus mengejar ketertinggalan untuk membawa dua database ke status yang disinkronkan. Database tidak akan berstatus Pemulihan lagi setelah seeding awal selesai. Seeding database kecil mungkin cukup cepat sehingga Anda tidak akan melihat status Pemulihan awal di Management Studio.

Penting

  • Link tidak akan berfungsi kecuali konektivitas jaringan ada antara SQL Server dan SQL Managed Instance. Untuk memecahkan masalah konektivitas jaringan, ikuti langkah-langkah yang dijelaskan dalam Menguji konektivitas jaringan dua arah.
  • Cadangkan file log secara teratur di SQL Server. Jika ruang log yang digunakan mencapai 100 persen, replikasi ke SQL Managed Instance berhenti sampai penggunaan ruang berkurang. Sebaiknya otomatiskan pencadangan log dengan menyiapkan pekerjaan harian. Untuk mengetahui detailnya, lihat Mencadangkan file log di SQL Server.

Langkah berikutnya

Untuk informasi lebih lanjut tentang fitur link, baca artikel berikut: