Azure CLI を使用して Azure VM 内の SQL データベースをバックアップする

Azure CLI は、コマンドラインやスクリプトで Azure リソースを作成および管理するために使用します。 この記事では、Azure VM で SQL データベースをバックアップし、Azure CLI を使用してオンデマンド バックアップをトリガーする方法について説明します。 これらのアクションは、Azure portal を使用して実行することもできます。

この記事は、Azure VM に SQL データベースが既にインストールされていることを前提としています。 (Azure CLI を使用して VM を作成することもできます)。

この記事では、次の方法について学習します。

  • Recovery Services コンテナーを作成する
  • SQL サーバーを登録し、そこでデータベースを検出する
  • SQL データベースでバックアップを有効にする
  • オンデマンド バックアップをトリガーする

現在サポートされているバックアップと復元のシナリオを確認するには、サポート マトリックスを参照してください。 よく寄せられる質問については、 よく寄せられる質問を参照してください。

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

Recovery Services コンテナーを作成する

Recovery Services コンテナーは、Azure VM や Azure VM 上で実行されているワークロード (SQL や HANA データベースなど) といった各保護リソースのバックアップ データを格納する論理コンテナーです。 保護されたリソースのバックアップ ジョブを実行すると、Recovery Services コンテナー内に復元ポイントが作成されます。 この復元ポイントのいずれかを使用して、データを特定の時点に復元できます。

az backup vault create コマンドを使用して Recovery Services コンテナーを作成します。 保護する VM のものと同じリソース グループと場所を使用します。 Azure CLI を使って Windows VM と Linux VM を作成する方法について説明します。

この記事では、次のものを使用します。

  • SQLResourceGroup という名前のリソース グループ
  • testSQLVM という名前の VM
  • westus2 の場所にあるリソース。

次のコマンドを実行して、SQLVault という名前のコンテナーを作成します。

az backup vault create --resource-group SQLResourceGroup \
    --name SQLVault \
    --location westus2

既定では、Recovery Services コンテナーが geo 冗長ストレージ用に設定されています。 geo 冗長ストレージでは、プライマリ リージョンから数百マイル離れていたとしても、セカンダリ Azure リージョンにバックアップ データが確実にレプリケートされます。 ストレージの冗長性設定を変更する必要がある場合は、az backup vault backup-properties set コマンドを使用します。

az backup vault backup-properties set \
    --name SQLVault  \
    --resource-group SQLResourceGroup \
    --backup-storage-redundancy "LocallyRedundant/GeoRedundant"

コンテナーが正常に作成されたかどうかを確認するには、 az backup vault list コマンドを使用します。 応答は次のように表示されます。

Location   Name             ResourceGroup
---------  ---------------  -------------  
westus2    SQLVault     	SQLResourceGroup

SQL Server を登録して保護する

SQL Server を Recovery Services コンテナーに登録するには、az backup container register コマンドを使用します。 VMResourceId は、SQL をインストールするために作成した VM のリソース ID です。

az backup container register --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --workload-type SQLDataBase \
    --backup-management-type AzureWorkload \
    --resource-id VMResourceId

注

VM がコンテナーと同じリソース グループにない場合、SQLResourceGroup では、コンテナーが作成されたリソース グループが使用されます。

SQL サーバーを登録すると、現在のすべてのデータベースが自動的に検出されます。 ただし、今後追加される可能性のある新しいデータベースを検出するには、登録済み SQL サーバーに追加された新しいデータベースの検出に関するセクションを参照してください。

SQL インスタンスがコンテナーに正常に登録されているかどうかを確認するには、az backup container list コマンドを使用します。 応答は次のように表示されます。

Name                                                    Friendly Name    Resource Group        Type           Registration Status
------------------------------------------------------  --------------   --------------------  ---------      ----------------------
VMAppContainer;Compute;SQLResourceGroup;testSQLVM   	testSQLVM        SQLResourceGroup  		AzureWorkload  Registered

