RDS for Microsoft SQL Serverのバックアップ・リストアが簡単にできるようになりました!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。RDS for Microsoft SQL Serverは制約が多くて、、、と昨年末に書かせていただいたのですが、嬉しいリリースがあったのでご紹介したいと思います。

RDS for Microsoft SQL Serverについてのおさらい

RDS for Microsoft SQL Serverでは、他のDBエンジンと異なり、既存インスタンスのストレージサイズやストレージタイプの変更操作ができません。スナップショットからのリストア時にもこの制限がつきます。この点については、執筆時点でもアップデートはありませんでした。

リリースされた新機能

S3経由でbakファイルによるバックアップ、リストアが可能となったようです。

Amazon RDS now supports native backup and restore for Microsoft SQL Server databases using full backup files (.bak files). Amazon RDS now supports native backup and restore for Microsoft SQL Server databases using full backup files (.bak files).

日本語のドキュメントは執筆時点では更新が追いついていませんでしたが、英語ドキュメントは下記の通り、更新されていました。今回リリースされた機能を使うことで、ストレージタイプやストレージサイズが異なる環境にデータベースを容易に移行することができるようになりました。

You can't modify an existing SQL Server DB instance to change the storage type or storage allocation. Instead, you can create a backup of the database, and restore it to a new DB instance with the new storage type or storage allocation. For more information, see Importing and Exporting SQL Server Databases. Modifying a DB Instance Running the Microsoft SQL Server Database Engine - Amazon Relational Database Service

ということで、今回リリースされた機能の使い方は、下記ページにまとまっているようなので、このドキュメントの内容を確認してみます。

bakファイルを利用したバックアップ、リストアの制限

下記が制限事項となります。バックアップしたRDSインスタンスとは別のRDSインスタンスにしかリストアはできず、バックアップファイルは1つのRDSインスタンスに1度しかリストアできません。基本的には新規RDSインスタンスを用意した上でのリストアとなることに十分注意しましょう。

  • db.t1.microはbakファイルを利用したバックアップ、リストアがサポートされていません
  • バックアップ元と同じRDSインスタンスにはリストアできません(DB名を変更してもダメ)
  • 一度リストアしたバックアップファイル(bak)は、もう一度同じRDSインスタンスにリストアできません(DB名を変更してもダメ)
  • 1TBを超えるバックアップはできません
  • 4TBを超えるリストアはできません
  • メンテナンスウィンドウやスナップショット中はバックアップができません

やってみた

前置きが長くなりましたが、早速試してみましょう!今回は下記の環境を用意して試してみました。

  • Engine: SQL Server Express 2014 SP1 CU2(12.00.4422.0.v1)
  • Instance Class: db.t2.micro

(事前準備)DB Option Group設定

bakファイルを利用したバックアップ、リストアを利用するには、利用するRDSインスタンスに適切なオプショングループを設定する必要があります。まずは利用するDBエンジンに合わせてDB Option Groupを作成します。

rds_option_group1

作成したDB Option GroupにSQLSERVER_BACKUP_RESTOREオプションを追加します。この際に、RDSインスタンスが利用するIAMロールと利用するS3バケットを指定します。S3バケットは事前に作成しておく必要がありますが、IAMロールはこちらの画面から作成すれば自動で作成してくれます。

rds_option_group2

rds_option_group3

作成されたIAMロールは以下のようなパーミッションとなっていました。手動で作成する場合には、公式ドキュメントをご確認ください。

  • Permissions
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::sqlserver-backup-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectMetaData",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::sqlserver-backup-bucket/*"
            ]
        }
    ]
}
  • Trust Relationship
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

(事前準備)SQL Server Management Studioインストール

RDSに接続可能なWindowsを用意して、SQL Serverのバージョンに合わせたSQL Server Management Studio(以下、SSMS)をインストールしました。互換性はあると思いますので、おそらく他のバージョンでも大きな問題は無いと思います。

(事前準備)ストアドプロシージャの確認

SSMSから対象のRDSインスタンスに接続してみましょう。するとこんなものが確認できました。

procedure

