使用 PowerShell & Azure Database Migration Service 將 SQL Server 離線移轉至 SQL 受控執行個體

在本文中,您將使用 Microsoft Azure PowerShell,將已還原至內部部署 SQL Server 2005 (或更新版本) 執行個體的 Adventureworks2016 資料庫離線移轉至 Azure SQL 受控執行個體。 您可使用 Microsoft Azure PowerShell 中的 Az.DataMigration 模組,將資料庫從 SQL Server 執行個體移轉至 SQL 受控執行個體。

在本文中,您將學會如何:

  • 建立資源群組。
  • 建立 Azure 資料庫移轉服務的執行個體。
  • 在 Azure Database Migration Service 的執行個體中建立移轉專案。
  • 執行離線移轉。

提示

在 Azure Database Migration Service 中,您可在離線或線上時移轉資料庫。 在離線移轉中,當移轉開始時,應用程式即會開始停機。 若要將停機限制於在移轉後完全移轉至新環境所需的時間,請使用線上移轉。 建議您測試離線移轉,以決定停機是否在可接受範圍。 如果無法接受預期的停機,則請執行線上移轉。

本文提供離線移轉的步驟,但也可線上移轉。

必要條件

若要完成這些步驟,您需要:

登入您的 Microsoft Azure 訂用帳戶

使用 PowerShell 登入您的 Azure 訂用帳戶。 如需詳細資訊,請參閱使用 Azure PowerShell 登入一文。

建立資源群組

Azure 資源群組是在其中部署與管理 Azure 資源的邏輯容器。

使用 New-AzResourceGroup 命令建立資源群組。

下列範例會在美國東部區域建立名為 myResourceGroup 的資源群組。

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

建立 Azure 資料庫移轉服務的執行個體

您可以使用 New-AzDataMigrationService Cmdlet,來建立新的 Azure 資料庫移轉服務執行個體。 此 Cmdlet 預期有下列必要參數:

  • Azure 資源群組名稱。 您可使用 New-AzResourceGroup 命令來建立如先前所示的 Azure 資源群組,並提供其名稱作為參數。
  • 服務名稱。 字串會對應至 Azure Database Migration Service 所需的唯一服務名稱。
  • 位置。​​ 指定服務的位置。 指定 Azure 資料中心位置,例如美國西部或東南亞。
  • SKU。 此參數會對應至 DMS SKU 名稱。 目前支援的 SKU 名稱為 Basic_1vCore、Basic_2vCores、GeneralPurpose_4vCores
  • 虛擬子網路識別碼。 您可使用 Cmdlet New-AzVirtualNetworkSubnetConfig 來建立子網路。

下列範例會使用名為 MyVNET 的虛擬網路及名為 MySubnet 的子網路,在位於東部區域的 MyDMSResourceGroup 資源群組中建立名為 MyDMS 的服務。

$vNet = Get-AzVirtualNetwork -ResourceGroupName MyDMSResourceGroup -Name MyVNET

$vSubNet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $vNet -Name MySubnet

$service = New-AzDms -ResourceGroupName myResourceGroup `
  -ServiceName MyDMS `
  -Location EastUS `
  -Sku Basic_2vCores `
  -VirtualSubnetId $vSubNet.Id`

建立移轉專案

建立 Azure 資料庫移轉服務執行個體之後,建立移轉專案。 Azure 資料庫移轉服務專案需要來源和目標執行個體的連線資訊,以及您想要移轉的資料庫清單。

建立來源和目標連線的資料庫連接資訊物件

您可使用 New-AzDmsConnInfo Cmdlet 來建立資料庫連接資訊物件,預期的參數如下所示:

  • ServerType。 要求的資料庫連接類型,例如 SQL、Oracle 或 MySQL。 使用 SQL Server 的 SQL 和 Azure SQL。
  • DataSource。 SQL Server 執行個體或 Azure SQL Database 執行個體的名稱或 IP。
  • AuthType。 連線的驗證類型,可以是 SqlAuthentication 或 WindowsAuthentication。
  • TrustServerCertificate。 此參數會設定一個值,指出通道是否會加密,同時繞過驗證信任的信任鏈結。 值可以為 $true$false

下列範例會使用 SQL 驗證,為名為 MySourceSQLServer 的來源 SQL Server 建立連接資訊物件:

$sourceConnInfo = New-AzDmsConnInfo -ServerType SQL `
  -DataSource MySourceSQLServer `
  -AuthType SqlAuthentication `
  -TrustServerCertificate:$true

下一個範例會示範如何為名為 ‘targetmanagedinstance’ 的 Azure SQL 受控執行個體建立連接資訊:

$targetResourceId = (Get-AzSqlInstance -Name "targetmanagedinstance").Id
$targetConnInfo = New-AzDmsConnInfo -ServerType SQLMI -MiResourceId $targetResourceId

提供移轉專案所用的資料庫