注

上記の出力の列 name は、コンテナー名を示しています。 このコンテナー名は、次のセクションで、バックアップを有効にしてトリガーするために使用されます。 たとえば、VMAppContainer;Compute;SQLResourceGroup;testSQLVM のように指定します。

SQL データベースでバックアップを有効にする

az backup protectable-item list コマンドを使うと、前の手順で登録した、SQL インスタンスで検出されたすべてのデータベースが一覧表示されます。

az backup protectable-item list --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --workload-type SQLDataBase \
	--backup-management-type AzureWorkload \
	--protectable-item-type SQLDataBase \
    --output table

バックアップ対象のデータベースがこの一覧に表示され、次のようになります。

Name                           		Protectable Item Type    ParentName    ServerName    	IsProtected
-----------------------------  		----------------------   ------------  -----------   	------------
sqldatabase;mssqlserver;master      SQLDataBase              MSSQLServer   testSQLVM        NotProtected  
sqldatabase;mssqlserver;model       SQLDataBase              MSSQLServer   testSQLVM        NotProtected  
sqldatabase;mssqlserver;msdb        SQLDataBase              MSSQLServer   testSQLVM        NotProtected  

次に、sqldatabase;mssqlserver;master データベースのバックアップを 構成します。

データベース上のバックアップを設定し保護するには、 az backup protection enable-for-azurewl コマンドを使ってください。 使用するポリシーの名前を指定します。 CLI を使用してポリシーを作成するには、az backup policy create コマンドを使用します。 この記事では SQLPolicy ポリシーを使用しています。

az backup protection enable-for-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --policy-name SQLPolicy \
    --protectable-item-name "sqldatabase;mssqlserver;master"  \
    --protectable-item-type SQLDataBase \
    --server-name testSQLVM \
    --workload-type SQLDataBase \
    --output table

SQL Always On 可用性グループがあり、可用性グループ内の保護可能なデータソースを識別する場合は、同じコマンドを使用できます。 ここでは、保護可能な項目の種類は SQLAG です。

上記のバックアップ構成が完了したかどうかを確認するには、az backup job list コマンドを使用します。 出力は次のように表示されます。

Name                                  Operation         Status     Item Name   Start Time UTC
------------------------------------  ---------------   ---------  ----------  -------------------  
e0f15dae-7cac-4475-a833-f52c50e5b6c3  ConfigureBackup   Completed  master         2019-12-03T03:09:210831+00:00  

az backup job list コマンドを実行すると、登録、バックアップの構成、バックアップ データの削除などの他の操作に加えて、保護されたデータベース上で実行されたか、現在実行中のすべてのバックアップ ジョブ (スケジュール済みまたはオンデマンド) が一覧表示されます。

注

Azure Backup では、Azure VM で実行されている SQL データベースをバックアップしている場合、夏時間変更に合わせた自動調整は行われません。

必要に応じて手動でポリシーを変更してください。

自動保護を有効にする

シームレスなバックアップ構成の場合、将来追加されるすべてのデータベースを特定のポリシーで自動的に保護できます。 自動保護を有効にするには、 az backup protection auto-enable-for-azurewl コマンドを使用します。

この命令では将来のすべてのデータベースがバックアップされるため、処理は SQLInstance レベルで行われます。

az backup protection auto-enable-for-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --policy-name SQLPolicy \
    --protectable-item-name "sqlinstance;mssqlserver"  \
    --protectable-item-type SQLInstance \
    --server-name testSQLVM \
    --workload-type MSSQL\
    --output table

オンデマンド バックアップをトリガーする

オンデマンドバックアップをトリガーするには、az backup protection backup-now コマンドを使用します。

注

