SQL Server 2016 ではインスタンス内のデータベースのバックアップに管理対象バックアップ (マネージドバックアップ) という機能を使用することができます。
この機能は、SQL Server on Azure VM の IaaS Agent 拡張機能の自動バックアップでも使用されているものとなるのですが、SQL Server 2016 SP3 を未適用の環境で設定を行おうとしたところ次のようなエラーが発生しました。
メッセージ 45207、レベル 17、状態 2、プロシージャ sp_add_task_command、行 102 [バッチ開始行 18] The operation failed because of an internal error. 値を Null にすることはできません。 パラメーター名:sasToken Command: smartbackup configure_backup_basic 1 xxxxxxxxxxxxx== 30 Please retry later. 場所 Microsoft.WindowsAzure.Storage.Auth.StorageCredentials..ctor(String sasToken) 場所 Microsoft.SqlServer.SmartAdmin.SmartBackupAgent.FileService.VerifyContainerURL(String containerURL, SqlConnection conn) 場所 Microsoft.SqlServer.SmartAdmin.SmartBackupAgent.SmartBackup.CheckAndSetDefaultSettings(SmartBackupConfigParameters config, LogBaseService jobLogger, SqlConnection conn) 場所 Microsoft.SqlServer.SmartAdmin.SmartBackupAgent.SmartBackup.ConfigureDbOrInstance(SmartBackupConfigParameters config, LogBaseService jobLogger, SqlConnection conn) 場所 Microsoft.SqlServer.SmartAdmin.SmartBackupAgent.SmartBackup.ExternalJobHelper(String command, LogBaseService jobLogger) 場所 Microsoft.SqlServer.SmartAdmin.SmartBackupAgent.SmartBackup.ExternalJob(String command, LogBaseService jobLogger)
同様の事象を確認すると、類似の問題がいくつか確認できるのですが、自分が遭遇していたものの明確な内容が、パッと見た限りでは見つからなかったので、本事象についてなぜ発生したのかを残しておきたいと思います。
SQL Server 2016 SP3 で対応された問題
SQL Server 2016 SP3 で対応された内容については、次の情報に記載されています。
この中で管理対象バックアップに関する修正としては次の内容があります。
管理対象バックアップで使用する SAS についての問題が修正されているとあります。
この修正が上記のエラーの発生に影響しているものとなり、SP3 で修正した本内容が適用されることで、上記のエラーが発生する原因を解消することができる可能性があります。
エラーが発生する原因
管理対象バックアップを使用する場合には SAS が必要となるので、SAS の生成にはポータルで次のような設定で SAS を生成して使うことがあるのではないでしょうか。
このような設定で生成した SAS を使用して管理対象バックアップを設定すると、SP3 を未適用の環境だと、冒頭で記載したエラーが発生します。
エラーが発生する原因は SP3 で修正された内容となるのですが、この原因は、開始日時の情報が SAS に含まれており、SAS シークレットが長い情報で生成されているからのようです。
Azure ポータルから SAS を生成する場合は、開始日時を省略することができないのですが、Storage Explorer では 開始日時を設定せずに生成することができます。
他の方法としては AzureRm を使用したものとなるため、古い情報とはなるのですが、Resource Manager Powershell Script to Enable SQL Server Managed Backup to Azure を参考にして、スクリプトで SAS を生成する際にも開始日時は省略できます。(終了日時については -ExpiryTime で指定できます)
SQL Server 2016 SP3 以降であれば、開始日時が含まれている SAS でも問題なく設定はできるのですが、SP2 までのバージョンを使用するのであれば「開始日時を省略した SAS を作成する」というのをポイントとして覚えておくとよいかと。