Azure Blob Storageを利用したSQL Serverのバックアップ・復元でできることを理解する

こんにちは。今日は、SQL ServerのバックアップをAzure Blob Storage上で管理する方法を試してみたので、手順や分かったことのメモを残しておきたいと思います。

それではまいります。

Azure Storageを使用した SQL Server のバックアップと復元の概要

Azure Storage を使用した SQL Server のバックアップと復元の方法 – SQL Server on Azure VMs | Microsoft Docs

  • SQL Server 2012 SP1 CU2以降、Azure Blob Storageへのバックアップがサポートされた
  • Azure Storageを利用することで、バックアップ保存用のハードウェア管理からの解放、Geoレプリケーション機能による高可用性、無制限のストレージ、安価なコストといった多くのメリットが得られる
  • SQL Server 2016で追加された「ファイルスナップショットバックアップ」機能を利用すると、バックアップと復元がほぼ瞬時に行えるようになる
  • Azure Blob Storageへの接続には、アカウントキーを利用するか、SQL Server 2016以降はSASトークンを利用する方法も利用できる
  • Azure Blob Storageに保存できるバックアップファイルの形式には、ページBlobと、SQL Server 2016以降にサポートが追加されたブロックBlobの2種類がある。(SQL Server 2014以前はページBlobのみ)Azure Blob Storageへの接続にアカウントキーを利用している場合にはページBlob形式で、SASキーを利用している場合にはブロックBlob形式で保存される。(どちらを採用すべきかは、次のセクションで)

スナップショットバックアップが気になる!そもそものSQL Serverのスナップショット機能については以下の図説が分かりやすかったです。

今から始めるSQL Server 2005[第3回]バックアップ/リストアの高速化(2) | 日経クロステック(xTECH) (nikkei.com)

公式Docsは以下。

データベース スナップショット (SQL Server) – SQL Server | Microsoft Docs

Azure でのデータベース ファイルのファイル スナップショット バックアップ – SQL Server | Microsoft Docs

公式ドキュメントをなんとか読み解いてみようとしましたが、①のPre-backupがよく分からない・・

  • ②③データベーススナップオプションを付与してバックアップすると、データファイルとログファイルに対するスナップショットと、そのポインタ情報を保持する.bakファイルが生成される(スナップショットの生成なので、従来のバックアップよりも高速)
  • ①スナップショットの参照先データ(データファイルとログファイル)は事前に同じストレージに保持している?これはどうやって実現している?
  • Blob Storage上の参照元データが壊れたらスナップショット・バックアップが機能しなくなると思うけど、この参照元データ自体、バックアップされたもの?だとしたら、バックアップ側(Azure Blob Storage上)では、元データは1セットだけ持っておき、その後のバージョンはすべてスナップショットで保持する、という考え方も分からなくはない・・そゆこと・?

分かったらまた更新します。

ベストプラクティス

Azure Storageへの接続と保存方法についてのプラクティスは以下に。

SQL Server Backup to URL for Microsoft Azure Blob Storage – SQL Server | Microsoft Docs

  • SQL Server 2016以降を利用しているなら、ブロックBlobで保存することが推奨。理由は以下。
    • ブロックBlobでの保存に対応しているSASトークンは、従来のアカウントキーよりも安全な認証方法であること
    • ブロックBlob形式の方が、バックアップと復元のパフォーマンス向上が期待できること
    • ブロックBlob形式の方がページBlobより安価であること

Microsoft Azure Blob Storage に対する Backup to URL のベスト プラクティスおよびトラブルシューティング – SQL Server | Microsoft Docs

  • 色々と書いていますが、Storageのセキュリティ設定ちゃんとしてね、というのと、SQL ServerとAzure Blob Storage間の通信を効率的に行うために圧縮とか転送サイズ調整してね、ということのようです。

実際に試してみた

手順はこのあたりにまとまっています。

チュートリアル: Azure Blob Storage と SQL Server 2016 の使用 – SQL Server | Microsoft Docs

クイックスタート: Azure Blob Storage へのバックアップと復元 – SQL Server | Microsoft Docs

大きく、以下のステップがあります。

  • バックアップ先コンテナでSAS URLを発行
  • データベースにAzure Storageへの資格情報(バックアップ先コンテナのURLとSASキーの情報)を作成する
  • その資格情報を利用してバックアップ

なお、今回はオンプレのSQL Server 2022プレビュー版から試してみています。

SASトークンの発行

まず、バックアップ先コンテナでSASトークンを発行します。リンクの手順ではPowerShellを使っていますが、今回は簡単のためポータル上の操作で発行。

このSASトークンを控えておき、今度はデータベース上で資格情報を以下コマンドで作成します。

SASを利用して資格情報の作成

USE master  

CREATE CREDENTIAL [https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>] 
WITH IDENTITY='SHARED ACCESS SIGNATURE' 
 , SECRET = '★SASトークン★' 
GO

作成した資格情報はsys.credentialsから確認できます。

select * from sys.credentials;

バックアップの実行

最後に、バックアップの実行です。以下コマンドでできるとチュートリアルには書いていますが、何故かエラー。。あれ、おかしいな。。

USE master;  
ALTER DATABASE AdventureWorks2019 
   SET RECOVERY FULL;  


BACKUP DATABASE AdventureWorks2019   
   TO URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2019_onprem.bak'  
URL の周辺に正しくない構文があります。

パッと見あっている気がするんだけど、なぜエラーが出ているのかよく分からず・・。

切り分けのためSSMSのウィザードから試してみたら、問題なくバックアップできました。ちなみにウィザードからクエリを抽出してそのままたたいてみても、同じエラー。構文も上のものと同じっぽいし、、よくわからん・・

分かったらまた更新します。

最終的には、こんな感じで.bakファイルが指定したコンテナに生成されました!

リストアの実行

続いて、リストアも試しておきます。

リストア動作確認のため、今回はいったんローカルのデータベースを削除。

USE [master]
GO
DROP DATABASE AdventureWorks2019
GO
USE [master]
RESTORE DATABASE [SQLTestDB] FROM 
URL = N'https://msftutorialstorage.blob.core.windows.net/sql-backup/sqltestdb_backup_2020_01_01_000001.bak'

あれ、また同じエラーが。。

同様にウィザードからだと問題なく実行できたので、何か構文に誤りがあったのかも?こちらもわかったらまた更新します。

*ウィザードから実施する際、バックアップファイルを読み取るためにまたSASの発行が求められました。

スナップショットバックアップ

チュートリアル: Azure Blob Storage と SQL Server 2016 の使用 – SQL Server | Microsoft Docs

最後に、よりバックアップと復元が高速になると言われているスナップショットバックアップも試してみようと思ったのですが、クエリがエラーになる&こちらはSSMSのバックアップ画面からは指定できなさそうだったので断念・・

クエリとしては、以下のようにWITH FILE_SNAPSHOTオプションをつけるだけで良いみたい。

BACKUP DATABASE AdventureWorks2019 
TO URL = N'https://storageforsqldb013.blob.core.windows.net/onprembackup/adventureworks2019_snapshot.bak'   
WITH FILE_SNAPSHOT;

以上、Azure Blob Storageを利用したバックアップ・復元について分かったことのメモでした。

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。