建立 AzDataMigrationDatabaseInfo 物件清單,該清單會指定資料庫作為 Azure Database Migration Service 專案的一部份,並可提供作為參數以供建立專案使用。 您可使用 Cmdlet New-AzDataMigrationDatabaseInfo 來建立 AzDataMigrationDatabaseInfo

下列範例會為 AdventureWorks2016 資料庫建立 AzDataMigrationDatabaseInfo 專案,並將其新增至清單,用於提供作為參數以供專案建立使用。

$dbInfo1 = New-AzDataMigrationDatabaseInfo -SourceDatabaseName AdventureWorks
$dbList = @($dbInfo1)

建立專案物件

最後,您可使用 New-AzDataMigrationProject 建立位於美國東部且名為 MyDMSProject 的 Azure Database Migration Service 專案,並新增先前建立的來源和目標連線及要移轉的資料庫清單。

$project = New-AzDataMigrationProject -ResourceGroupName myResourceGroup `
  -ServiceName $service.Name `
  -ProjectName MyDMSProject `
  -Location EastUS `
  -SourceType SQL `
  -TargetType SQLMI `
  -SourceConnection $sourceConnInfo `
  -TargetConnection $targetConnInfo `
  -DatabaseInfo $dbList

建立並啟動移轉工作

接下來,建立並啟動 Azure Database Migration Service 工作。 此工作需要來源和目標的連線認證資訊,以及要移轉的資料庫清單資料表和已與建立作為必要條件專案一併提供的資訊。

建立來源和目標的認證參數

建立連線安全性認證作為 PSCredential 物件。

下列範例示範如何將密碼提供為 $sourcePassword 和 $targetPassword 字串變數,以建立來源和目標的 PSCredential 物件。

$secpasswd = ConvertTo-SecureString -String $sourcePassword -AsPlainText -Force
$sourceCred = New-Object System.Management.Automation.PSCredential ($sourceUserName, $secpasswd)
$secpasswd = ConvertTo-SecureString -String $targetPassword -AsPlainText -Force
$targetCred = New-Object System.Management.Automation.PSCredential ($targetUserName, $secpasswd)

建立備份 FileShare 物件

現在,請建立 FileShare 物件,用以代表 Azure Database Migration Service 可使用 New-AzDmsFileShare Cmdlet 建立來源資料庫備份的本機 SMB 網路共用。

$backupPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$backupCred = New-Object System.Management.Automation.PSCredential ($backupUserName, $backupPassword)

$backupFileSharePath="\\10.0.0.76\SharedBackup"
$backupFileShare = New-AzDmsFileShare -Path $backupFileSharePath -Credential $backupCred

建立選取的資料庫物件

下一個步驟會使用 New-AzDmsSelectedDB Cmdlet 來選取來源和目標資料庫。

下列範例關於將單一資料庫從 SQL Server 移轉至 Azure SQL 受控執行個體:

$selectedDbs = @()
$selectedDbs += New-AzDmsSelectedDB -MigrateSqlServerSqlDbMi `
  -Name AdventureWorks2016 `
  -TargetDatabaseName AdventureWorks2016 `
  -BackupFileShare $backupFileShare `

如果整個 SQL Server 執行個體需要有關 Azure SQL 受控執行個體的隨即轉移,則下方會提供從來源取得所有資料庫的迴圈。 在下列範例中,針對 $Server、$SourceUserName 和 $SourcePassword,提供來源 SQL Server 詳細資料。

