Azure Database Migration Service - awaria połączenia ze źródłową bazą danych
Naprawa błędów połączenia Azure Database Migration Service: weryfikacja NSG, firewall rules, Self-Hosted Integration Runtime i konfiguracji sieci źródłowej.
Ten runbook opisuje rozwiązywanie problemów z połączeniem DMS do źródłowej bazy SQL Server. Pełny przewodnik po migracji infrastruktury .NET do Azure znajdziesz w artykule Migracja do Azure krok po kroku - App Service, AKS, Landing Zone. W kwestii planowania i realizacji migracji bazodanowych umów konsultacje.
Objaw
Logi DMS w Azure Portal lub CLI pokazują błędy połączenia ze źródłową bazą danych. Task migracji pozostaje w stanie „Failed” lub „Stopped”:
# Typowe komunikaty bledow w DMS:
# "The connectivity check to the source server failed"
# "Failed to connect to source SQL Server. Reason: A network-related or instance-specific error occurred"
# "Login failed for user 'dms_migration_user'. Reason: The server is not configured to allow remote connections"
# "TCP Provider: No connection could be made because the target machine actively refused it"
# Sprawdz status taska migracji via Azure CLI
az dms project task show \
--resource-group rg-migration \
--service-name dms-prod-westeurope \
--project-name sql-to-azure-project \
--name full-migration-task \
--query '{status:properties.state, errors:properties.errors}'
# Lista wszystkich taskow w projekcie migracji
az dms project task list \
--resource-group rg-migration \
--service-name dms-prod-westeurope \
--project-name sql-to-azure-project \
--query '[].{name:name, state:properties.state}' -o table
# Sprawdz eventy DMS w Activity Log
az monitor activity-log list \
--resource-group rg-migration \
--start-time $(date -u -d '2 hours ago' +%Y-%m-%dT%H:%M:%SZ) \
--query "[?contains(resourceId,'dms-prod-westeurope')].{time:eventTimestamp, status:status.value, message:properties.statusMessage}" \
-o table
Status taska to „Failed” z kodem błędu ConnectionFailure lub SourceServerUnreachable. W Activity Log widoczne są powtarzające się próby połączenia zakończone niepowodzeniem.
Przyczyna
Azure DMS wymaga bezpośredniej komunikacji sieciowej ze źródłową instancją SQL Server (port TCP 1433 lub niestandardowy). Błąd połączenia pojawia się, gdy:
-
NSG blokuje port 1433: Network Security Group przypisana do subnetu DMS lub subnetu z Self-Hosted IR nie zezwala na ruch wychodzący do IP źródłowego serwera SQL na porcie 1433. Domyślne reguły NSG blokują ruch do sieci on-premises lub peered VNets.
-
Firewall na serwerze źródłowym: Windows Firewall na maszynie ze źródłowym SQL Server blokuje połączenia przychodzące na porcie 1433. SQL Server może być skonfigurowany do nasłuchiwania na named instance (port dynamiczny) bez stałego przypisania portu.
-
Self-Hosted Integration Runtime nie działa: Agent SHIR na maszynie pośredniczącej jest zatrzymany, nieaktualny lub utracił połączenie z Azure. Bez działającego SHIR, DMS nie może dotrzeć do zasobów w sieci on-premises.
-
Błąd rozwiązywania DNS w sieci prywatnej: DMS lub SHIR nie potrafi rozwiązać FQDN źródłowego serwera SQL. Private DNS zones nie są poprawnie skonfigurowane lub linkowane do VNetu DMS. Connection string używa nazwy hosta, która nie jest rozpoznawalna z perspektywy agenta.
-
Wygasłe lub niepoprawne dane uwierzytelniające: Hasło użytkownika migracyjnego wygasło, konto zostało zablokowane przez politykę lockout lub użytkownik nie ma uprawnień
db_datareaderiVIEW SERVER STATEwymaganych przez DMS.
Rozwiązanie
A) Weryfikacja i naprawa reguł NSG:
# Znajdz NSG przypisana do subnetu DMS
az network vnet subnet show \
--resource-group rg-network \
--vnet-name vnet-migration \
--name subnet-dms \
--query 'networkSecurityGroup.id' -o tsv
# Wylistuj reguly outbound NSG
az network nsg rule list \
--resource-group rg-network \
--nsg-name nsg-subnet-dms \
--query "[?direction=='Outbound'].{name:name, priority:priority, access:access, destPort:destinationPortRange, destAddr:destinationAddressPrefix}" \
-o table
# Dodaj regule zezwalajaca na ruch do zrodlowego SQL Server (port 1433)
az network nsg rule create \
--resource-group rg-network \
--nsg-name nsg-subnet-dms \
--name Allow-SQL-Source-Outbound \
--priority 200 \
--direction Outbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes "10.1.0.0/24" \
--destination-address-prefixes "192.168.1.50" \
--destination-port-ranges 1433 \
--description "Allow DMS subnet to reach source SQL Server"
# Jesli DMS laczy sie przez peered VNet - sprawdz czy peering jest aktywny
az network vnet peering show \
--resource-group rg-network \
--vnet-name vnet-migration \
--name peering-to-onprem-vnet \
--query '{state:peeringState, allowForwarded:allowForwardedTraffic, useRemoteGw:useRemoteGateways}'
B) Konfiguracja firewalla na serwerze źródłowym:
# Na serwerze zrodlowym SQL Server - sprawdz czy port 1433 jest otwarty
Test-NetConnection -ComputerName localhost -Port 1433
# Dodaj regule Windows Firewall dla portu 1433
New-NetFirewallRule `
-DisplayName "Allow DMS Inbound SQL" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 1433 `
-Action Allow `
-RemoteAddress 10.1.0.0/24 `
-Description "Allow Azure DMS subnet to connect to SQL Server"
# Sprawdz czy SQL Server nasluchuje na TCP i poprawnym porcie
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp" `
-Name Enabled
# Dla named instance - przypisz staly port w SQL Server Configuration Manager
# SQL Server Configuration Manager > SQL Server Network Configuration >
# Protocols for [INSTANCE] > TCP/IP > IP Addresses > IPAll > TCP Port = 1433
# Restart uslugi SQL Server po zmianie portu
Restart-Service -Name 'MSSQL$MSSQLSERVER' -Force
# Weryfikacja nasluchiwania
Get-NetTCPConnection -LocalPort 1433 -State Listen
C) Naprawa Self-Hosted Integration Runtime:
# Na maszynie z SHIR - sprawdz status uslugi
Get-Service -Name "DIAHostService" | Select-Object Status, StartType
# Jesli usluga jest zatrzymana - uruchom
Start-Service -Name "DIAHostService"
# Sprawdz wersje SHIR i czy wymaga aktualizacji
& "C:\Program Files\Microsoft Integration Runtime\5.0\Shared\dmgcmd.exe" -Status
# Z poziomu Azure CLI - sprawdz stan SHIR (Integration Runtime)
az datafactory integration-runtime show \
--resource-group rg-migration \
--factory-name adf-migration-prod \
--name shir-onprem-agent \
--query '{state:properties.state, version:properties.version, autoUpdate:properties.autoUpdate}'
# Jesli SHIR jest w stanie "NeedRegistration" - zarejestruj ponownie
# 1. Pobierz nowy klucz z portalu lub CLI:
az datafactory integration-runtime list-auth-key \
--resource-group rg-migration \
--factory-name adf-migration-prod \
--name shir-onprem-agent \
--query 'authKey1' -o tsv
# 2. Na maszynie SHIR - zarejestruj z nowym kluczem
& "C:\Program Files\Microsoft Integration Runtime\5.0\Shared\dmgcmd.exe" `
-RegisterNewNode "IR@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@adf-migration-prod@ServiceEndpoint=https://westeurope.svc.datafactory.azure.net/"
# 3. Przetestuj polaczenie z SQL Server przez SHIR
& "C:\Program Files\Microsoft Integration Runtime\5.0\Shared\dmgcmd.exe" `
-TestConnection "Data Source=192.168.1.50,1433;Initial Catalog=SourceDB;User ID=dms_migration_user;Password=***;Encrypt=False;TrustServerCertificate=True"
D) Rozwiązywanie problemów DNS i danych uwierzytelniających:
# Sprawdz rozwiazywanie DNS z poziomu SHIR lub VM w subnecie DMS
nslookup sql-source.corp.local
# Jesli nie rozwiazuje - dodaj wpis w Private DNS Zone lub hosts
# Sprawdz czy Private DNS Zone jest zlinkowana do VNetu DMS
az network private-dns zone list \
--query "[].{name:name, vnetLinks:numberOfVirtualNetworkLinks}" -o table
az network private-dns link vnet list \
--resource-group rg-dns \
--zone-name corp.local \
--query "[].{name:name, vnetId:virtualNetwork.id, registrationEnabled:registrationEnabled}" -o table
# Jesli brakuje linka - dodaj VNet DMS do Private DNS Zone
az network private-dns link vnet create \
--resource-group rg-dns \
--zone-name corp.local \
--name link-vnet-migration \
--virtual-network /subscriptions/<sub-id>/resourceGroups/rg-network/providers/Microsoft.Network/virtualNetworks/vnet-migration \
--registration-enabled false
# Weryfikacja danych uwierzytelniajacych - proba polaczenia z SQL Server
# Na maszynie SHIR lub dowolnej maszynie w sieci:
Invoke-Sqlcmd -ServerInstance "192.168.1.50,1433" `
-Database "SourceDB" `
-Username "dms_migration_user" `
-Password "CurrentPassword123!" `
-Query "SELECT 1 AS connectivity_test" `
-TrustServerCertificate
# Jesli login fails - zresetuj haslo na zrodlowym SQL Server
Invoke-Sqlcmd -ServerInstance "192.168.1.50,1433" `
-Database "master" `
-Username "sa" `
-Password "SaPassword!" `
-Query "ALTER LOGIN dms_migration_user WITH PASSWORD = 'NewSecurePassword456!';" `
-TrustServerCertificate
# Upewnij sie ze uzytkownik ma wymagane uprawnienia DMS
Invoke-Sqlcmd -ServerInstance "192.168.1.50,1433" `
-Database "master" `
-Username "sa" `
-Password "SaPassword!" `
-Query @"
GRANT VIEW SERVER STATE TO [dms_migration_user];
USE [SourceDB];
EXEC sp_addrolemember 'db_datareader', 'dms_migration_user';
GRANT VIEW DATABASE STATE TO [dms_migration_user];
"@ `
-TrustServerCertificate
Po naprawie przyczyny - zaktualizuj connection string w DMS project i uruchom task ponownie:
# Ponowne uruchomienie taska migracji po naprawie polaczenia
az dms project task restart \
--resource-group rg-migration \
--service-name dms-prod-westeurope \
--project-name sql-to-azure-project \
--name full-migration-task
Walidacja
# 1. Test polaczenia sieciowego z subnetu DMS (z VM diagnostycznej lub SHIR)
# Na maszynie w subnecie DMS:
Test-NetConnection -ComputerName 192.168.1.50 -Port 1433
# Expected: TcpTestSucceeded = True
# 2. Sprawdz status taska DMS po ponownym uruchomieniu
az dms project task show \
--resource-group rg-migration \
--service-name dms-prod-westeurope \
--project-name sql-to-azure-project \
--name full-migration-task \
--query '{state:properties.state, migrationType:properties.taskType}' -o json
# Expected: state = "Running" lub "Succeeded"
# 3. Sprawdz postep migracji (liczba zmigrowanych tabel)
az dms project task show \
--resource-group rg-migration \
--service-name dms-prod-westeurope \
--project-name sql-to-azure-project \
--name full-migration-task \
--query 'properties.output[?resultType==`MigrationLevelOutput`].{status:migrationState, startedOn:startedOn, tables:summary.tableCount}' \
-o table
# Expected: migrationState = "MIGRATION_IN_PROGRESS" lub "MIGRATION_COMPLETED"
# 4. Weryfikacja SHIR connectivity
az datafactory integration-runtime show \
--resource-group rg-migration \
--factory-name adf-migration-prod \
--name shir-onprem-agent \
--query 'properties.state' -o tsv
# Expected: "Online"
# 5. Weryfikacja ze dane plyna do Azure SQL Database
az sql db show \
--resource-group rg-azure-sql \
--server sql-target-prod \
--name TargetDB \
--query '{status:status, currentSku:currentSku.name, size:maxSizeBytes}' -o json
Jeśli task DMS jest w stanie „Running” lub „Succeeded”, połączenie sieciowe działa (TcpTestSucceeded = True), a SHIR jest „Online” - problem jest rozwiązany. Monitoruj postęp migracji do zakończenia transferu wszystkich tabel.
Migracja SQL Server do Azure nie idzie zgodnie z planem?
Umów bezpłatną 30-minutową rozmowę. Przejrzymy konfigurację DMS, sieć i Integration Runtime, aby odblokować migrację i dotrzymać terminu cutover.