T-SQL ve PowerShell betikleri aracılığıyla bağlantı içeren bir veritabanını yük devretme (geçirme) - Azure SQL Yönetilen Örneği

Şunlar için geçerlidir: Azure SQL Yönetilen Örneği

Bu makalede transact-SQL (T-SQL) ve PowerShell betiklerinin nasıl kullanılacağı ve veritabanınızın SQL Server'den SQL Yönetilen Örneği'a yük devretmek (geçirmek) için Yönetilen Örnek bağlantısının nasıl kullanılacağı öğretilmektedir.

Not

Önkoşullar

Veritabanlarınızı SQL Yönetilen Örneği çoğaltmak için aşağıdaki önkoşullara ihtiyacınız vardır:

Veritabanı yük devretmesi

SQL Server'den SQL Yönetilen Örneği'a veritabanı yük devretmesi iki veritabanı arasındaki bağlantıyı keser. Yük devretme çoğaltmayı durdurur ve her iki veritabanını da ayrı okuma/yazma iş yükleri için hazır durumda bırakır.

Veritabanınızı SQL Yönetilen Örneği'a geçirmeyi başlatmak için, önce bakım saatlerinizde SQL Server üzerinde tüm uygulama iş yüklerini durdurun. Bu, SQL Yönetilen Örneği veritabanı çoğaltmasını yakalamasını ve veri kaybını önlerken Azure'a geçişini sağlar.

Birincil veritabanı Always On kullanılabilirlik grubunun bir parçası olsa da, bunu salt okunur moda ayarlayamazsınız. Yük devretme öncesinde uygulamalarınızın SQL Server işlem gerçekleştirmediğinden emin olmanız gerekir.

Çoğaltma modunu değiştirme

SQL Server ile SQL Yönetilen Örneği arasındaki çoğaltma varsayılan olarak zaman uyumsuzdur. Veritabanınızı Azure'a geçirmeden önce bağlantıyı zaman uyumlu moda geçirin. Büyük ağ uzaklıkları arasında zaman uyumlu çoğaltma, birincil SQL Server örneğindeki işlemleri yavaşlatabilir.

Zaman uyumsuz moddan eşitleme moduna geçmek için SQL Yönetilen Örneği ve SQL Server çoğaltma modu değişikliği gerekir.

Çoğaltma modunu değiştirme (SQL Yönetilen Örneği)

PowerShell'i yüklü Az.Sql modülü 3.9.0 veya üzeriyle kullanın. Tercihen, komutları çalıştırmak için web tarayıcısından azure Cloud Shell çevrimiçi kullanın çünkü her zaman en son modül sürümleriyle güncelleştirilir.

İlk olarak Azure'da oturum açtığınızdan ve yönetilen örneğinizin barındırıldığı aboneliği seçtiğinizden emin olun. Hesabınızda birden fazla Azure aboneliği varsa uygun aboneliği seçmek özellikle önemlidir. Değiştir:

  • <SubscriptionID> azure abonelik kimliğiniz ile birlikte.
# Run in Azure Cloud Shell (select PowerShell console)

# Enter your Azure subscription ID
$SubscriptionID = "<SubscriptionID>"

# Login to Azure and select subscription ID
if ((Get-AzContext ) -eq $null)
{
    echo "Logging to Azure subscription"
    Login-AzAccount
}
Select-AzSubscription -SubscriptionName $SubscriptionID

Yük devretmek istediğiniz bağlantının adını bildiğinizden emin olun. Yönetilen örnekteki tüm etkin bağlantıları listelemek için Azure Cloud Shell'da aşağıdaki betiği kullanın. Değiştir:

  • <ManagedInstanceName> yönetilen örneğinizin kısa adıyla.
# Run in Azure Cloud Shell
# =============================================================================
# POWERSHELL SCRIPT TO LIST ALL LINKS ON MANAGED INSTANCE
# ===== Enter user variables here ====

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

# ==== Do not customize the below ====

# Find out the resource group name
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName

# List all links on the specified managed instance
Get-AzSqlInstanceLink -ResourceGroupName $ResourceGroup -InstanceName $ManagedInstanceName 

Yukarıdaki betiğin çıktısından, yük devretmek istediğiniz bağlantının özelliğini kaydedin Name .

Ardından, Azure Cloud Shell'da aşağıdaki betiği çalıştırarak tanımlanan bağlantı için çoğaltma modunu zaman uyumsuzdan yönetilen örnekte eşitlenecek şekilde değiştirin. Değiştir:

  • <ManagedInstanceName> yönetilen örneğinizin kısa adıyla.
  • <DAGName> önceki adımda bulduğunuz bağlantının adıyla (önceki adımdaki Name özellik).
# Run in Azure Cloud Shell
# =============================================================================
# POWERSHELL SCRIPT TO SWITCH LINK REPLICATION MODE (ASYNC\SYNC)
# ===== Enter user variables here ====

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

# ==== Do not customize the below ====

# Find out the resource group name
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName

# Update replication mode of the specified link
Update-AzSqlInstanceLink -ResourceGroupName $ResourceGroup -InstanceName $ManagedInstanceName -Name $LinkName -ReplicationMode "Sync"

Yukarıdaki komutun yürütülmesi işlemin özetini görüntüleyerek başarılı olduğunu gösterir ve özelliği ReplicationMode olarak Syncgösterilir.

Bu işlemi geri almanız gerekirse çoğaltma modunu değiştirmek için yukarıdaki betiği yürüterek içindeki -ReplicationModeAsyncdizesini Sync olarak değiştirin.

Çoğaltma modunu değiştirme (SQL Server)

SQL Server'da dağıtılmış kullanılabilirlik grubunun çoğaltma modunu zaman uyumsuzdan eşitlemeye değiştirmek için SQL Server'da aşağıdaki T-SQL betiğini kullanın. Değiştirmek:

  • <DAGName> dağıtılmış kullanılabilirlik grubunun adıyla (bağlantıyı oluşturmak için kullanılır).
  • <AGName>SQL Server üzerinde oluşturulan kullanılabilirlik grubunun adıyla (bağlantıyı oluşturmak için kullanılır).
  • <ManagedInstanceName> yönetilen örneğinizin adıyla birlikte.
-- 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);

Bağlantının çoğaltma modunu başarıyla değiştirdiğinizden emin olmak için aşağıdaki dinamik yönetim görünümünü kullanın. Sonuçlar durumu gösterir 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

Hem SQL Yönetilen Örneği hem de SQL Server eşitleme moduna geçtiğinize göre, iki varlık arasındaki çoğaltma zaman uyumlu olur. Bu durumu tersine çevirmeniz gerekiyorsa, aynı adımları izleyin ve hem SQL Server hem de SQL Yönetilen Örneği için zaman uyumsuz durumu ayarlayın.

Hem SQL Server hem de SQL Yönetilen Örneği LSN değerlerini denetleyin

Geçişi tamamlamak için çoğaltmanın tamamlandığını onaylayın. Bunun için, hem SQL Server hem de SQL Yönetilen Örneği için yazılan günlük kayıtlarını gösteren günlük dizisi numaralarının (LSN) aynı olduğundan emin olun.

Başlangıçta, SQL Server LSN'nin SQL Yönetilen Örneği LSN'den daha yüksek olması beklenir. Ağ gecikmesi, SQL Yönetilen Örneği birincil SQL Server örneğinin biraz gerisinde kalmasına neden olabilir. İş yükü SQL Server durdurulduğu için LSN'lerin eşleşmesini ve bir süre sonra değiştirilmesini durdurmasını beklemeniz gerekir.

Son kaydedilen işlem günlüğünün LSN'sini okumak için SQL Server üzerinde aşağıdaki T-SQL sorgusunu kullanın. Değiştir:

  • <DatabaseName> yazın ve en son sağlamlaştırılmış LSN numarasını arayın.
-- 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>'