このバックアップの保持期間は、実行したオンデマンド バックアップの種類によって決まります。

  • On-demand full では、バックアップが最短で "45 日間"、最大で "99 年間" 保持されます。
  • On-demand copy only full では、保持期間のいかなる値も受け入れます。
  • On-demand differential では、ポリシーで設定されたスケジュールされた差分の保持に従ってバックアップが保存されます。
  • On-demand log では、ポリシーに設定されているスケジュールされたログの保持に従ってバックアップが保持されます。
az backup protection backup-now --resource-group SQLResourceGroup \
    --item-name "sqldatabase;mssqlserver;master" \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --backup-type Full \
    --retain-until 01-01-2040 \
    --output table

出力は次のように表示されます。

Name                                  ResourceGroup
------------------------------------  -------------
e0f15dae-7cac-4475-a833-f52c50e5b6c3  sqlResourceGroup

応答によってジョブ名がわかります。 このジョブ名と az backup job show コマンドを使用してジョブの状態を追跡できます。

SQLインスタンスのスナップショットバックアップを設定する

以下のスナップショット例は PowerShellシェル構文を使用しており、行の継続のためのバックティックや一般的なCLI引数のための配列スプラッティングが含まれます。 それらはBashのスクリプトではありません。 ここに示すスナップショット オプションを利用できる Azure CLI バージョンを使用し、スナップショット サポート マトリックスとスナップショットの前提条件を確認してください。

コマンドを実行する前に、すべてのプレースホルダーを置き換えてください。 意図した操作だけを実行してください。例は別々のワークフローであり、完全に実行する単一のスクリプトではありません。

スナップショットバックアップ変数を設定する

VMが別のサブスクリプションにあっても、 Vaultのサブスクリプションとリソースグループを活用してください:

$vaultSubscription = "<vault-subscription-id>"
$vaultRg = "<vault-rg>"
$vaultName = "<vault-name>"
$sourceVm = "<source-vm-name>"
$instanceName = "<instance-name>"
$snapshotRg = "<snapshot-resource-group-name>"
$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

スナップショットポリシーファイルを準備する

$snapshotRgを実際のスナップショットリソースグループ名に設定してください。 この例では7日間のデイリーとログの保持、そして5日間の即時スナップショット保持を用いています。 デイリーおよびログの保持は少なくとも7日間でなければなりません。インスタントスナップショットの保持は別途設定されます。

ユーザー割り当てマネージド ID を読み取り、ポリシー オブジェクトを作成します:

$identityJson = az identity show --ids $uamiId --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the managed identity." }
$identity = $identityJson | ConvertFrom-Json
$snapshotTime = "2026-10-15T02:00:00Z"
$policy = @{
    properties = @{
        backupManagementType = "AzureWorkload"
        workLoadType = "SQLInstance"
        vmWorkloadPolicyType = "SnapshotV2"
        settings = @{ timeZone = "UTC"; issqlcompression = $false; isCompression = $false }
        subProtectionPolicy = @(
            @{
                policyType = "SnapshotFull"
                schedulePolicy = @{
                    schedulePolicyType = "SimpleSchedulePolicy"
                    scheduleRunFrequency = "Daily"
                    scheduleRunTimes = @($snapshotTime)
                }
                retentionPolicy = @{
                    retentionPolicyType = "LongTermRetentionPolicy"
                    dailySchedule = @{
                        retentionTimes = @($snapshotTime)
                        retentionDuration = @{ count = 7; durationType = "Days" }
                    }
                }
                snapshotBackupAdditionalDetails = @{
                    instantRpRetentionRangeInDays = 5
                    instantRPDetails = $snapshotRg
                    userAssignedManagedIdentityDetails = @{
                        identityArmId = $uamiId
                        identityName = $identity.name
                        userAssignedIdentityProperties = @{
                            clientId = $identity.clientId
                            principalId = $identity.principalId
                        }
                    }
                }
            },
            @{
                policyType = "Log"
                schedulePolicy = @{
                    schedulePolicyType = "LogSchedulePolicy"
                    scheduleFrequencyInMins = 60
                }
                retentionPolicy = @{
                    retentionPolicyType = "SimpleRetentionPolicy"
                    retentionDuration = @{ count = 7; durationType = "Days" }
                }
            }
        )
    }
}

別のスナップショット専用ファイルを作成するには、ログサブポリシーを削除する前にスナップショットとログのポリシーを保存します:

$policy | ConvertTo-Json -Depth 100 |
    Set-Content -Encoding utf8 ".\sqlinst-snaplog-policy.json"
$policy.properties.subProtectionPolicy = @(
    $policy.properties.subProtectionPolicy | Where-Object policyType -eq "SnapshotFull"
)
$policy | ConvertTo-Json -Depth 100 |
    Set-Content -Encoding utf8 ".\sqlinst-snapshot-policy.json"

スナップショットポリシーの作成

それぞれのファイルから対応する2つのポリシーを作成します。 バックアップを有効にする際には、ご自身の保護要件に合ったポリシーを選択してください:

az backup policy create @vaultArgs --name "SqlInst-SnapLog" `
    --backup-management-type AzureWorkload --workload-type SQLInstance `
    --policy ".\sqlinst-snaplog-policy.json"

az backup policy create @vaultArgs --name "SqlInst-SnapOnly" `
    --backup-management-type AzureWorkload --workload-type SQLInstance `
    --policy ".\sqlinst-snapshot-policy.json"

az backup policy show @vaultArgs --name "SqlInst-SnapLog" --output json

インスタンス保護のためにVMを登録します

別のサブスクリプションの VM については、そのリソース ID とコンテナー サブスクリプションを指定してください。 オプションの --container-sub-id エイリアスは以下の --container-subscription-idを置き換えることができます:

az backup container register @vaultArgs `
    --resource-id "/subscriptions/<vm-subscription-id>/resourceGroups/<vm-rg>/providers/Microsoft.Compute/virtualMachines/<vm-name>" `
    --backup-management-type AzureWorkload --workload-type SQLInstance `
    --container-subscription-id "<vm-subscription-id>"

保護可能な事例を検出

ディスカバリーはSQLコンポーネントに MSSQL を使用しています。 コンポーネントを一覧にし、サーバーごとにインスタンスをフィルタリングし、目的のインスタンスを取得します:

az backup protectable-item list @vaultArgs --workload-type MSSQL --output json
az backup protectable-item list @vaultArgs --workload-type MSSQL `
    --protectable-item-type SQLInstance --server-name $sourceVm --output json
az backup protectable-item show @vaultArgs --workload-type MSSQL `
    --protectable-item-type SQLInstance --name $instanceName --server-name $sourceVm --output json

スナップショット保護を有効にする

スナップショットポリシーを選択し、保護するユーザーデータベースを選択します

az backup protection enable-for-azurewl @vaultArgs `
    --policy-name "SqlInst-SnapLog" --workload-type SQLInstance `
    --protectable-item-type SQLInstance --protectable-item-name $instanceName `
    --server-name $sourceVm --child-database-names "Testdb1" "Testdb2" "Testdb4"

オンデマンドのスナップショットバックアップをトリガーする

登録されたコンテナーと保護された項目をリストアップしてください。 作り込むのではなく、彼らの正式な現地名を正確にコピーする:

az backup container list @vaultArgs --backup-management-type AzureWorkload `
    --query "[].{Name:name,VM:properties.friendlyName}" --output table
$containerName = "<native-source-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")

$retainUntil = (Get-Date).ToUniversalTime().AddDays(45).ToString("dd-MM-yyyy-HH:mm:ss")
az backup protection backup-now @instanceArgs --backup-type SnapshotFull --retain-until $retainUntil

返却されたジョブ名を az backup job show で進捗を監視してください。 リカバリーポイントおよび復元コマンドについては、「 SQLインスタンスのスナップショットを復元する」を参照してください。

次のステップ