PowerShell と Azure Database Migration Service を使用して SQL Server から SQL Managed Instance にオフラインで移行する

この記事では、Microsoft Azure PowerShell を使用して、SQL Server 2005 以上のオンプレミス インスタンスに復元された Adventureworks2016 データベースを Azure SQL の SQL Managed Instance にオフラインで移行します。 Microsoft Azure PowerShell の Az.DataMigration モジュールを使用して、SQL Server インスタンスから SQL マネージド インスタンスにデータベースを移行できます。

この記事では、次のことについて説明します。

  • リソース グループを作成する。
  • Azure Database Migration Service のインスタンスを作成します。
  • Azure Database Migration Service のインスタンスで移行プロジェクトを作成する。
  • オフラインで移行を実行します。

ヒント

Azure Database Migration Service では、データベースをオフラインまたはオンラインで移行できます。 "オフライン" 移行では、移行の開始時がアプリケーションのダウンタイムの起点になります。 移行の完了時点から新しい環境に切り替わるまでの時間にダウンタイムを制限するには、"オンライン" 移行を使用してください。 オフライン移行をテストして、ダウンタイムが許容範囲内であるかどうかを判断することをお勧めします。 予想されるダウンタイムが許容できない場合は、オンライン移行を行います。

この記事では、オフライン移行の手順について説明しますが、オンラインで移行することもできます。

前提条件

これらの手順を完了するには、以下が必要です。

  • SQL Server 2016 以上 (任意のエディション)。
  • AdventureWorks2016 データベースのローカル コピー (こちらからダウンロードできます)。
  • TCP/IP プロトコルを有効にする (SQL Server Express のインストールでは既定で無効になっています)。 サーバー ネットワーク プロトコルの有効化または無効化に関する記事の説明に従って、TCP/IP プロトコルを有効にする。
  • データベース エンジン アクセス用の Windows Firewall の構成。
  • Azure サブスクリプション。 お持ちでない場合は、開始する前に無料アカウントを作成してください。
  • SQL マネージド インスタンス。 AZURE SQL Managed Instance の作成に関する記事 の詳細に従って、SQL Managed Instance を作成できます。
  • Data Migration Assistant v3.3 以降をダウンロードしてインストールする。
  • ExpressRoute または VPN を使用してオンプレミス ソース サーバーへのサイト間接続を Azure Database Migration Service に提供する、Azure Resource Manager デプロイ モデルを使用して作成された Microsoft Azure 仮想ネットワーク。
  • SQL Server の移行評価の実行に関する記事で説明されているように、Data Migration Assistant を使用してオンプレミスのデータベースおよびスキーマの移行の評価を完了していること。
  • Az.DataMigration モジュール (バージョン 0.7.2 以降) を PowerShell ギャラリーからダウンロードし、Install-Module PowerShell cmdlet コマンドレットを使用してインストールする。
  • ソースの SQL Server インスタンスへの接続に使用される資格情報に、CONTROL SERVER アクセス許可が含まれていることを確認する。
  • ターゲットの SQL マネージド インスタンスへの接続に使用される資格情報に、ターゲットの SQL マネージド インスタンス データベースに対する CONTROL DATABASE アクセス許可が含まれていることを確認する。

Microsoft Azure サブスクリプションにサインインする

PowerShell を使用して Azure サブスクリプションにサインインします。 詳細については、「Azure PowerShell を使用してサインインする」を参照してください。

リソース グループを作成する

Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。

New-AzResourceGroup コマンドを使用してリソース グループを作成します。

次の例では、myResourceGroup という名前のリソース グループを "米国東部" リージョンに作成します。

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

Azure Database Migration Service のインスタンスを作成する

新しい Azure Database Migration Service インスタンスを作成するには、New-AzDataMigrationService コマンドレットを使用します。 このコマンドレットでは、次のパラメーターが必要です。

  • Azure リソース グループ名New-AzResourceGroup コマンドを使用して前述の Azure リソース グループを作成し、パラメーターとしてその名前を指定できます。
  • サービス名。 Azure Database Migration Service に使用する一意のサービス名に対応する文字列。
  • Location。 サービスの場所を指定します。 米国西部や東南アジアなど、Azure データ センターの場所を指定してください。
  • SKU。 このパラメーターは、DMS SKU 名に対応します。 現在サポートされている SKU 名は、Basic_1vCoreBasic_2vCoresGeneralPurpose_4vCores です。
  • 仮想サブネット識別子New-AzVirtualNetworkSubnetConfig コマンドレットを使用して、サブネットを作成できます。