下記4つのストアドプロシージャが今回のリリースから利用できるようになったようです。

  • dbo.rds_backup_database
  • dbo.rds_cancel_task
  • dbo.rds_restore_databse
  • dbo.tds_task_status

これらを利用してバックアップ、リストアを試して行きましょう。

bakファイルからのリストア

今回の検証では新規インスタンスから用意したので、まずリストアを試してみます。利用したのは下記ページにあるサンプルデータベースのbakファイルです。

Microsoft SQL Server Product Samples: Database - Download: Adventure Works 2014 Sample Databases

こちらをダウンロードして、SQLSERVER_BACKUP_RESTOREオプションに指定したS3バケットにアップロードしておきます。その上で、SSMSから下記のようにストアドプロシージャを実行します。

exec msdb.dbo.rds_restore_database 
        @restore_db_name='testdb', 
        @s3_arn_to_restore_from='arn:aws:s3:::sqlserver-backup-bucket/AdventureWorks2014.bak';

rds_restore1

成功したようです。ステータスを確認してみます。

exec msdb.dbo.rds_task_status @db_name='testdb'

rds_restore2

lifecycle=SUCCESSとなっていれば成功です。今回は50MB程度のbakファイルでしたが、3〜4分で終了しました。

rds_restore3

最新の情報に更新したところ、オブジェクトエクスプローラからも確認できました。

bakファイルへのバックアップ

続けてバックアップも試してみます。

exec msdb.dbo.rds_backup_database 
        @source_db_name='testdb',
        @s3_arn_to_backup_to='arn:aws:s3:::sqlserver-backup-bucket/backup/sqlserver_testbackup.bak',
        @overwrite_S3_backup_file=1;

rds_backup1

リストアと同様に、ステータスを確認してみます。

exec msdb.dbo.rds_task_status @db_name='testdb'

rds_backup2

リストアよりもバックアップの方が少し時間がかかったようです。

rds_backup3

なぜか元のファイルよりもかなり大きくなってしまいましたが、S3バケット内に格納されたことも確認できました。

制限事項の確認

試しにデータベース名を変更してみます。

EXEC rdsadmin.dbo.rds_modify_db_name N'testdb', N'testdb_renamed';

その上で、再度同じbakファイルから同じデータベース名に対してリストアを実行してみました。

restore_error

一瞬実行できてしまうのでは?と疑いましたが、公式ドキュメントに記載の通りでした。データベース名に関係無く、同じbakファイルから同一RDSインスタンスへのリストアは1度しかできないようです。

Task execution has started.
The file 'D:\rdsdbdata\DATA\AdventureWorks2014_Data.mdf' cannot be overwritten.  It is being used by database 'testdb_renamed'.
File 'AdventureWorks2014_Data' cannot be restored to 'D:\rdsdbdata\DATA\AdventureWorks2014_Data.mdf'. Use WITH MOVE to identify a valid location for the file.
The file 'D:\rdsdbdata\DATA\AdventureWorks2014_Log.ldf' cannot be overwritten.  It is being used by database 'testdb_renamed'.
File 'AdventureWorks2014_Log' cannot be restored to 'D:\rdsdbdata\DATA\AdventureWorks2014_Log.ldf'. Use WITH MOVE to identify a valid location for the file.
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
RESTORE DATABASE is terminating abnormally.
AdventureWorks2014.bak: S3 processing completed successfully
Aborted the task because of a task failure or a concurrent RESTORE_DB request.
AdventureWorks2014.bak: S3 processing has been aborted
Unable to retrieve family guid for database name: testdb

他のRDSインスタンスにリストアする分には、インスタンスタイプやストレージタイプ、ストレージサイズに依存することなくリストアできることは確認できました。

まとめ

制約が多く使いづらい印象もあったRDS環境のMS SQL Serverでしたが、bakファイル利用のサポートで完全バックアップ、リストアを安心してできるようになりました。ただし、スナップショットの操作とは異なり、AWSマネージメントコンソールからの操作はできませんのでご注意ください。

どこかの誰かのお役に立てば嬉しいです。