Azure CLI は、コマンドラインやスクリプトで Azure リソースを作成および管理するために使用します。 この記事では、Azure CLI を使用して、バックアップされた SQL データベースを Azure VM に復元する方法について説明します。 これらのアクションは、Azure portal を使用して実行することもできます。
CLI コマンドを実行するには、Azure Cloud Shell を使用します。
この記事は、Azure VM 上に SQL データベースがあり、Azure Backup でバックアップしていることを前提としています。 CLI を使用して Azure の SQL データベースをバックアップする方法を使用して SQL データベースをバックアップした場合は、次のリソースを使用しています。
-
SQLResourceGroupという名前のリソース グループ。 -
SQLVaultという名前のコンテナー。 -
VMAppContainer;Compute;SQLResourceGroup;testSQLVMという名前の保護されたコンテナー。 - 「
sqldatabase;mssqlserver;testdb」という名前のバックアップされたデータベース/項目 -
westusリージョン内のリソース。
現在サポートされているバックアップと復元のシナリオを確認するには、サポート マトリックスを参照してください。 よく寄せられる質問については、 よく寄せられる質問を参照してください。
バックアップされたデータベースの復元ポイントを表示する
データベースのすべての復旧ポイントの一覧を表示するには、次のように az backup recoverypoint list コマンドを使用します。
az backup recoverypoint list --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
--item-name "sqldatabase;mssqlserver;testdb" \
--output table
復旧ポイントの一覧は次のように表示されます。
Name Time BackupManagementType Item Name RecoveryPointType
------------------- --------------------------------- --------------------- ---------------------- ------------------
7660777527047692711 2019-12-10T04:00:32.346000+00:00 AzureWorkload sqldatabase;mssqlserver;testdb Full
7896624824685666836 2019-12-15T10:33:32.346000+00:00 AzureWorkload sqldatabase;mssqlserver;testdb Differential
DefaultRangeRecoveryPoint AzureWorkload sqldatabase;mssqlserver;testdb Log
上記の一覧には、完全、差分、ログの各バックアップに対応する 3 つの復旧ポイントが含まれています。
Note
az backup recoverypoint show-log-chain コマンドを使用して、すべての連続したログ バックアップ チェーンの開始ポイントと終了ポイントを表示することもできます。
データベースを復元するための前提条件
データベースを復元する前に、次の前提条件が満たされていることを確認してください。
- コンテナーでリージョン間の復元が有効になっている場合は、同じリージョン内の SQL インスタンスまたは別のリージョンにのみデータベースを復元できます。
- ターゲット インスタンスは、リージョン間復元およびサブスクリプション間復元の時を除き、ソースと同じボールトに登録する必要があります。 .
データベースを復元する
Azure Backup では、Azure VM 上で実行されている SQL データベースを次のように復元できます。
- ログ バックアップを使用して、特定の日付または時刻 (秒) に復元する。 選択された時刻を基に、Azure Backup は完全、差分、または一連のログ バックアップから、必要になる適切なバックアップを自動的に判別します。
- 特定の完全バックアップまたは差分バックアップに復元することで、特定の復旧ポイントに復元する。
データベースを復元するには、az restore restore-azurewl コマンドを使用します。これには、入力の 1 つとして復旧構成オブジェクトが必要です。 このオブジェクトは、az backup recoveryconfig show コマンドを使用して生成できます。 復旧構成オブジェクトには、復元を実行するためのすべての詳細が含まれています。 これらの 1 つは復元モード (OriginalWorkloadRestore または AlternateWorkloadRestore) です。
Note
OriginalWorkloadRestore: 元のソースと同じ SQL インスタンスにデータを復元します。 このオプションでは、元のデータベースが上書きされます。 AlternateWorkloadRestore: データベースを別の場所に復元し、元のソース データベースを保持します。
別の場所に復元する
別の場所にデータベースを復元するには、復元モードとして AlternateWorkloadRestore を使用します。 次に、復元ポイントを選択する必要があります。以前の特定の時点、または以前の復元ポイントのいずれかを選択できます。
前の復元ポイントへの復元に進みましょう。 データベースの復元ポイントの一覧を表示して、復元するポイントを選択します。 ここでは、7660777527047692711 という名前の復元ポイントを使用しましょう。
上記の復元ポイント名と復元モードで、az backup recoveryconfig show コマンドを使用して復旧構成オブジェクトを作成します。 このコマンドの残りのパラメーターを確認します。
- --target-item-name: 復元されたデータベースによって使用される名前。 このシナリオでは、restored_database という名前を使用しました。
- --target-server-name: Recovery Services コンテナーに正常に登録され、復元対象のデータベースと同じリージョンにとどまる SQL サーバーの名前。 ここでは、保護したのと同じ SQL サーバー (名前は testSQLVM) にデータベースを復元します。
- --target-server-type: SQL データベースの復元の場合、SQLInstance を使用する必要があります。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
--item-name "SQLDataBase;mssqlserver;testdb" \
--restore-mode AlternateWorkloadRestore \
--rp-name 7660777527047692711 \
--target-item-name restored_database \
--target-server-name testSQLVM \
--target-server-type SQLInstance \
--workload-type SQLDataBase \
--output json
上記のクエリに対する応答は、次のような復旧構成オブジェクトです。
{
"container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;testSQLVM",
"container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
"database_name": "MSSQLSERVER/restored_database",
"filepath": null,
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;testdb",
"log_point_in_time": null,
"recovery_mode": null,
"recovery_point_id": "7660777527047692711",
"restore_mode": "AlternateLocation",
"source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
"workload_type": "SQLDataBase",
"alternate_directory_paths": []
}
ここで、データベースを復元するには、az restore restore-azurewl コマンドを実行します。 このコマンドを使用するには、recoveryconfig.json という名前のファイルに保存されている上記の JSON 出力を入力します。
az backup restore restore-azurewl --resource-group SQLResourceGroup \
--vault-name SQLVault \
--recovery-config recoveryconfig.json \
--output table
出力は次のように表示されます。
Name Operation Status Item Name Backup Management Type Start Time UTC Duration
------------------------------------ ----------- ---------- --------------------------------- ------------------------ -------------------------------- --------------
be7ea4a4-0752-4763-8570-a306b0a0106f Restore InProgress testdb [testSQLVM] AzureWorkload 2022-06-21T03:51:06.898981+00:00 0:00:05.652967
応答によってジョブ名がわかります。 このジョブ名と az backup job show コマンドを使用してジョブの状態を追跡できます。
復元および上書き
元の場所に復元するには、復元モードとして OriginalWorkloadRestore を使用します。 次に、復元ポイントを選択する必要があります。以前の特定の時点、または以前の復元ポイントのいずれかを選択できます。
例として、以前の特定の時点 "28-11-2019-09:53:00" に復元することを選択してみましょう。 この復元ポイントは、dd-mm-yyyy, dd-mm-yyyy-hh:mm:ss の形式で指定できます。 復元する有効な特定の時点を選択するには、az backup recoverypoint show-log-chain コマンドを使用します。これにより、連続したログ チェーン バックアップの間隔が一覧表示されます。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
--item-name "sqldatabase;mssqlserver;testdb" \
--restore-mode OriginalWorkloadRestore \
--log-point-in-time 20-06-2022-09:02:41 \
--output json
上記のクエリに対する応答は、次のような復旧構成オブジェクトです。
{
"alternate_directory_paths": null,
"container_id": null,
"container_uri": "VMAppContainer;Compute;SQLResourceGroup;testSQLVM",
"database_name": null,
"filepath": null,
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;testdb",
"log_point_in_time": "20-06-2022-09:02:41",
"recovery_mode": null,
"recovery_point_id": "DefaultRangeRecoveryPoint",
"restore_mode": "OriginalLocation",
"source_resource_id": "/subscriptions/62b829ee-7936-40c9-a1c9-47a93f9f3965/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
"workload_type": "SQLDataBase"
}
ここで、データベースを復元するには、az restore restore-azurewl コマンドを実行します。 このコマンドを使用するには、recoveryconfig.json という名前のファイルに保存されている上記の JSON 出力を入力します。
az backup restore restore-azurewl --resource-group sqlResourceGroup \
--vault-name sqlVault \
--recovery-config recoveryconfig.json \
--output table
出力は次のように表示されます。
Name Operation Status Item Name Backup Management Type Start Time UTC Duration
------------------------------------ ----------- ---------- ------------------------------- ------------------------ -------------------------------- --------------
1730ec49-166a-4bfd-99d5-93027c2d8480 Restore InProgress testdb [testSQLVM] AzureWorkload 2022-06-21T04:04:11.161411+00:00 0:00:03.118076
応答によってジョブ名がわかります。 このジョブ名と az backup job show コマンドを使用してジョブの状態を追跡できます。
セカンダリ リージョンへの復元
データベースをセカンダリ リージョンに復元するには、復元構成で、セカンダリ リージョンにあるターゲット コンテナーとサーバーを指定します。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name "VMAppContainer;compute;SQLResourceGroup;testSQLVM" \
--item-name "sqldatabase;mssqlserver;testdb" \
--restore-mode AlternateWorkloadRestore \
--from-full-rp-name 293170069256531 \
--rp-name 293170069256531 \
--target-server-name targetSQLServer \
--target-container-name "VMAppContainer;compute;SQLResourceGroup;targetSQLServer" \
--target-item-name testdb_restore_1 \
--target-server-type SQLInstance \
--workload-type SQLDataBase \
--target-resource-group SQLResourceGroup \
--target-vault-name targetVault \
--backup-management-type AzureWorkload
応答は、次のような回復構成オブジェクトです。
{
"container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/targetVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;targetSQLServer",
"container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
"database_name": "MSSQLSERVER/testdb_restore_1",
"filepath": null,
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;testdb",
"log_point_in_time": null,
"recovery_mode": null,
"recovery_point_id": "293170069256531",
"restore_mode": "AlternateLocation",
"source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
"workload_type": "SQLDataBase",
"alternate_directory_paths": []
}
az restore restore-azurewl コマンドでこの復元構成を使用します。
--use-secondary-region フラグを選択して、データベースをセカンダリ リージョンに復元します。
az backup restore restore-azurewl --resource-group SQLResourceGroup \
--vault-name SQLVault \
--recovery-config recoveryconfig.json \
--use-secondary-region \
--output table
出力は次のように表示されます。
Name Operation Status Item Name Backup Management Type Start Time UTC Duration
------------------------------------ ------------------ ---------- ------------------------- ------------------------ -------------------------------- --------------
0d863259-b0fb-4935-8736-802c6667200b CrossRegionRestore InProgress testdb [testSQLVM] AzureWorkload 2022-06-21T08:29:24.919138+00:00 0:00:12.372421
Note
セカンダリ リージョンで使用できるバックアップ データの RPO は 12 時間です。 このため、CRR をオンにすると、セカンダリ リージョンの RPO は 12 時間 + ログ頻度期間 (15 分以上に設定できます) になります。
ファイルとして復元
バックアップ データをデータベースではなくファイルとして復元するために、復元モードとして RestoreAsFiles を使用します。 次に、復元ポイントを選択します。以前の特定の時点、または以前の復元ポイントのいずれかを選択できます。 指定されたパスにファイルがダンプされると、ファイルをデータベースとして復元したい任意の SQL マシンにこれらのファイルを移すことができます。 これらのファイルを任意のマシンに移動できるので、サブスクリプションやリージョンをまたいでデータを復元できるようになりました。
復元する以前の時点 28-11-2019-09:53:00 と、同じ SQL サーバー上でバックアップファイルを C:\restoreasfiles としてダンプする場所を選びます。 この復元ポイントは、dd-mm-yyyy または dd-mm-yyyy-hh:mm:ss の形式で指定できます。 復元する有効な特定の時点を選択するには、az backup recoverypoint show-log-chain コマンドを使用します。これにより、連続したログ チェーン バックアップの間隔が一覧表示されます。
上記の復元ポイント名と復元モードで、az backup recoveryconfig show コマンドを使用して復旧構成オブジェクトを作成します。 このコマンドの残りの各パラメーターを確認します。
- --target-container-name: Recovery Services コンテナーに正常に登録され、復元対象のデータベースと同じリージョンに存在する SQL サーバーの名前。 保護した同じ SQL Server(mssqlserver)に、データベースをファイルとして復元しましょう。
- --rp-name: ポイントインタイム リストアでは、復元ポイントの名前は DefaultRangeRecoveryPoint です。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
--item-name "sqldatabase;mssqlserver;testdb" \
--restore-mode RestoreAsFiles \
--rp-name 932606668166874635 \
--target-container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
--filepath "C:\restoreasfiles" \
--output json
上記のクエリに対する応答は、次のような復旧構成オブジェクトです。
{
"alternate_directory_paths": null,
"container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/VMAppContainer;Compute;SQLResourceGroup;testSQLVM",
"container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
"database_name": null,
"filepath": "C:\restoreasfiles",
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;testdb",
"log_point_in_time": null,
"recovery_mode": "FileRecovery",
"recovery_point_id": "932606668166874635",
"restore_mode": "AlternateLocation",
"source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
"workload_type": "SQLDataBase"
}
ここで、データベースをファイルとして復元するには、az restore restore-azurewl コマンドを実行します。 このコマンドを使用するには、recoveryconfig.json という名前のファイルに保存されている上記の JSON 出力を入力します。
az backup restore restore-azurewl --resource-group SQLResourceGroup \
--vault-name SQLVault \
--recovery-config recoveryconfig.json \
--output json
出力は次のように表示されます。
{
"eTag": null,
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupJobs/e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
"location": null,
"name": "e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
"properties": {
"actionsInfo": [
"1"
],
"activityId": "9e7c8ee4-f1ef-11ec-8a2c-3c52826c1a9a",
"backupManagementType": "AzureWorkload",
"duration": "0:00:04.304322",
"endTime": null,
"entityFriendlyName": "testdb [testSQLVM]",
"errorDetails": null,
"extendedInfo": {
"dynamicErrorMessage": null,
"propertyBag": {
"Job Type": "Restore as files"
},
"tasksList": [
{
"status": "InProgress",
"taskId": "Transfer data from vault"
}
]
},
"isUserTriggered": true,
"jobType": "AzureWorkloadJob",
"operation": "Restore",
"startTime": "2022-06-22T05:53:32.951666+00:00",
"status": "InProgress",
"workloadType": "SQLDataBase"
},
"resourceGroup": "SQLResourceGroup",
"tags": null,
"type": "Microsoft.RecoveryServices/vaults/backupJobs"
}
応答によってジョブ名がわかります。 このジョブ名と az backup job show コマンドを使用してジョブの状態を追跡できます。
Note
チェーン全体を復元せず、ファイルのサブセットのみを復元する場合は、こちらに記載されている手順に従ってください。
サブスクリプション間の復元
サブスクリプション間の復元 (CSR) を使用すると、復元アクセス許可が使用可能な場合は、テナント下の任意のサブスクリプションおよび任意のコンテナーに柔軟に復元できます。 既定では、CSR はすべての Recovery Services コンテナー (既存のコンテナーと新しく作成されたコンテナー) で有効になっています。
Note
- Recovery Services コンテナーからサブスクリプション間の復元をトリガーできます。
- CSR はストリーミング ベースのバックアップでのみサポートされ、スナップショット ベースのバックアップではサポートされていません。
- CSR を使用したリージョン間の復元 (CRR) はサポートされていません。
az backup vault create
コンテナーの作成と更新中にコンテナーの CSR 状態を設定できるようにするパラメーター cross-subscription-restore-state を追加します。
az backup recoveryconfig show
SQL または HANA データソースのサブスクリプション間の復元をトリガーするときに、ターゲット サブスクリプションを入力として指定できるようにするパラメーター --target-subscription-id を追加します。
Example:
az backup vault create -g {rg_name} -n {vault_name} -l {location} --cross-subscription-restore-state Enable
az backup recoveryconfig show --restore-mode alternateworkloadrestore --backup-management-type azureworkload -r {rp} --target-container-name {target_container} --target-item-name {target_item} --target-resource-group {target_rg} --target-server-name {target_server} --target-server-type SQLInstance --target-subscription-id {target_subscription} --target-vault-name {target_vault} --workload-type SQLDataBase --ids {source_item_id}
SQLインスタンスのスナップショットを復元する
以下の例はPowerShell シェル構文を使用しており、Bashではありません。 この記事で示されているスナップショット オプションを利用できる Azure CLI バージョンを使用してください。 スナップショット復元の前提条件とサポートマトリックスを確認してください。
使用前にプレースホルダーを置き換えてください。 共通の設定を完了し、必要な復元シナリオだけを選択してください。 以下の例は代替案であり、完全に実行するスクリプトではありません。 復元コマンドはデータを上書きしたり、ディスクの接続を変更したりすることがあります。
スナップショット復元変数の設定
には$vaultSubscriptionサブスクリプションを使用します。 必要な権限を持つターゲット リソース グループおよびユーザー割り当てマネージド ID を準備します:
$vaultSubscription = "<vault-subscription-id>"
$vaultRg = "<vault-rg>"
$vaultName = "<vault-name>"
$sourceVm = "<source-vm-name>"
$targetVm = "<target-vm-name>"
$targetInstanceName = "<target-instance-name>"
$restoreRg = "<restore-resource-group>"
$uamiId = "/subscriptions/<subscription-id>/resourceGroups/<identity-rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"
$vaultArgs = @("--subscription", $vaultSubscription, "--resource-group", $vaultRg, "--vault-name", $vaultName)
az backup vault show --subscription $vaultSubscription --resource-group $vaultRg --name $vaultName
az backup container list @vaultArgs --backup-management-type AzureWorkload `
--query "[].{Name:name,VM:properties.friendlyName}" --output table
$containerName = "<native-source-container-name>"
$targetContainerName = "<native-target-container-name>"
$sourceArgs = $vaultArgs + @("--container-name", $containerName, "--backup-management-type", "AzureWorkload")
az backup item list @sourceArgs --workload-type SQLInstance --output json
$instanceItemName = "<native-protected-instance-item-name>"
$instanceArgs = $sourceArgs + @("--item-name", $instanceItemName, "--workload-type", "SQLInstance")
サービス出力からネイティブコンテナ名と保護アイテム名を正確にコピーしてください。 上記の送信元と宛先の設定は同じVaultを使っています。 代替場所復元の場合は、ターゲットインスタンスが検出可能であることを確認しましょう:
az backup protectable-item show @vaultArgs --workload-type MSSQL `
--protectable-item-type SQLInstance --name $targetInstanceName --server-name $targetVm
これらの例における長いオプションは、以下の短い別名もサポートしています:
| 長いオプション | Alias |
|---|---|
--restore-point-query-type |
--rp-query-type |
--get-latest-recovery-point-only |
--latest-rp-only |
--base-snapshot-recovery-point-id |
--base-snapshot-rp-id |
--base-recovery-point-datasource-id |
--base-datasource-id |
クエリスナップショット回復ポイント
時間ウィンドウ内、スナップショットのみ、または最新のスナップショットのみについて、要求されたすべてのリカバリポイントの種類を一覧表示します。
$startDate = (Get-Date).ToUniversalTime().AddDays(-7).ToString("dd-MM-yyyy-HH:mm:ss")
$endDate = (Get-Date).ToUniversalTime().ToString("dd-MM-yyyy-HH:mm:ss")
az backup recoverypoint list @instanceArgs --start-date $startDate --end-date $endDate `
--restore-point-query-type FullDifferentialAndSnapshot --output json
az backup recoverypoint list @instanceArgs --restore-point-query-type Snapshot --output json
az backup recoverypoint list @instanceArgs --restore-point-query-type Snapshot `
--get-latest-recovery-point-only true --output json
回復ポイントを明確に選び、リストの順序を前提にしないでください。 含まれているデータベースやファイルシステム情報を検査するために、その詳細を取得できます:
$snapshotRpName = "<selected-snapshot-recovery-point-name>"
$snapshotJson = az backup recoverypoint show @instanceArgs --name $snapshotRpName --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the selected snapshot recovery point." }
$snapshotRp = $snapshotJson | ConvertFrom-Json
$snapshotRp.properties.extendedInfo.includedDatabases | Select-Object datasourceName, datasourceId
$snapshotRp.properties.extendedInfo.snapshotRecoveryPointInfo.snapshotResourceGroup
$snapshotRp.properties.extendedInfo.snapshotRecoveryPointInfo.sourceFilesystemInfo |
Select-Object label, fileSystemType, accessPaths, isOnStorageSpace, storageSpaceInfo, diskInfoList
スナップショットベースのログ範囲をクエリ
インスタンスのprotectedItemDataSourceIdを取得してください。 このIDはログクエリのベースデータソースであり、個々のデータベースのデータソースIDではありません。
$instanceJson = az backup item show @sourceArgs --name $instanceItemName `
--workload-type SQLInstance --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the protected instance." }
$instanceItem = $instanceJson | ConvertFrom-Json
$instanceDatasourceId = $instanceItem.properties.protectedItemDataSourceId
az backup item list @sourceArgs --workload-type MSSQL --output json
$dbItemName = "<selected-native-database-item-name>"
$databaseArgs = $sourceArgs + @("--item-name", $dbItemName, "--workload-type", "MSSQL")
az backup recoverypoint show-log-chain @databaseArgs `
--recovery-mode SnapshotAttachAndRecover `
--base-snapshot-recovery-point-id $snapshotRpName `
--base-recovery-point-datasource-id $instanceDatasourceId --output json
スナップショットに含まれるデータベースのいずれかに対応するデータベース項目を選択します。 個々の回復ポイントをログ範囲として扱うのではなく、連続的な回復時間範囲には show-log-chain を使いましょう。
インスタンスを元の場所に復元
元の位置復元(OLR)構成を生成します。
$configFile = ".\instance-olr.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
--restore-mode OriginalWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
--snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
Set-Content -Encoding utf8 $configFile
提出する前に、ボリュームマッピングを確認してください。 元の場所への復元は、元のデータベースを上書きする可能性があります。
インスタンスの代替場所への復元
宛先コンテナ、サーバー、SQLインスタンスを活用してください。
--target-item-nameを必要なターゲットデータベース名またはサービスでサポートされるインスタンス命名パターンに設定します:
$configFile = ".\instance-alr.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
--restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
--target-container-name $targetContainerName --target-server-name $targetVm `
--target-server-type SQLInstance --target-instance-name $targetInstanceName `
--target-item-name "<target-database-name-or-service-supported-instance-pattern>" `
--snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
Set-Content -Encoding utf8 $configFile
インスタンスのポイントインタイム復元
先ほどのクエリで選んだインスタンススナップショットとそのベースデータソースIDを使いましょう。 含まれるすべてのデータベースを一意の保護アイテムに対応付けし、そのスナップショットを超えるログ範囲を照会します:
$includedDatabases = @($snapshotRp.properties.extendedInfo.includedDatabases)
if ($includedDatabases.Count -eq 0) { throw "The snapshot has no included databases." }
$itemsJson = az backup item list @sourceArgs --workload-type MSSQL --output json
if ($LASTEXITCODE -ne 0) { throw "Could not list protected databases." }
$databaseItems = @($itemsJson | ConvertFrom-Json)
$logRangesPerDb = @{}
foreach ($database in $includedDatabases) {
$matchingItems = @($databaseItems | Where-Object {
$_.properties.protectedItemDataSourceId -eq $database.datasourceId
})
if ($matchingItems.Count -eq 0) {
$matchingItems = @($databaseItems | Where-Object {
$_.name -eq "SQLDataBase;$($database.datasourceName)" -or
$_.properties.friendlyName -eq $database.datasourceName
})
}
if ($matchingItems.Count -ne 1) {
throw "Could not uniquely resolve included database $($database.datasourceName)."
}
$rangesJson = az backup recoverypoint show-log-chain @sourceArgs `
--item-name $matchingItems[0].name --workload-type MSSQL `
--recovery-mode SnapshotAttachAndRecover `
--base-snapshot-recovery-point-id $snapshotRpName `
--base-recovery-point-datasource-id $instanceDatasourceId `
--query "[].properties.timeRanges[]" --output json
if ($LASTEXITCODE -ne 0) { throw "Could not query snapshot-based log ranges." }
$logRangesPerDb[$database.datasourceName] = @(
foreach ($range in ($rangesJson | ConvertFrom-Json)) {
if (-not $range.startTime -or -not $range.endTime) {
throw "The service returned a log range without startTime or endTime."
}
[PSCustomObject]@{
ItemName = $matchingItems[0].name
StartTime = ([DateTimeOffset]$range.startTime).UtcDateTime
EndTime = ([DateTimeOffset]$range.endTime).UtcDateTime
}
}
)
if ($logRangesPerDb[$database.datasourceName].Count -eq 0) {
throw "No snapshot-based log ranges for $($database.datasourceName)."
}
}
データベースの範囲を調べ、UTC時刻を選びます。 以下の例では、そのデータベースの最新の終了時刻を選択し、その時刻が 含まれているすべてのデータベースに対しても利用可能であることを検証します。 検証が失敗した場合は、共通の利用可能時間帯内の時間を選択し、再度チェックを実行してください。
$selectedDatabase = "<instance-name>;<database-name>"
if (-not $logRangesPerDb.ContainsKey($selectedDatabase)) {
throw "Select a database from logRangesPerDb.Keys."
}
$selectedRanges = @($logRangesPerDb[$selectedDatabase] | Sort-Object EndTime)
$selectedRanges | Format-Table ItemName, StartTime, EndTime
$rangeIndex = -1
$pointInTime = $selectedRanges[$rangeIndex].EndTime
foreach ($databaseName in $logRangesPerDb.Keys) {
$matchingRanges = @($logRangesPerDb[$databaseName] | Where-Object {
$_.StartTime -le $pointInTime -and $_.EndTime -ge $pointInTime
})
if ($matchingRanges.Count -eq 0) {
throw "The chosen restore time is unavailable for $databaseName."
}
}
$pit = $pointInTime.ToString("dd-MM-yyyy-HH:mm:ss")
ベーススナップショットと検証済みログ再生時間を使ってPITR構成を生成します:
$configFile = ".\instance-pit.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName --log-point-in-time $pit `
--restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
--target-container-name $targetContainerName --target-server-name $targetVm `
--target-server-type SQLInstance --target-instance-name $targetInstanceName `
--target-item-name "<target-database-name-or-service-supported-instance-pattern>" `
--snapshot-rg $restoreRg --identity-arm-id $uamiId --no-recovery-mode `
--output json | Set-Content -Encoding utf8 $configFile
--no-recovery-mode は、後続の回復手順のためにデータベースを非回復のままにするよう要求します。 その行動が回復計画に適切かどうかを見直してください。
インスタンスをディスクとして復元
スナップショットを接続してからデータベースを復旧するのではなく、ディスクとしての復元(RAD)には SnapshotAttach を使用してください。
$configFile = ".\instance-rad.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
--restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
--target-container-name $targetContainerName --target-server-name $targetVm `
--target-server-type SQLInstance --target-instance-name $targetInstanceName `
--snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
Set-Content -Encoding utf8 $configFile
インスタンスで保護されたデータベースを復元する
ソースコンテナから正確なネイティブデータベースアイテム名を選択してください。 リカバリーポイント復元の場合は、明示的にデータベーススナップショットを選択してください:
az backup item list @sourceArgs --workload-type MSSQL --output json
$dbItemName = "<native-protected-database-item-name>"
$databaseArgs = $sourceArgs + @("--item-name", $dbItemName, "--workload-type", "MSSQL")
az backup recoverypoint list @databaseArgs --restore-point-query-type Snapshot --output json
$dbSnapshotRpName = "<chosen-database-snapshot-recovery-point-name>"
az backup recoverypoint show @databaseArgs --name $dbSnapshotRpName --output json
データベースの別の場所への復元
$configFile = ".\database-alr.json"
az backup recoveryconfig show @databaseArgs --rp-name $dbSnapshotRpName `
--restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
--target-container-name $targetContainerName --target-server-name $targetVm `
--target-server-type SQLInstance --target-instance-name $targetInstanceName `
--target-item-name "<restored-db-name>" --snapshot-rg $restoreRg `
--identity-arm-id $uamiId --no-recovery-mode --output json |
Set-Content -Encoding utf8 $configFile
データベース ポイントインタイム復元
利用可能なログレンジをクエリし、返された範囲内のUTC時刻を選択します。 次のdd-MM-yyyy-HH:mm:ss形式を使用します:
az backup recoverypoint show-log-chain @databaseArgs --output json
$pit = "<dd-MM-yyyy-HH:mm:ss-in-UTC-within-a-returned-range>"
$configFile = ".\database-pit.json"
az backup recoveryconfig show @databaseArgs --log-point-in-time $pit `
--restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
--target-container-name $targetContainerName --target-server-name $targetVm `
--target-server-type SQLInstance --target-instance-name $targetInstanceName `
--target-item-name "<restored-db-name>" --snapshot-rg $restoreRg `
--identity-arm-id $uamiId --no-recovery-mode --output json |
Set-Content -Encoding utf8 $configFile
前のデータベース復元例も --no-recovery-modeを使用しています。 提出前にその設定を確認してください。
データベースをディスクとして復元
$configFile = ".\database-rad.json"
az backup recoveryconfig show @databaseArgs --rp-name $dbSnapshotRpName `
--restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
--target-container-name $targetContainerName --target-server-name $targetVm `
--target-server-type SQLInstance --target-instance-name $targetInstanceName `
--snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
Set-Content -Encoding utf8 $configFile
ディスクとしてのデータベース復元、ログはファイルとして扱う
データベースのPITR例と同様に、 $pit をデータベースのログ範囲内の有効なUTC時間に設定します。 ディスクアタッチメント構成を生成し、ログファイルの宛先を設定します:
$configFile = ".\database-rad-logs.json"
az backup recoveryconfig show @databaseArgs --log-point-in-time $pit `
--restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
--target-container-name $targetContainerName --target-server-name $targetVm `
--target-server-type SQLInstance --target-instance-name $targetInstanceName `
--snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
Set-Content -Encoding utf8 $configFile
構成生成が成功したことを確認したら、生成されたマッピングを編集してください:
$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.target_directory_mapping = @{ all = 'C:\temp' }
($cfg.target_physical_path | Where-Object source_path -eq 'E:\').target_path = 'M:\'
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile
スナップショットリストアを確認して送信してください
選択した各シナリオに対して、出力を使う前に、az backup recoveryconfig showが成功することを確認してください。 生成されたファイルとボリュームのマッピングを確認してください。 異なるターゲットパスが必要なソースボリュームのみをリマップしてください。 例のドライブレターを実際のパスに置き換えてください:
$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.target_physical_path | Format-Table source_path, target_path
($cfg.target_physical_path | Where-Object source_path -eq 'E:\').target_path = 'X:\'
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile
前述の再マッピングは任意です。 選択したシナリオの意図したマッピングを保持し、データベースのディスクおよびログ ファイルの構成も含めて保持してください。
ファイルシステムの競合を解決するためにディスクデタッチメントが必要な場合は、生成された構成に明示的に承認されたディスクIDのみを追加してください。
$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.disks_to_detach_on_clash = @(
"/subscriptions/<subscription-id>/resourceGroups/<disk-rg>/providers/Microsoft.Compute/disks/<disk-name>"
)
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile
Warnung
既存のディスクを切り離すことで、宛先のワークロードが乱れることがあります。 復元を実行する前に、すべてのディスクIDと完全なリカバリー設定を確認してください。 その操作が必要であり、かつ承認されている場合を除き、オプションのディスクデタッチの例を適用しないでください。
選択した操作の設定ファイルのみを提出してください:
az backup restore restore-azurewl @vaultArgs --recovery-config $configFile
返されたジョブ名を az backup job showで追跡してください。 停止保護および登録解除コマンドについては 、「SQL インスタンスのスナップショットバックアップ管理」を参照してください。
次のステップ
関連するコンテンツ
- REST API を使用して Azure Backup を使用して Azure VM 内の SQL Server データベースをバックアップします。
- REST API を使用して Azure VM 内の SQL Server データベースを復元します。
- Azure portal、Azure CLI、REST API を使用して、Azure VM 内の SQL Server データベースを管理します。