Veritabanınızın en son sağlamlaştırılmış LSN'sini okumak için SQL Yönetilen Örneği aşağıdaki T-SQL sorgusunu kullanın. değerini veritabanınızın adıyla değiştirin <DatabaseName> .

Bu sorgu Genel Amaçlı yönetilen örnekte çalışır. yönetilen İş Açısından Kritik örneği için betiğin sonundaki açıklamayı and drs.is_primary_replica = 1 kaldırmanız gerekir. İş Açısından Kritik bu filtre yalnızca birincil çoğaltma ayrıntılarının okunmasını sağlar.

-- 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

Alternatif olarak Azure Cloud Shell PowerShell komutunu Get-AzSqlInstanceLink kullanarak yönetilen örnekteki bağlantınızın özelliğini getirebilirsinizLastHardenedLsn. Bu özellik yukarıdaki T-SQL sorgusuyla aynı bilgileri sağlar.

İş yükünüzün SQL Server durdurulduğunu bir kez daha doğrulayın. Hem SQL Server hem de SQL Yönetilen Örneği üzerindeki LSN'lerin eşleşip eşleşmediğini ve bir süre boyunca eşleştirilip değiştirilmediğini denetleyin. Her iki örnekteki kararlı LSN'ler kuyruk günlüğünün SQL Yönetilen Örneği çoğaltıldığını ve iş yükünün etkili bir şekilde durdurulduğunu gösterir.

Veritabanı yük devretmeyi ve Azure'a geçişi başlatma

Azure'a geçişinizi sonlandırmak için Azure Cloud Shell'da aşağıdaki betiği çalıştırın. Betik bağlantıyı keser ve SQL Yönetilen Örneği çoğaltmayı sonlandırır. Çoğaltılan veritabanı yönetilen örnekte okuma/yazma işlemine dönüşür. Değiştir:

  • <ManagedInstanceName> yönetilen örneğinizin adıyla birlikte.
  • <DAGName>yük devreddiğiniz bağlantının adıyla (yukarıda daha önce yürütülen komuttan Get-AzSqlInstanceLink özelliğinin Name çıktısı).
# Run in Azure Cloud Shell
# =============================================================================
# POWERSHELL SCRIPT TO FAILOVER AND MIGRATE DATABASE TO AZURE
# ===== Enter user variables here ====

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

# ==== Do not customize the below ====

# 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

Yük devretme işleminin başarıyla yürütülmesinde bağlantı bırakılır ve artık yoktur. Kaynak SQL Server veritabanı ve hedef SQL Yönetilen Örneği veritabanı bir okuma/yazma iş yükü yürütebilir. Tamamen bağımsızlar. Geçiş işlemini tamamlamak için uygulama bağlantı dizenizi yönetilen örneğe yeniden belirleyin.

Önemli

Başarılı bir yük devretme işleminde, Azure'da çalışmaya devam etmek ve geçiş işlemini tamamlamak için uygulamalarınızın bağlantı dizesini el ile yönetilen örnek FQDN'sine yeniden gönderin.

Kullanılabilirlik gruplarını temizleme

Bağlantıyı kesip veritabanını Azure SQL Yönetilen Örneği'a geçirdikten sonra, artık gerekli değilse kullanılabilirlik grubunu ve dağıtılmış kullanılabilirlik grubu kaynaklarını SQL Server temizlemeyi göz önünde bulundurun.

Aşağıdaki kodda şunu değiştirin:

  • <DAGName>SQL Server'da dağıtılmış kullanılabilirlik grubunun adıyla (bağlantıyı oluşturmak için kullanılır).
  • <AGName>SQL Server üzerindeki kullanılabilirlik grubunun adıyla (bağlantıyı oluşturmak için kullanılır).
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <DAGName>
GO
DROP AVAILABILITY GROUP <AGName>
GO

Bu adımla veritabanının SQL Server'den SQL Yönetilen Örneği geçişini tamamladınız.

Sonraki adımlar

Bağlantı özelliği hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: