Azure SQL Databaseリストア手法まとめ

Azure SQL Databaseのリストア手法がいくつかあったので纏めてみました。

# バックアップ
SQL Databaseではユーザが意識することなく、自動的にバックアップが取得されています。
取得タイミングはAzure側で決定されるため、ユーザが指定することはできません。

* 取得サイクル
    * 完全バックアップ
        * 毎週
    * 差分バックアップ
        * 数時間に1回
    * トランザクションログバックアップ
        * 5～10分に1回

バックアップ保存期間はSQL Databaseのサービスレベルによって異なります。

* 保存期間
    * Basic
        * 7日間
    * Standard
        * 35日間
    * Premium
        * 35日間

# リストア

## Point in Timeリストア

### 概要
* 同一サーバ内に新規データベースとして復元する手法
* 保存期間に合わせた任意の時間に復元することが可能
* 主な利用用途は、何か不具合発生時に過去に遡って検証したいケースが考えられます

### イメージ図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/bb0b094d-2753-17bb-2d6c-c600140a60d1.png)

### リストア手順
* データベース概要ページから復元を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/97f017dd-6c1d-420a-1271-015b78c3f8f3.png)
<br>

* 復元ポイントを選択。論理サーバは変更することができません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2941bef0-fdf4-bd92-e9cf-b48a39c3d89d.png)
<br>

* 新しくデータベースが作成されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b09ac918-3b08-2f0b-78dc-aabf8543000f.png)
<br>

## データベースコピー

### 概要
* 最新時点のデータベースコピーを作成する手法
* Point in Timeリストアと違い、任意の時点を指定することはできません
* 同じサーバだけでなく、異なるサーバー、異なるリージョンのサーバーにコピーすることが可能
* 主な利用用途は、最新の本番データを開発/検証用の論理サーバーで利用したいケースが考えられます

### イメージ図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/111c0cc5-4ac4-7b2e-d500-b74f9828004d.png)

### リストア手順
* データベース概要ページからコピーを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8d40afe8-629d-af98-042d-fdac45cbd821.png)
<br>

* コピー先のサーバーを選択します（異なるリージョンでも可能。この画面で新規作成してもよい）
* 復元ポイントを選ぶことはできません
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3fcbdfc9-9112-aa7e-e095-7e24e5592894.png)

## geoリストア

### 概要
* 1時間前の状態の新規データベースとして復元する手法
* 任意の時点を指定することはできない
* 同じサーバだけでなく、異なるサーバー、異なるリージョンのサーバーに作成することが可能
* 利用用途としては、リージョンが全滅した場合に、1時間前であれば他のリージョンで起動することができるというDR用途です
* よりRTO/RPOを求めるのであれば、アクティブgeoレプリケーションを選定することになります

### イメージ図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ddfcb893-4e43-bb09-0db7-6023b20ec78a.png)

### リストア手順
* データベース新規作成画面で、ソースを空のデータベースではなく、バックアップを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6d9b36bb-9818-b8c0-3bf2-1b34e14a6348.png)
<br>

* 対象のバックアップデータを選択して、データベースを新規作成します。1時間前のデータしか選べません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/bd8ae7ff-8adb-046d-04e3-c4e6734cce59.png)

## 長期保管
バックアップは最大35日保管できますが、バックアップ先にAzure Backupを指定することで最大10年間保管することが可能です。
設定の注意点としては、SQL Databaseと同じサブスクリプション・リージョン・リソースグループにAzure Backupを配置する必要があります。

### バックアップ手順
* 論理サーバー概要ページの長期的なバックアップ保有期間を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b7af36f2-73b4-7669-6f79-fe6b4d4d2d35.png)
<br>

* 現時点でプレビューなので、プレビュー使用条件に承諾します

* バックアップ対象データベースを選択します
* データベースのチェックができない場合は、一度ページを変えて、再度長期的なバックアップ保有期間を選択すると選べるようになります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/84210f40-ef06-3261-f4d8-1823600c45d3.png)

* Azure Backupのコンテナーを選択し、保有期間を設定します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/5d9b4226-3e82-db23-0833-cb3d17a6466e.png)

### リストア手順
* Point in Timeリストアの[長期]から古いバックアップデータを選択することができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fbbbfa12-345a-8294-3347-94a1074526b7.png)

## 番外編：長期保管に使用したBackupコンテナーが消せない？

SQL Databaseの長期保管を停止しただけではBackupコンテナーが消せませんでした。
バックアップデータが残ってるだけでもダメみたいです。
以下のPowerShellコマンドを実行するとBackupコンテナーが消せるようになったので、Cloud Shell(PowerShell)でサクッとやりましょう。

```
$vault = Get-AzureRmRecoveryServicesVault -Name [Container Name]
Set-AzureRmRecoveryServicesVaultContext -Vault $vault
$container = Get-AzureRmRecoveryServicesBackupContainer -ContainerType AzureSQL -FriendlyName $vault.Name
$item = Get-AzureRmRecoveryServicesBackupItem -container $container -WorkloadType AzureSQLDatabase
$item.Id = [System.Web.HttpUtility]::UrlDecode($item.Id)
Disable-AzureRmRecoveryServicesBackupProtection -item $item -RemoveRecoveryPoints -ea SilentlyContinue
Unregister-AzureRmRecoveryServicesBackupContainer -Container $container
```