$Query = "(select name as Database_Name from master.sys.databases where Database_id>4)";
$Databases= (Invoke-Sqlcmd -ServerInstance "$Server" -Username $SourceUserName
-Password $SourcePassword -database master -Query $Query)
$selectedDbs=@()
foreach($DataBase in $Databases.Database_Name)
    {
      $SourceDB=$DataBase
      $TargetDB=$DataBase

$selectedDbs += New-AzureRmDmsSelectedDB -MigrateSqlServerSqlDbMi `
                                              -Name $SourceDB `
                                              -TargetDatabaseName $TargetDB `
                                              -BackupFileShare $backupFileShare
      }

Azure 儲存體容器的 SAS URI

建立包含 SAS URI 的變數,讓 Azure 資料庫管理服務能夠存取此服務將備份檔案上傳到的儲存體帳戶容器。

$blobSasUri="https://mystorage.blob.core.windows.net/test?st=2018-07-13T18%3A10%3A33Z&se=2019-07-14T18%3A10%3A00Z&sp=rwdl&sv=2018-03-28&sr=c&sig=qKlSA512EVtest3xYjvUg139tYSDrasbftY%3D"

注意

Azure Database Migration Service 不支援使用帳戶層級 SAS 權杖。 您必須針對儲存體帳戶容器使用 SAS URI。 了解如何取得 Blob 容器的 SAS URI

其他設定需求

以下是您需要滿足的其他需求:

  • 選取登入。 建立要移轉的登入清單,如下列範例所示:

    $selectedLogins = @("user1", "user2")
    

    重要

    Azure Database Migration Service 目前僅支援移轉 SQL 登入。

  • 選取代理程式作業。 建立要移轉的代理程式作業清單,如下列範例所示:

    $selectedAgentJobs = @("agentJob1", "agentJob2")
    

    重要

    Azure Database Migration Service 目前僅支援使用 T-SQL 子系統作業步驟的作業。

建立並啟動移轉工作

使用 New-AzDataMigrationTask Cmdlet 建立並啟動移轉工作。

指定參數

New-AzDataMigrationTask Cmdlet 預期有下列參數:

  • TaskType。 要為從 SQL Server 到 Azure SQL 受控執行個體的移轉建立的移轉工作類型,預期為 MigrateSqlServerSqlDbMi
  • 資源群組名稱。 要在其中建立工作的資源群組名稱。
  • ServiceName。 要在其中建立工作的 Azure 資料庫移轉服務執行個體。
  • ProjectName。 要在其中建立工作的 Azure 資料庫移轉服務專案名稱。
  • TaskName。 要建立的工作名稱。
  • SourceConnection。 代表來源 SQL Server 連線的 AzDmsConnInfo 物件。
  • TargetConnection。 代表目標 Azure SQL 受控執行個體連線的 AzDmsConnInfo 物件。
  • SourceCred。 連線至來源伺服器所用的 PSCredential 物件。
  • TargetCred。 連線至目標伺服器所用的 PSCredential 物件。
  • SelectedDatabase。 代表來源和目標資料庫對應的 AzDataMigrationSelectedDB 物件。
  • BackupFileShare。 此為 FileShare 物件,代表 Azure 資料庫移轉服務可移入來源資料庫備份的本機網路共用。
  • BackupBlobSasUri。 此為 SAS URI,可讓 Azure 資料庫移轉服務存取此服務會將備份檔案上傳到的儲存體帳戶容器。 了解如何取得 Blob 容器的 SAS URI。
  • SelectedLogins。 已選取要移轉的登入清單。
  • SelectedAgentJobs。 已選取要移轉的代理程式作業清單。
  • SelectedLogins。 已選取要移轉的登入清單。
  • SelectedAgentJobs。 已選取要移轉的代理程式作業清單。

建立並啟動移轉工作

下列範例會建立並啟動名為 myDMSTask 的離線移轉工作:

$migTask = New-AzDataMigrationTask -TaskType MigrateSqlServerSqlDbMi `
  -ResourceGroupName myResourceGroup `
  -ServiceName $service.Name `
  -ProjectName $project.Name `
  -TaskName myDMSTask `
  -SourceConnection $sourceConnInfo `
  -SourceCred $sourceCred `
  -TargetConnection $targetConnInfo `
  -TargetCred $targetCred `
  -SelectedDatabase  $selectedDbs `
  -BackupFileShare $backupFileShare `
  -BackupBlobSasUri $blobSasUri `
  -SelectedLogins $selectedLogins `
  -SelectedAgentJobs $selectedJobs `

監視移轉

若要監視移轉,請執行下列工作。

  1. 將所有移轉詳細資料合併成名為 $CheckTask 的變數。

    若要合併移轉詳細資料 (例如與移轉相關聯的屬性、狀態和資料庫資訊),請使用下列程式碼片段:

    $CheckTask = Get-AzDataMigrationTask -ResourceGroupName myResourceGroup `
                                         -ServiceName $service.Name `
                                         -ProjectName $project.Name `
                                         -Name myDMSTask `
                                         -ResultType DatabaseLevelOutput `
                                         -Expand
    Write-Host ‘$CheckTask.ProjectTask.Properties.Output’
    
  2. 使用 $CheckTask 變數來取得移轉工作的目前狀態。

    若要使用 $CheckTask 變數來取得移轉工作的目前狀態,您可查詢工作的狀態屬性,藉以監視執行中的移轉工作,如下列範例所示:

    if (($CheckTask.ProjectTask.Properties.State -eq "Running") -or ($CheckTask.ProjectTask.Properties.State -eq "Queued"))
    {
      Write-Host "migration task running"
    }
    else if($CheckTask.ProjectTask.Properties.State -eq "Succeeded")
    {
      Write-Host "Migration task is completed Successfully"
    }
    else if($CheckTask.ProjectTask.Properties.State -eq "Failed" -or $CheckTask.ProjectTask.Properties.State -eq "FailedInputValidation" -or $CheckTask.ProjectTask.Properties.State -eq "Faulted")
    {
      Write-Host "Migration Task Failed"
    }
    

刪除 Azure Database Migration Service 的執行個體

完成移轉之後,您可刪除 Azure Database Migration Service 執行個體:

Remove-AzDms -ResourceGroupName myResourceGroup -ServiceName MyDMS

下一步

請在「什麼是 Azure Database Migration Service?」一文中進一步瞭解 Azure Database Migration Service。

如需其他移轉案例 (來源/目標配對) 的相關資訊,請參閱 Microsoft 資料庫移轉指南