次の例では、MyVNET という仮想ネットワークと MySubnet というサブネットを使用して、"米国東部" リージョンにあるリソース グループ MyDMSResourceGroupMyDMS という名前のサービスを作成します。

$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 Database Migration Service インスタンスを作成した後、移行プロジェクトを作成します。 Azure Database Migration Service プロジェクトでは、ソースとターゲットの両方のインスタンスの接続情報に加え、プロジェクトの一部として移行するデータベースの一覧が必要です。

ソースとターゲットの接続用のデータベース接続情報オブジェクトを作成する

データベース接続情報オブジェクトを作成するには、New-AzDmsConnInfo コマンドレットを使用します。このコマンドレットには、次のパラメーターが必要です。

  • ServerType。 要求するデータベース接続の種類 (SQL、Oracle、MySQL など)。 SQL Server と Azure SQL には SQL を使用します。
  • DataSource。 SQL Server インスタンスまたは Azure SQL データベース インスタンスの名前または 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 Managed Instance の接続情報の作成を示しています。

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

移行プロジェクト用のデータベースを指定する

Azure Database Migration Service プロジェクトの一部としてデータベースを指定する AzDataMigrationDatabaseInfo オブジェクトの一覧を作成します。これはプロジェクト作成用のパラメーターとして指定できます。 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 オブジェクトとして作成します。

次の例では、ソースとターゲットの両方の接続用の PSCredential オブジェクトを作成し、パスワードを文字列変数 $sourcePassword および $targetPassword として指定します。

$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 オブジェクトを作成する

ここで、New-AzDmsFileShare コマンドレットを使用して、Azure Database Migration Service がソース データベースのバックアップを作成できるローカル SMB ネットワーク共有を表す FileShare オブジェクトを作成します。

$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 コマンドレットを使用して、ソース データベースとターゲット データベースを選択します。

次の例は、単一データベースを SQL Server から Azure SQL Managed Instance に移行する場合です。

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

SQL Server インスタンス全体を Azure SQL Managed Instance にリフト アンド シフトする必要がある場合は、ソースからすべてのデータベースを取得するループを以下に示します。 次の例では、$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 Storage コンテナー用の SAS URI

SAS URI が含まれる変数を作成します。この SAS URI により、バックアップ ファイルのアップロード先ストレージ アカウント コンテナーへのアクセスが、Azure Database Migration Service に提供されます。

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

Note

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 コマンドレットを使用します。

パラメーターの指定

New-AzDataMigrationTask コマンドレットでは、次のパラメーターが必要です。

  • TaskType。 作成する移行タスクの種類。SQL Server から Azure SQL Managed Instance への移行の種類である MigrateSqlServerSqlDbMi が必要です。
  • ResourceGroupName。 タスクを作成する Azure リソース グループの名前。
  • ServiceName。 タスクを作成する Azure Database Migration Service インスタンス。
  • ProjectName。 タスクを作成する Azure Database Migration Service プロジェクトの名前。
  • TaskName。 作成するタスクの名前。
  • SourceConnection。 ソース SQL Server 接続を表す AzDmsConnInfo オブジェクト。
  • TargetConnection。 ターゲットの Azure SQL マネージド インスタンスの接続を表す AzDmsConnInfo オブジェクト。
  • SourceCred。 ソース サーバーに接続するための PSCredential オブジェクト。
  • TargetCred。 ターゲット サーバーに接続するための PSCredential オブジェクト。
  • SelectedDatabase。 ソースとターゲット データベースのマッピングを表す AzDataMigrationSelectedDB オブジェクト。
  • BackupFileShare。 Azure Database Migration Service がソース データベース バックアップを移行できるローカル ネットワーク共有を表すファイル共有オブジェクト。
  • BackupBlobSasUri。 バックアップ ファイルのアップロード先ストレージ アカウント コンテナーへのアクセスを、Azure Database Migration Service に提供する SAS URI。 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 のデータベース移行ガイドに関するページを参照してください。