RDS for Microsoft SQL Serverでbakファイルを使用したネイティブバックアップとリストアをしてみた

2021.10.26

こんにちは、リサリサです。

RDS for Microsoft SQL Server で、下記記事を参考に bakファイルから DB のリストアとバックアップをしてみたら、制限が緩和されているのに気が付いたので記事にしてみます。

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

RDS にはスナップショットによるバックアップとリストアがありますが、今回は bakファイルを使用したネイティブバックアップとリストアについてのお話です。

オンプレの Microsoft SQL Server で取得した bakファイルをS3を経由して、RDS for Microsoft SQL Server にリストアしたり、その逆ができたりします。

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

以前は、以下のような制限があったようなのですが、2021年現在では緩和されており、以下の制限はありません。

  • バックアップ元と同じRDSインスタンスにはリストアできません
  • 一度リストアしたバックアップファイル(bak)は、もう一度同じRDSインスタンスにリストアできません

ただ、他にも多数制限は残っておりますので、ご利用の際は以下の「制限と推奨事項」ご確認頂ければと思います。

SQL Server データベースのインポートとエクスポート - Amazon Relational Database Service 

やってみた

RDS作成

以下で作成しました。オプショングループはデフォルトではなく、作成したものを設定する必要があります。

  • Engine: SQL Server Express Edition (15.00.4073.23.v1)
  • Instance Class: db.t3.small

オプション追加

オプショングループにオプション「SQLSERVER_BACKUP_RESTOREの追加をします。

「新しいロールの作成」にすると自動でロールを作ってくれるようでしたので、こちらを利用してみました。S3バケットは事前に作成しておく必要があります。

テスト環境の用意

SSMSインストール

RDSに接続可能なWindowsを用意して、SQL Server Management Studio(以下、SSMS)をインストールします。

SQL Server Management Studio (SSMS) のダウンロード - SQL Server Management Studio (SSMS) | Microsoft Docs 

bakファイルの配置

下記ページにあるサンプルデータベースのbakファイルを使いました。

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

こちらをダウンロードして、SQLSERVER_BACKUP_RESTOREオプションに指定したS3バケットにアップロードしておきます。

今回は「arn:aws:s3:::lisalisa-bak-file-test/AdventureWorks2019.bak」に置きました。

SSMSからRDSに接続

SSMSを起動してRDSに接続します。

  • サーバー名:RDSのエンドポイント
  • 認証:SQL Server 認証
  • ログイン:管理者ユーザー名
  • パスワード:管理者パスワード

「新しいクエリ」をクリックすると、白いシートが出ます。

ここにSQLを入力して「実行」をクリックすると、クエリが実行できます。

リストアしてみる

ストアドプロシージャ msdb.dbo.rds_restore_database を使って、サンプルbakファイルをリストアしてみます。こちら(参考[1])を参考に作業していきます。

exec msdb.dbo.rds_restore_database
        @restore_db_name='test',
        @s3_arn_to_restore_from='arn:aws:s3:::lisalisa-bak-file-test/AdventureWorks2019.bak';

ステータスは、別のストアドプロシージャ msdb.dbo.rds_task_status で確認します。実行した時の task_id を見ておいて、その task_id のステータスを確認するようになります。今回は db_name で検索しています。

exec msdb.dbo.rds_task_status @db_name='test';

「lifecycle」を確認します。ここが「SUCCESS」になったら成功です。「IN_PROGRESS」や「CREATED」の時はまだ実行中なので、「% complete」で何%完了しているのかを見ながら何度か実行します。

リストアできました。

バックアップしてみる

ストアドプロシージャ msdb.dbo.rds_backup_databaseを使って、バックアップします。

exec msdb.dbo.rds_backup_database
        @source_db_name='test',
        @s3_arn_to_backup_to='arn:aws:s3:::lisalisa-bak-file-test/test_backup.bak',
        @overwrite_S3_backup_file=1;

ステータスを確認します。

exec msdb.dbo.rds_task_status @db_name='test';

バックアップも取れました。ちゃんとS3に上がっています。

バックアップをリストアしてみる

以前は制限のためにできなかった内容です。

今作成したtest_backup.bak を戻してみます。

exec msdb.dbo.rds_restore_database
        @restore_db_name='test',
        @s3_arn_to_restore_from='arn:aws:s3:::lisalisa-bak-file-test/test_backup.bak';

そのまま戻そうとすると怒られました。

Database 'test' already exists. Two databases that differ only by case or accent are not allowed. Choose a different database name.

testデータベースは既にあるから作れないと言われているので、名前を変えてみます。

exec rdsadmin.dbo.rds_modify_db_name N'test',N'test_renamed';

改めて、リストアしてみます。

exec msdb.dbo.rds_restore_database
        @restore_db_name='test',
        @s3_arn_to_restore_from='arn:aws:s3:::lisalisa-bak-file-test/test_backup.bak';

ステータスも確認します。

exec msdb.dbo.rds_task_status @db_name='test';

同RDSインスタンス内でバックアップもリストアもできました。制限は本当になくなっているようです。

最後に

以前はオンプレからRDS、RDSからオンプレの想定しかなかったからか、同RDSインスタンス内でバックアップ&リストアができませんでしたが、アップデートされ出来るようになっていました!制限があるからできないと諦めていた方のお役に立てれば幸いです。

参考

[1]SQL Server データベースのインポートとエクスポート - Amazon Relational Database Service 

[2]SQL Server のネイティブバックアップおよび復元のサポート - Amazon Relational Database Service