御成門プログラマーの技術日記

Microsoft AzureやAngularなどの技術情報を発信します。

Azure SQL Database Elastic Pool 上のDBがプール上から外れ別課金になる問題の原因と解決方法

Azure SQL Database Elastic Pool は Azure SQL Database Single Database とは違い、リソースをDBごとに持たず、1つ1つのDBが一つの大きなリソースを共有することでピーク時の性能に合わせた過剰な性能やチューニングを防ぐことができるAzureのPaaS Databaseです。今回はそんなAzure SQL Database Elastic Pool上に乗っかっているはずのDBがプール上から外れてしまい、無駄なコストがかかってしまう原因と対処方法を紹介しようと思います。

SQL Databaseの使用料金が思ったよりかかっていた。原因はPoolから外れている野良DBが発生していたからだった。

ある日、SQL Database Elastic Pool で運用しているリソースの費用が想定よりかかっていることが判明。調べてみるとあるDBが Elastic Pool 上に乗っていないようでした。

上の画像の「sqldb-onrarimon-demo2」DBの価格レベルが「汎用目的:Gen5、2仮想コア」と Single Database の価格レベルになっていました。そのため、Elastic Pool の課金に加えてSingle Database 1本分のコストが余計にかかっているようでした。本来、Elastic Pool 上に乗ってるリソースは「sqldb-onarimon-demo1」のような表記になっているはずです。

今回「sqldb-onrarimon-demo2」DBがElastic Pool 上から外れてしまった理由ですが、SSMSから直接データベースを作成するとそのようにプロビジョニングされるようです。
問題のデータベースですが、SSMS の「Database」を右クリックして出てくる「New Database」から作られていました。

Databaseを追加する場合は下記のようにAzure PortalのSQLエラスティックプールやSQLサーバーのGUI上から作成するか、Azure CLIなどを使って作成するようにしましょう。

原因はわかったので次は解決方法を紹介します。

プールから外れたデータベースをElastic Poolに追加する方法

それではそのような状況になった場合の修正手順を紹介していきます。手順はとても簡単です。

SQLエラスティックのリソースに移動します(SQL ServerやSQL データベースのリソースではない)。 「構成」→「データベース」→「データベースの追加」と進んでいきます。

「適用」を押したら元の画面で忘れずに「保存」をクリックします。

野良データベースはElatic Poolのプール内に追加されました。これでコストは当初の想定のとおりSQLエラスティックプール内での課金となります。めでたしめでたし。

データベースの追加時に「DeploymentFailed」、「ProvisioningDisabled」のエラーが出たときの対処法

上記の手順でSingle Database のデータベースを Elastic Pool に乗っけようとした際に下記のようなエラーが発生しました。

{"code":"DeploymentFailed","target":"/subscriptions/<yourSubscriptionId>/resourceGroups/<yourResouceGroupName>/providers/Microsoft.Resources/deployments/Microsoft.SQL.EditPool-<guid>","message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see
https://aka.ms/arm-deployment-operations
for usage details.","details":[{"code":"ResourceDeploymentFailure","target":"/subscriptions/<yourSubscriptionId>/resourceGroups/<yourResouceGroupName>/providers/Microsoft.Sql/servers/<yourSqlServerName>/databases/<yourDatabaseName>","message":"The resource write operation failed to complete successfully, because it reached terminal provisioning state 'Failed'."}]}
{"code":"ProvisioningDisabled","message":"'System' is not a valid database edition in this version of SQL Server."}

要因としてはシングルデータベース側で設定していた「データの最大サイズ(GB)」の設定が ElasticPool側のサービスレベルの制限事項より超えていたことが原因でした。もし、上記のようなエラーが出た場合は各々の制限事項を確認してみるといいかもしれません。
learn.microsoft.com

参考URL

docs.microsoft.com