こんにちわ。ますの(@masno_soy)です。
SQL ServerをRDSに実装してあれこれやっている部署より、「SQL ServerのバックアップデータをS3に別途保存しておきたい」という依頼を貰いました。
ますのさん、こう思ってしまったのです。
RDSのバックアップ機能だけではご満足いただけないので。。。^q^
どうやらご満足いただけないようでした。
RDSの自動バックアップデータからの戻し作業ですが、計測すると1時間弱かかってしまう様子。ネイティブバックアップデータからの戻しの方が若干スピードは上げられそうな印象でした。
AWSも手順を公開していたので需要はあるようですね。データベースを触らないわたしとしては新たな世界を見たそんな気持ちになりましたのです。
参考1:SQL Server を実行している Amazon RDS DB インスタンスのネイティブバックアップを実行する方法を教えてください
参考2:SQL Server データベースのインポートとエクスポート
つまり、RDSのバックアップデータから戻す工程は3つ。
「インスタンス削除」「バックアップDB復元」「各種ステータス再設定」マルチAZ設定をしているので、RDSでの復元は各作業で20分程度の待機時間が発生したのです。
【手順概要】RDS DBインスタンス:SQLServerをS3にネイティブバックアップを実行する
参考サイトを実施したところ、以下の段階を踏むことでクエリを発行してS3にバックアップすることが出来ました。
- 保存先のS3バケットを作成
- RDSのSQL Server用オプショングループを作成
- バックアップオプションの追加&IAMロールの紐づけ
- SQL Serverのバックアップ実行&S3に保存するためのIAMロールの設定
- RDSのオプショングループ設定で④で作成したオプショングループを紐づける
今回はS3バケットの作成は省略します。
RDSのSQL Server用オプショングループを作成
先ずはRDSのオプショングループを作成します。
以下の項目を各自の環境に合わせて設定します。
オプショングループに「SQLSERVER_BACKUP_RESTORE」のオプションを追加する
続いてオプショングループの追加オプションに「SQLSERVER_BACKUP_RESTORE」を追加して、ネイティブバックアップの実行可能な設定を追加します。
AWS管理コンソール>RDS>オプショングループ>作成したオプショングループを選択>オプションの追加をクリック
最後に「オプションの追加」を実行して適用されるのです。
SQL Serverのバックアップ実行&S3に保存するためのIAMロールを設定
ここまででネイティブバックアップ実行のための作成等は完了しています。
続いて、作成したIAMに「S3への保存を許可する」権限を付与します。
AWS管理コンソール>IAM>ロール>(作成したロール名)をクリック
ポリシー「sqlNativeBackup-(日付)」が作られているためJSONの中身を確認します。
通常であればデフォルト設定で良いのですが、今回は「特定のS3バケット」のみに書き込みとしたいためポリシーに手を加えます。
{
"Version": "2012-10-17",
"Statement":
[
{
"Effect": "Allow",
"Action":
[
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::bucket_name"
},
{
"Effect": "Allow",
"Action":
[
"s3:GetObject",
"s3:PutObject",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::bucket_name/*"
}
]
}
作成したオプショングループとRDS SQL Serverを紐づける
指定したS3に対してアップロード権限を付与したIAMロールが、RDSのオプショングループに付与されました。
最後にRDSのSQL Serverに作成したオプショングループを設定すれば、権限付与の完了となります。
AWS管理コンソール>RDS>データベース>(バックアップを実行したいSQL Server)を選択>「変更」をクリック
下図のように「オプショングループ」を作成したオプショングループに変更します。
変更後は「今すぐ適用」で設定すると即時反映されます。
※実施の際はRDSが変更中ステータスになるので、本番実装等あるようであれば各自判断にて。
SQL Serverに接続してバックアップの実行や復元などを実施する
あとはSQL Server Management Studioで対象のRDSにログインして、以下のクエリを実行するだけでOKです。
データベースのバックアップを実行する
exec msdb.dbo.rds_backup_database
@source_db_name='database_name', @s3_arn_to_backup_to='arn:aws:s3:::bucket_name/file_name',
@overwrite_S3_backup_file=1;
実行結果を確認する
exec msdb.dbo.rds_task_status @db_name='database_name'
S3にデータがバックアップされない場合、このコマンドでERROR確認をすることができるのです。
もし困ったことがあったら「exec msdb.dbo.rds_task_status」でSUCCESSになっているか確認するであります!
exec msdb.dbo.rds_restore_database
@restore_db_name='database_name',
@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name_and_extension';
SQLServerが世の中的に利用されていることを認知していないますのです。
この設定が今後の糧になることを信じて備忘を残すのです。