MySQL'i PowerShell ve Azure Veritabanı Geçiş Hizmeti ile çevrimdışı MySQL için Azure Veritabanı geçirme
Bu makalede, Microsoft Azure PowerShell aracılığıyla Azure Veritabanı Geçiş Hizmeti çevrimdışı geçiş özelliğini kullanarak şirket içi örneğe geri yüklenen bir MySQL veritabanını MySQL için Azure Veritabanı geçirebilirsiniz. Makale, MySQL veritabanının Azure'a çevrimdışı geçişini gerçekleştirmek için sırayla yürütülebilen bir PowerShell betikleri koleksiyonunu belgelemektedir. Bu öğreticide açıklanan PowerShell betiğinin tamamını GitHub depomuzdan indirebilirsiniz.
Not
Şu anda Az.DataMigration modülünü kullanarak tam veritabanı geçişi çalıştırmak mümkün değildir. Bu arada, örnek PowerShell betiği DMS REST API'sini kullanan ve geçişi otomatikleştirmenizi sağlayan "olduğu gibi" sağlanır. Bu betik, Az.DataMigration modülüne ve Azure CLI'ye resmi destek eklendikten sonra değiştirilir veya kullanımdan kaldırılır.
MySQL için Amazon relational Database Service (RDS) ve Amazon Aurora (MySQL tabanlı) da geçiş için kaynak olarak desteklenir.
Önemli
Çevrimiçi geçişler için myDumper/MyLoader gibi açık kaynak araçları veri içi çoğaltma ile kullanabilirsiniz.
Makale, kaynak ve hedef veritabanı adlarının aynı veya farklı olabileceği senaryoyu otomatikleştirmeye yardımcı olur ve geçişin bir parçası olarak hedef veritabanındaki tabloların tümünün veya birkaçının aynı ada ve tablo yapısına sahip geçirilmesi gerekir. Makalelerde kaynağın bir MySQL veritabanı örneği ve hedefin MySQL için Azure Veritabanı olduğu varsayılsa da, yalnızca kaynak sunucu adı ve kimlik bilgileri değiştirilerek bir MySQL için Azure Veritabanı diğerine geçiş yapmak için kullanılabilir. Ayrıca, düşük sürüm MySQL sunucularından (v5.6 ve üzeri) daha yüksek sürümlere geçiş de desteklenir.
Önemli
DMS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "kullanılabilir" olarak sağlanır ve hizmet düzeyi sözleşmelerinin ve sınırlı garantinin dışında tutulur. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için bkz . Microsoft Azure önizlemeleri için ek kullanım koşulları.
Bu makalede şunları öğreneceksiniz:
- Veritabanı şemasını geçirme.
- Kaynak grubu oluşturun.
- Azure Veritabanı Geçiş Hizmeti örneği oluşturma.
- Azure Veritabanı Geçiş Hizmeti örneğinde geçiş projesi oluşturma.
- Geçiş projesini MySQL için çevrimdışı geçiş özelliğini kullanacak şekilde yapılandırın.
- Geçişi çalıştırma.
Önkoşullar
Bu adımları tamamlamak için şunlar gerekir:
Etkin bir aboneliği olan bir Azure hesabınız olmalıdır. Ücretsiz hesap oluşturun.
5.6 veya üzeri sürüme sahip bir şirket içi MySQL veritabanınız var. Aksi takdirde MySQL community edition 5.6 veya üstünü indirip yükleyin.
MySQL için Azure Veritabanı örneği oluşturma. Workbench uygulamasını kullanarak veritabanı bağlama ve oluşturma hakkında ayrıntılı bilgi için MySQL Workbench'i kullanarak bağlanma ve verileri sorgulama makalesine bakın. MySQL için Azure Veritabanı sürümü, şirket içi MySQL sürümüne eşit veya daha yüksek olmalıdır. Örneğin, MySQL 5.7 MySQL için Azure Veritabanı 5.7'ye geçirilebilir veya 8'e yükseltilebilir.
ExpressRoute veya VPN kullanarak şirket içi kaynak sunucularınıza siteden siteye bağlantı sağlayan Azure Resource Manager dağıtım modelini kullanarak Azure Veritabanı Geçiş Hizmeti için bir Microsoft Azure Sanal Ağ oluşturun. Sanal ağ oluşturma hakkında daha fazla bilgi için Sanal Ağ Belgeleri'ne ve özellikle adım adım ayrıntıları içeren hızlı başlangıç makalelerine bakın.
Not
Sanal ağNet kurulumu sırasında ExpressRoute'u Microsoft'a ağ eşlemesi ile kullanırsanız, hizmetin sağlanacağı alt ağa Microsoft.Sql hizmet uç noktasını ekleyin. Azure Veritabanı Geçiş Hizmeti'nin İnternet bağlantısı olmadığından bu yapılandırma gereklidir.
Sanal ağ Ağ Güvenlik Grubu kurallarınızın Depolama ve AzureMonitor için ServiceTag'in 443 numaralı giden bağlantı noktasını engellemediğinden emin olun. Sanal ağ NSG trafiğini filtreleme hakkında ayrıntılı bilgi için Ağ güvenlik grupları ile ağ trafiğini filtreleme makalesine bakın.
Azure Veritabanı Geçiş Hizmeti için Sanal Ağ bağlantılarının varsayılan olarak TCP bağlantı noktası 3306 olan kaynak MySQL Sunucusu'na erişmesine izin vermek için Windows güvenlik duvarınızı açın.
Kaynak veritabanlarınızın önünde bir güvenlik duvarı gereci kullanırken, Azure Veritabanı Geçiş Hizmeti geçiş için kaynak veritabanlarına erişmesi için Sanal Ağ bağlantılarına izin vermek üzere güvenlik duvarı kuralları eklemeniz gerekebilir.
Hedef veritabanlarına Azure Veritabanı Geçiş Hizmeti erişim için Sanal Ağ izin vermek üzere sunucu düzeyinde bir güvenlik duvarı kuralı oluşturun veya hedef MySQL için Azure Veritabanı için sanal ağ hizmet uç noktalarını yapılandırın.
Kaynak MySQL'in desteklenen MySQL Community Edition sürümünde olması gerekir. MySQL örneğinin sürümünü belirlemek için, MySQL yardımcı programında veya MySQL Workbench'te şu komutu çalıştırın:
SELECT @@VERSION;
MySQL için Azure Veritabanı yalnızca InnoDB tablolarını destekler. MyISAM tablolarını InnoDB'ye dönüştürmek için Converting Tables from MyISAM to InnoDB (Tabloları MyISAM'dan InnoDB'ye Dönüştürme) başlıklı makaleye bakın
Kullanıcının kaynak veritabanındaki verileri okuma ayrıcalıklarına sahip olması gerekir.
Kılavuz, yükleme kılavuzuna göre yüklenebilen PowerShell v7.2'yi kullanır
Install-Module PowerShell cmdlet'ini kullanarak aşağıdaki modülleri PowerShell Galerisi indirip yükleyin; Yönetici olarak çalıştır komutunu kullanarak PowerShell komut penceresini açtığınızdan emin olun:
Az.Resources
Az.Network
Az.DataMigration
Install-Module Az.Resources Install-Module Az.Network Install-Module Az.DataMigration Import-Module Az.Resources Import-Module Az.Network Import-Module Az.DataMigration
Veritabanı şemasını geçirme
Tablo şemaları, dizinler ve saklı yordamlar gibi tüm veritabanı nesnelerini aktarmak için kaynak veritabanından şema ayıklamamız ve hedef veritabanına uygulamamız gerekir. Şemayı ayıklamak için --no-data
parametresiyle mysqldump yardımcı programını kullanabilirsiniz. Bunun için hem kaynak MySQL veritabanına hem de hedef MySQL için Azure Veritabanı bağlanabilen bir makineye ihtiyacınız vardır.
şemayı mysqldump kullanarak dışarı aktarmak için aşağıdaki komutu çalıştırın:
mysqldump -h [servername] -u [username] -p[password] --databases [db name] --no-data > [schema file path]
Örneğin:
mysqldump -h 10.10.123.123 -u root -p --databases migtestdb --no-data > d:\migtestdb.sql
Şemayı hedef MySQL için Azure Veritabanı aktarmak için aşağıdaki komutu çalıştırın:
mysql.exe -h [servername] -u [username] -p[password] [database]< [schema file path]
Örneğin:
mysql.exe -h mysqlsstrgt.mysql.database.azure.com -u docadmin@mysqlsstrgt -p migtestdb < d:\migtestdb.sql
Şemanızda yabancı anahtarlar varsa, geçiş sırasında paralel veri yükü geçiş görevi tarafından işlenir. Şema geçişi sırasında yabancı anahtarları bırakmanız gerekmez.
Veritabanında tetikleyicileriniz varsa, kaynaktan tam veri geçişi öncesinde hedefte veri bütünlüğünü zorlar. Geçiş sırasında hedefteki tüm tablolarda tetikleyicileri devre dışı bırakmak ve geçiş tamamlandıktan sonra tetikleyicileri etkinleştirmek önerilir.
Bırakma tetikleyicisi betiğini ayıklamak ve tetikleyici betiği eklemek için hedef veritabanında MySQL Workbench'te aşağıdaki betiği yürütün.
SELECT
SchemaName,
GROUP_CONCAT(DropQuery SEPARATOR ';\n') as DropQuery,
CONCAT('DELIMITER $$ \n\n', GROUP_CONCAT(AddQuery SEPARATOR '$$\n'), '$$\n\nDELIMITER ;') as AddQuery
FROM
(
SELECT
TRIGGER_SCHEMA as SchemaName,
CONCAT('DROP TRIGGER `', TRIGGER_NAME, "`") as DropQuery,
CONCAT('CREATE TRIGGER `', TRIGGER_NAME, '` ', ACTION_TIMING, ' ', EVENT_MANIPULATION,
'\nON `', EVENT_OBJECT_TABLE, '`\n' , 'FOR EACH ', ACTION_ORIENTATION, ' ',
ACTION_STATEMENT) as AddQuery
FROM
INFORMATION_SCHEMA.TRIGGERS
ORDER BY EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION, ACTION_ORDER ASC
) AS Queries
GROUP BY SchemaName;
Hedef veritabanında tetikleyicileri bırakmak için sonuçta oluşturulan bırakma tetikleyicisi sorgusunu (DropQuery sütunu) çalıştırın. Tetikleyici ekleme sorgusu, veri geçişi tamamlandıktan sonra kullanılmak üzere kaydedilebilir.
Microsoft Azure aboneliğinizde oturum açın
Azure PowerShell ile oturum açma makalesindeki yönergelere göre PowerShell kullanarak Azure aboneliğinizde oturum açmak için Connect-AzAccount PowerShell komutunu kullanın.
Aşağıdaki betik, oturum açma sonrasında PowerShell oturumu için varsayılan aboneliği ayarlar ve biçimlendirilmiş konsol günlükleri için bir yardımcı günlük işlevi oluşturur.
[string] $SubscriptionName = "mySubscription"
$ErrorActionPreference = "Stop";
Connect-AzAccount
Set-AzContext -Subscription $SubscriptionName
$global:currentSubscriptionId = (Get-AzContext).Subscription.Id;
function LogMessage([string] $Message, [bool] $IsProcessing = $false) {
if ($IsProcessing) {
Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss"): $Message" -ForegroundColor Yellow
}
else {
Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss"): $Message" -ForegroundColor Green
}
}
Microsoft.DataMigration kaynak sağlayıcısını kaydetme
Kaynak sağlayıcısı kaydının her Azure aboneliğinde yalnızca bir kez yapılması gerekir. Kayıt olmadan bir Azure Veritabanı Geçiş Hizmeti örneği oluşturamazsınız.
Register-AzResourceProvider komutunu kullanarak kaynak sağlayıcısını kaydedin. Aşağıdaki betik, Azure Veritabanı Geçiş Hizmeti için gereken kaynak sağlayıcısını kaydeder
Register-AzResourceProvider -ProviderNamespace Microsoft.DataMigration
Kaynak grubu oluşturma
Azure kaynak grubu, Azure kaynaklarının dağıtıldığı ve yönetildiği bir mantıksal kapsayıcıdır. DMS kaynaklarını oluşturmadan önce bir kaynak grubu oluşturun.
New-AzResourceGroup komutunu kullanarak bir kaynak grubu oluşturun.
Aşağıdaki örnek, batı ABD 2 bölgesinde mySubscription varsayılan aboneliği altında myResourceGroup adlı bir kaynak grubu oluşturur.
# Get the details of resource group
[string] $Location = "westus2"
[string] $ResourceGroupName = "myResourceGroup"
$resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName
if (-not($resourceGroup)) {
LogMessage -Message "Creating resource group $ResourceGroupName..." -IsProcessing $true
$resourceGroup = New-AzResourceGroup -Name $ResourceGroupName -Location $Location
LogMessage -Message "Created resource group - $($resourceGroup.ResourceId)."
}
else { LogMessage -Message "Resource group $ResourceGroupName exists." }
Azure Veritabanı Geçiş Hizmeti'nin örneğini oluşturma
New-AzDataMigrationService komutunu kullanarak yeni Azure Veritabanı Geçiş Hizmeti örneği oluşturabilirsiniz. Bu komut aşağıdaki gerekli parametreleri bekler:
Azure Kaynak Grubu adı. Daha önce gösterildiği gibi Azure Kaynak grubu oluşturmak ve adını parametre olarak sağlamak için New-AzResourceGroup komutunu kullanabilirsiniz.
Hizmet adı. Azure Veritabanı Geçiş Hizmeti için istenen benzersiz hizmet adına karşılık gelen dize
Konum. Hizmetin konumunu belirtir. Batı ABD veya Güneydoğu Asya gibi bir Azure veri merkezi konumu belirtin
Sku. Bu parametre DMS Sku adına karşılık gelir. Şu anda desteklenen Sku adı Standard_1vCore, Standard_2vCores, Standard_4vCores Premium_4vCores.
Sanal Alt Ağ Tanımlayıcısı. Alt ağın bilgilerini almak için Get-AzVirtualNetworkSubnetConfig komutunu kullanabilirsiniz.
Aşağıdaki betik, myVirtualNetwork sanal ağının default adlı bir alt ağ ile mevcut olmasını ve ardından 3. Adımda ve aynı bölgede oluşturulan kaynak grubunun altında myDmService adlı bir Veritabanı Geçiş Hizmeti oluşturmasını bekler.
# Get a reference to the DMS service - Create if not exists
[string] $VirtualNetworkName = "myVirtualNetwork"
[string] $SubnetName = "default"
[string] $ServiceName = "myDmService"
$dmsServiceResourceId = "/subscriptions/$($global:currentSubscriptionId)/resourceGroups/$ResourceGroupName/providers/Microsoft.DataMigration/services/$ServiceName"
$dmsService = Get-AzResource -ResourceId $dmsServiceResourceId -ErrorAction SilentlyContinue
# Create Azure DMS service if not existing
# Possible values for SKU currently are Standard_1vCore,Standard_2vCores,Standard_4vCores,Premium_4vCores
if (-not($dmsService)) {
$virtualNetwork = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VirtualNetworkName
if (-not ($virtualNetwork)) { throw "ERROR: Virtual Network $VirtualNetworkName does not exists" }
$subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $virtualNetwork -Name $SubnetName
if (-not ($subnet)) { throw "ERROR: Virtual Network $VirtualNetworkName does not contains Subnet $SubnetName" }
LogMessage -Message "Creating Azure Data Migration Service $ServiceName..." -IsProcessing $true
$dmsService = New-AzDataMigrationService `
-ResourceGroupName $ResourceGroupName `
-Name $ServiceName `
-Location $resourceGroup.Location `
-Sku Premium_4vCores `
-VirtualSubnetId $Subnet.Id
$dmsService = Get-AzResource -ResourceId $dmsServiceResourceId
LogMessage -Message "Created Azure Data Migration Service - $($dmsService.ResourceId)."
}
else { LogMessage -Message "Azure Data Migration Service $ServiceName exists." }
Geçiş projesi oluşturma
Azure Veritabanı Geçiş Hizmeti örneği oluşturduktan sonra bir geçiş projesi oluşturacaksınız. Geçiş projesi, yapılması gereken geçiş türünü belirtir.
Aşağıdaki betik, MySQL'den 4. Adımda ve aynı bölgede oluşturulan Veritabanı Geçiş Hizmeti örneği altında MySQL için Azure Veritabanı çevrimdışı geçiş için myfirstmysqlofflineproject adlı bir geçiş projesi oluşturur.
# Get a reference to the DMS project - Create if not exists
[string] $ProjectName = "myfirstmysqlofflineproject"
$dmsProjectResourceId = "/subscriptions/$($global:currentSubscriptionId)/resourceGroups/$($dmsService.ResourceGroupName)/providers/Microsoft.DataMigration/services/$($dmsService.Name)/projects/$projectName"
$dmsProject = Get-AzResource -ResourceId $dmsProjectResourceId -ErrorAction SilentlyContinue
# Create Azure DMS Project if not existing
if (-not($dmsProject)) {
LogMessage -Message "Creating Azure DMS project $projectName for MySQL migration ..." -IsProcessing $true
$newProjectProperties = @{"sourcePlatform" = "MySQL"; "targetPlatform" = "AzureDbForMySQL" }
$dmsProject = New-AzResource `
-ApiVersion 2018-03-31-preview `
-Location $dmsService.Location `
-ResourceId $dmsProjectResourceId `
-Properties $newProjectProperties `
-Force
LogMessage -Message "Created Azure DMS project $projectName - $($dmsProject.ResourceId)."
}
else { LogMessage -Message "Azure DMS project $projectName exists." }
Kaynak ve hedef bağlantılar için Veritabanı Bağlantı Bilgileri nesnesi oluşturma
Geçiş projesini oluşturduktan sonra veritabanı bağlantı bilgilerini oluşturacaksınız. Bu bağlantı bilgileri, geçiş işlemi sırasında kaynak ve hedef sunuculara bağlanmak için kullanılır.
Aşağıdaki betik, kaynak için sunucu adını, kullanıcı adını ve parolayı alır ve MySQL örneklerini hedefler ve bağlantı bilgileri nesnelerini oluşturur. Betik, kullanıcıdan kaynak ve hedef MySQL örneklerinin parolasını girmesini ister. Sessiz betikler için kimlik bilgileri Azure Key Vault'tan getirilebilir.
# Initialize the source and target database server connections
[string] $SourceServerName = "13.66.136.192"
[string] $SourceUserName = "docadmin@mysqlserver"
[securestring] $SourcePassword = Read-Host "Enter MySQL Source Server Password" -AsSecureString
[string] $TargetServerName = "migdocdevwus2mysqlsstrgt.mysql.database.azure.com"
[string] $TargetUserName = "docadmin@migdocdevwus2mysqlsstrgt"
[securestring] $TargetPassword = Read-Host "Enter MySQL Target Server Password" -AsSecureString
function InitConnection(
[string] $ServerName,
[string] $UserName,
[securestring] $Password) {
$connectionInfo = @{
"dataSource" = "";
"serverName" = "";
"port" = 3306;
"userName" = "";
"password" = "";
"authentication" = "SqlAuthentication";
"encryptConnection" = $true;
"trustServerCertificate" = $true;
"additionalSettings" = "";
"type" = "MySqlConnectionInfo"
}
$connectionInfo.dataSource = $ServerName;
$connectionInfo.serverName = $ServerName;
$connectionInfo.userName = $UserName;
$connectionInfo.password = (ConvertFrom-SecureString -AsPlainText $password).ToString();
$connectionInfo;
}
# Initialize the source and target connections
LogMessage -Message "Initializing source and target connection objects ..." -IsProcessing $true
$sourceConnInfo = InitConnection `
$SourceServerName `
$SourceUserName `
$SourcePassword;
$targetConnInfo = InitConnection `
$TargetServerName `
$TargetUserName `
$TargetPassword;
LogMessage -Message "Source and target connection object initialization complete."
Hedef veritabanından tablo adlarının listesini ayıklama
Veritabanı tablo listesi, geçiş görevi ve bağlantı bilgileri kullanılarak ayıklanabilir. Doğru eşleme ve doğrulamanın yapılabilmesi için tablo listesi hem kaynak veritabanından hem de hedef veritabanından ayıklanır.
Aşağıdaki betik, kaynak ve hedef veritabanlarının adlarını alır ve sonra GetUserTablesMySql geçiş görevini kullanarak tablo listesini veritabanlarından ayıklar.
# Run scenario to get the tables from the target database to build
# the migration table mapping
[string] $TargetDatabaseName = "migtargetdb"
[string] $SourceDatabaseName = "migsourcedb"
function RunScenario([object] $MigrationService,
[object] $MigrationProject,
[string] $ScenarioTaskName,
[object] $TaskProperties,
[bool] $WaitForScenario = $true) {
# Check if the scenario task already exists, if so remove it
LogMessage -Message "Removing scenario if already exists..." -IsProcessing $true
Remove-AzDataMigrationTask `
-ResourceGroupName $MigrationService.ResourceGroupName `
-ServiceName $MigrationService.Name `
-ProjectName $MigrationProject.Name `
-TaskName $ScenarioTaskName `
-Force;
# Start the new scenario task using the provided properties
LogMessage -Message "Initializing scenario..." -IsProcessing $true
New-AzResource `
-ApiVersion 2018-03-31-preview `
-Location $MigrationService.Location `
-ResourceId "/subscriptions/$($global:currentSubscriptionId)/resourceGroups/$($MigrationService.ResourceGroupName)/providers/Microsoft.DataMigration/services/$($MigrationService.Name)/projects/$($MigrationProject.Name)/tasks/$($ScenarioTaskName)" `
-Properties $TaskProperties `
-Force | Out-Null;
LogMessage -Message "Waiting for $ScenarioTaskName scenario to complete..." -IsProcessing $true
if ($WaitForScenario) {
$progressCounter = 0;
do {
if ($null -ne $scenarioTask) {
Start-Sleep 10;
}
# Get calls can time out and will return a cancellation exception in that case
$scenarioTask = Get-AzDataMigrationTask `
-ResourceGroupName $MigrationService.ResourceGroupName `
-ServiceName $MigrationService.Name `
-ProjectName $MigrationProject.Name `
-TaskName $ScenarioTaskName `
-Expand `
-ErrorAction Ignore;
Write-Progress -Activity "Scenario Run $ScenarioTaskName (Marquee Progress Bar)" `
-Status $scenarioTask.ProjectTask.Properties.State `
-PercentComplete $progressCounter
$progressCounter += 10;
if ($progressCounter -gt 100) { $progressCounter = 10 }
}
while (($null -eq $scenarioTask) -or ($scenarioTask.ProjectTask.Properties.State -eq "Running") -or ($scenarioTask.ProjectTask.Properties.State -eq "Queued"))
}
Write-Progress -Activity "Scenario Run $ScenarioTaskName" `
-Status $scenarioTask.ProjectTask.Properties.State `
-Completed
# Now get it using REST APIs so we can expand the output
LogMessage -Message "Getting expanded task results ..." -IsProcessing $true
$psToken = (Get-AzAccessToken -ResourceUrl https://management.azure.com).Token;
$token = ConvertTo-SecureString -String $psToken -AsPlainText -Force;
$taskResource = Invoke-RestMethod `
-Method GET `
-Uri "https://management.azure.com$($scenarioTask.ProjectTask.Id)?api-version=2018-03-31-preview&`$expand=output" `
-ContentType "application/json" `
-Authentication Bearer `
-Token $token;
$taskResource.properties;
}
# create the get table task properties by initializing the connection and
# database name
$getTablesTaskProperties = @{
"input" = @{
"connectionInfo" = $null;
"selectedDatabases" = $null;
};
"taskType" = "GetUserTablesMySql";
};
LogMessage -Message "Running scenario to get the list of tables from the target database..." -IsProcessing $true
$getTablesTaskProperties.input.connectionInfo = $targetConnInfo;
$getTablesTaskProperties.input.selectedDatabases = @($TargetDatabaseName);
# Create a name for the task
$getTableTaskName = "$($TargetDatabaseName)GetUserTables"
# Get the list of tables from the source
$getTargetTablesTask = RunScenario -MigrationService $dmsService `
-MigrationProject $dmsProject `
-ScenarioTaskName $getTableTaskName `
-TaskProperties $getTablesTaskProperties;
if (-not ($getTargetTablesTask)) { throw "ERROR: Could not get target database $TargetDatabaseName table information." }
LogMessage -Message "List of tables from the target database acquired."
LogMessage -Message "Running scenario to get the list of tables from the source database..." -IsProcessing $true
$getTablesTaskProperties.input.connectionInfo = $sourceConnInfo;
$getTablesTaskProperties.input.selectedDatabases = @($SourceDatabaseName);
# Create a name for the task
$getTableTaskName = "$($SourceDatabaseName)GetUserTables"
# Get the list of tables from the source
$getSourceTablesTask = RunScenario -MigrationService $dmsService `
-MigrationProject $dmsProject `
-ScenarioTaskName $getTableTaskName `
-TaskProperties $getTablesTaskProperties;
if (-not ($getSourceTablesTask)) { throw "ERROR: Could not get source database $SourceDatabaseName table information." }
LogMessage -Message "List of tables from the source database acquired."
Kullanıcı yapılandırmasına göre tablo eşlemesi oluşturma
Geçiş görevini yapılandırmanın bir parçası olarak, kaynak ve hedef tablolar arasında bir eşleme oluşturacaksınız. Eşleme tablo adı düzeyindedir, ancak eşlenen tabloların tablo yapısının (sütun sayısı, sütun adları, veri türleri vb.) tamamen aynı olduğu varsayımı yer alır.
Aşağıdaki betik, 7. Adımda ayıklanan hedef ve kaynak tablo listesini temel alan bir eşleme oluşturur. Kısmi veri yükü için, kullanıcı tabloları filtrelemek için bir tablo listesi sağlayabilir. Kullanıcı girişi sağlanmazsa tüm hedef tablolar eşlenir. Betik, kaynakta aynı ada sahip bir tablo olup olmadığını da denetler. Kaynakta tablo adı yoksa, hedef tablo geçiş için yoksayılır.
# Create the source to target table map
# Optional table settings
# DEFAULT: $IncludeTables = $null => include all tables for migration
# DEFAULT: $ExcludeTables = $null => exclude no tables from migration
# Exclude list has higher priority than include list
# Array of qualified source table names which should be migrated
[string[]] $IncludeTables = @("migsourcedb.coupons", "migsourcedb.daily_cash_sheets");
[string[]] $ExcludeTables = $null;
LogMessage -Message "Creating the table map based on the user input and database table information ..." `
-IsProcessing $true
$targetTables = $getTargetTablesTask.Output.DatabasesToTables."$TargetDatabaseName";
$sourceTables = $getSourceTablesTask.Output.DatabasesToTables."$SourceDatabaseName";
$tableMap = New-Object 'system.collections.generic.dictionary[string,string]';
$schemaPrefixLength = $($SourceDatabaseName + ".").Length;
$tableMappingError = $false
foreach ($srcTable in $sourceTables) {
# Removing the database name prefix from the table name so that comparison
# can be done in cases where database name given are different
$tableName = $srcTable.Name.Substring($schemaPrefixLength, `
$srcTable.Name.Length - $schemaPrefixLength)
# In case the table is part of exclusion list then ignore the table
if ($null -ne $ExcludeTables -and $ExcludeTables -contains $srcTable.Name) {
continue;
}
# Either the include list is null or the table is part of the include list then add it in the mapping
if ($null -eq $IncludeTables -or $IncludeTables -contains $srcTable.Name) {
# Check if the table exists in the target. If not then log TABLE MAPPING ERROR
if (-not ($targetTables | Where-Object { $_.name -ieq "$($TargetDatabaseName).$tableName" })) {
$tableMappingError = $true
Write-Host "TABLE MAPPING ERROR: $($targetTables.name) does not exists in target." -ForegroundColor Red
continue;
}
$tableMap.Add("$($SourceDatabaseName).$tableName", "$($TargetDatabaseName).$tableName");
}
}
# In case of any table mapping errors identified, throw an error and stop the process
if ($tableMappingError) { throw "ERROR: One or more table mapping errors were identified. Please see previous messages." }
# In case no tables are in the mapping then throw error
if ($tableMap.Count -le 0) { throw "ERROR: Could not create table mapping." }
LogMessage -Message "Migration table mapping created for $($tableMap.Count) tables."
Geçiş görevi girişlerini oluşturma ve yapılandırma
Tablo eşlemesini oluşturduktan sonra Migration.MySql.AzureDbForMySql türünde geçiş görevi için girişler oluşturacak ve özellikleri yapılandıracaksınız.
Aşağıdaki betik geçiş görevini oluşturur ve bağlantıları, veritabanı adlarını ve tablo eşlemesini ayarlar.
# Create and configure the migration scenario based on the connections
# and the table mapping
$offlineMigTaskProperties = @{
"input" = @{
"sourceConnectionInfo" = $null;
"targetConnectionInfo" = $null;
"selectedDatabases" = $null;
"optionalAgentSettings" = @{
"EnableCacheBatchesInMemory" = $true;
"DisableIncrementalRowStatusUpdates" = $true;
};
"startedOn" = $null;
};
"taskType" = "Migrate.MySql.AzureDbForMySql";
};
$offlineSelectedDatabase = @{
"name" = $null;
"targetDatabaseName" = $null;
"tableMap" = $null;
};
LogMessage -Message "Preparing migration scenario configuration ..." -IsProcessing $true
# Select the database to be migrated
$offlineSelectedDatabase.name = $SourceDatabaseName;
$offlineSelectedDatabase.tableMap = New-Object PSObject -Property $tableMap;
$offlineSelectedDatabase.targetDatabaseName = $TargetDatabaseName;
# Set connection info and the database mapping
$offlineMigTaskProperties.input.sourceConnectionInfo = $sourceConnInfo;
$offlineMigTaskProperties.input.targetConnectionInfo = $targetConnInfo;
$offlineMigTaskProperties.input.selectedDatabases = @($offlineSelectedDatabase);
$offlineMigTaskProperties.input.startedOn = [System.DateTimeOffset]::UtcNow.ToString("O");
Performans ayarlama parametrelerini yapılandırma
PowerShell modülünün bir parçası olarak, ortama göre ayarlanabilen birkaç isteğe bağlı parametre vardır. Bu parametreler, geçiş görevinin performansını geliştirmek için kullanılabilir. Tüm bu parametreler isteğe bağlıdır ve varsayılan değerleri olur NULL
.
Aşağıdaki performans yapılandırmaları, Premium SKU'da geçiş sırasında daha yüksek aktarım hızı göstermiştir.
WriteDataRangeBatchTaskCount = 12
DelayProgressUpdatesInStorageInterval = 30 saniye
ThrottleQueryTableDataRangeTaskAtBatchCount = 36
Aşağıdaki betik, parametrelerin kullanıcı değerlerini alır ve geçiş görevi özelliklerindeki parametreleri ayarlar.
# Setting optional parameters from fine tuning the data transfer rate during migration
# DEFAULT values for all the configurations is $null
LogMessage -Message "Adding optional migration performance tuning configuration ..." -IsProcessing $true
# Partitioning settings
# Optional setting that configures the maximum number of parallel reads on tables located on the source database.
[object] $DesiredRangesCount = 4
# Optional setting that configures that size of the largest batch that will be committed to the target server.
[object] $MaxBatchSizeKb = 4096
# Optional setting that configures the minimum number of rows in each batch written to the target.
[object] $MinBatchRows = $null
# Task count settings
# Optional setting that configures the number of databases that will be prepared for migration in parallel.
[object] $PrepareDatabaseForBulkImportTaskCount = $null
# Optional setting that configures the number of tables that will be prepared for migration in parallel.
[object] $PrepareTableForBulkImportTaskCount = $null
# Optional setting that configures the number of threads available to read ranges on the source.
[object] $QueryTableDataRangeTaskCount = 8
# Optional setting that configures the number of threads available to write batches to the target.
[object] $WriteDataRangeBatchTaskCount = 12
# Batch cache settings
# Optional setting that configures how much memory will be used to cache batches in memory before reads on the source are throttled.
[object] $MaxBatchCacheSizeMb = $null
# Optional setting that configures the amount of available memory at which point reads on the source will be throttled.
[object] $ThrottleQueryTableDataRangeTaskAtAvailableMemoryMb = $null
# Optional setting that configures the number of batches cached in memory that will trigger read throttling on the source.
[object] $ThrottleQueryTableDataRangeTaskAtBatchCount = 36
# Performance settings
# Optional setting that configures the delay between updates of result objects in Azure Table Storage.
[object] $DelayProgressUpdatesInStorageInterval = "00:00:30"
function AddOptionalSetting($optionalAgentSettings, $settingName, $settingValue) {
# If no value specified for the setting, don't bother adding it to the input
if ($null -eq $settingValue) {
return;
}
# Add a new property to the JSON object to capture the setting which will be customized
$optionalAgentSettings | add-member -MemberType NoteProperty -Name $settingName -Value $settingValue
}
# Set any optional settings in the input based on parameters to this cmdlet
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "DesiredRangesCount" $DesiredRangesCount;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "MaxBatchSizeKb" $MaxBatchSizeKb;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "MinBatchRows" $MinBatchRows;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "PrepareDatabaseForBulkImportTaskCount" $PrepareDatabaseForBulkImportTaskCount;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "PrepareTableForBulkImportTaskCount" $PrepareTableForBulkImportTaskCount;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "QueryTableDataRangeTaskCount" $QueryTableDataRangeTaskCount;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "WriteDataRangeBatchTaskCount" $WriteDataRangeBatchTaskCount;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "MaxBatchCacheSizeMb" $MaxBatchCacheSizeMb;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "ThrottleQueryTableDataRangeTaskAtAvailableMemoryMb" $ThrottleQueryTableDataRangeTaskAtAvailableMemoryMb;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "ThrottleQueryTableDataRangeTaskAtBatchCount" $ThrottleQueryTableDataRangeTaskAtBatchCount;
AddOptionalSetting $offlineMigTaskProperties.input.optionalAgentSettings "DelayProgressUpdatesInStorageInterval" $DelayProgressUpdatesInStorageInterval;
Geçiş görevini oluşturma ve çalıştırma
Görev için girişi yapılandırdıktan sonra, şimdi görev aracıda oluşturulur ve yürütülür. Betik, görev yürütmeyi tetikler ve geçişin tamamlanmasını bekler.
Aşağıdaki betik, yapılandırılmış geçiş görevini çağırır ve tamamlanmasını bekler.
# Running the migration scenario
[string] $TaskName = "mysqlofflinemigrate"
LogMessage -Message "Running data migration scenario ..." -IsProcessing $true
$summary = @{
"SourceServer" = $SourceServerName;
"SourceDatabase" = $SourceDatabaseName;
"TargetServer" = $TargetServerName;
"TargetDatabase" = $TargetDatabaseName;
"TableCount" = $tableMap.Count;
"StartedOn" = $offlineMigTaskProperties.input.startedOn;
}
Write-Host "Job Summary:" -ForegroundColor Yellow
Write-Host $(ConvertTo-Json $summary) -ForegroundColor Yellow
$migrationResult = RunScenario -MigrationService $dmsService `
-MigrationProject $dmsProject `
-ScenarioTaskName $TaskName `
-TaskProperties $offlineMigTaskProperties
LogMessage -Message "Migration completed with status - $($migrationResult.state)"
#Checking for any errors or warnings captured by the task during migration
$dbLevelResult = $migrationResult.output | Where-Object { $_.resultType -eq "DatabaseLevelOutput" }
$migrationLevelResult = $migrationResult.output | Where-Object { $_.resultType -eq "MigrationLevelOutput" }
if ($dbLevelResult.exceptionsAndWarnings) {
Write-Host "Following database errors were captured: $($dbLevelResult.exceptionsAndWarnings)" -ForegroundColor Red
}
if ($migrationLevelResult.exceptionsAndWarnings) {
Write-Host "Following migration errors were captured: $($migrationLevelResult.exceptionsAndWarnings)" -ForegroundColor Red
}
if ($migrationResult.errors.details) {
Write-Host "Following task level migration errors were captured: $($migrationResult.errors.details)" -ForegroundColor Red
}
Veritabanı Geçiş Hizmeti silme
Aynı Veritabanı Geçiş Hizmeti birden çok geçiş için kullanılabilir, böylece örnek oluşturulduktan sonra yeniden kullanılabilir. Veritabanı Geçiş Hizmeti kullanmaya devam etmeyecekseniz Remove-AzDataMigrationService komutunu kullanarak hizmeti silebilirsiniz.
Aşağıdaki betik, Azure Veritabanı Geçiş Hizmeti örneğini ve ilişkili projelerini siler.
Remove-AzDataMigrationService -ResourceId $($dmsService.ResourceId)