Pocket

Azure SQLデータベースのDTUをPowerShellを使って自動変更する方法

  • add this entry to hatena bookmark

Azure SQL Database (シングルデータベース)では、DTU(データベース トランザクション ユニット)によって料金が異なりますが、DB使用率が高い時間帯と低い時間帯の差異が大きい場合、利用料金が気になってしまう事もあるかと思います。

例えば、DB使用率の高い昼間は「S2」で運用し、DB使用率の低い夜間は「S1」で運用したい場合、Windowsマシンと PowerShell 、タスクスケジューラを使って自動化する事が可能です。

ただし、注意点もありますので、よく検証の上で導入判断を行う必要もあります。

1.注意点

データベースのDTUを変更する際には、データベースの接続は一時的に切断されてしまいます。よって、データベースのダウン(接続不可な状態)が通常許容できない場合は、頻繁にDTUの変更を実施する事は難しくなると考えられます。

本ページの記載内容を導入検討する際には、事前に十分な検証の上で、自己責任で導入判断をしていただくようお願いします。

 

2.Azure の Windows仮想マシンでPowerShell を使えるようにする

まずは、Microsoft Azure のWindows仮想マシンで、PowerShellを使える状態にします。

Microsoft Azure のWindows仮想マシンで PowerShell を使う方法 を参照してください。

 

3. PowerShell スクリプトを用意する

実行すると データベースのDTUを「S1」に設定するPowerShellスクリプトと、実行するとデータベースのDTUを「S2」に設定するPowerShellスクリプトを用意します。

ここでは、「C:\Data\SetAzureSQL_S1.ps1」を、DTUを「S1」に設定するPowerShellスクリプトとします。内容は下記のようになります。(詳細は、MSサイトをご確認ください。)

$SubscriptionId = "ef6xxxxx-xxxx-xxxx-xxxx-bfxxxxxxxxx"
$ServerName     = "k8fxxxxxxx"
$DatabaseName   = "FBRDB"
$Edition        = "Standard"
$Level          = "S1"

Select-AzureSubscription -SubscriptionId $SubscriptionId
$ServiceObjective = get-azuresqldatabaseserviceobjective -ServerName $ServerName -ServiceObjectiveName $Level
$ScaleRequest = Set-AzureSqlDatabase -DatabaseName $DatabaseName -ServerName $ServerName -Edition $Edition -ServiceObjective $ServiceObjective -Force
$ScaleRequest

DTUを「S2」に設定するPowerShellスクリプト「C:\Data\SetAzureSQL_S2.ps1」は下記のようになります。S1用のPowerShellスクリプトとの差異は「S1」を「S2」にしただけです。

$SubscriptionId = "ef6xxxxx-xxxx-xxxx-xxxx-bfxxxxxxxxx"
$ServerName     = "k8fxxxxxxx"
$DatabaseName   = "FBRDB"
$Edition        = "Standard"
$Level          = "S2"

Select-AzureSubscription -SubscriptionId $SubscriptionId
$ServiceObjective = get-azuresqldatabaseserviceobjective -ServerName $ServerName -ServiceObjectiveName $Level
$ScaleRequest = Set-AzureSqlDatabase -DatabaseName $DatabaseName -ServerName $ServerName -Edition $Edition -ServiceObjective $ServiceObjective -Force
$ScaleRequest

 

4.PowerShell でスクリプトを実行してみる

まず、変更対象のSQLデータベース(FBRDB)のDTUを、以下のコマンドで確認します。

PS C:\Users\testuser> Get-AzureSQLDatabase -ServerName "k8fxxxxxxx" -DatabaseName "FBRDB"

Name                                       : FBRDB
CollationName                              : SQL_Latin1_General_CP1_CI_AS
Edition                                    : Standard
MaxSizeGB                                  : 250
MaxSizeBytes                               : 268435456000
ServiceObjectiveName                       : S2
ServiceObjectiveAssignmentStateDescription : Complete
CreationDate                               : 2016/02/09 12:51:14
RecoveryPeriodStartDate                    : 2016/02/09 13:01:57

PS C:\Users\testuser>

DTUが「S2」である事が確認できます。

次に、「C:\Data\SetAzureSQL_S1.ps1」を実行します。DTUを「S2」から「S1」に変更する事になります。

PS C:\Users\testuser> C:\Data\SetAzureSQL_S1.ps1
PS C:\Users\testuser> 

数秒待てば、実行が完了します。実際のDTU変更はもう少し時間が掛かります。以下に、DTU確認コマンドを数秒おきに実行した結果を乗せます。

まず、PowerShellスクリプトを実行した直後の状態は以下になります。

PS C:\Users\testuser> Get-AzureSQLDatabase -ServerName "k8fxxxxxxx" -DatabaseName "FBRDB"

Name                                       : FBRDB
CollationName                              : SQL_Latin1_General_CP1_CI_AS
Edition                                    : Standard
MaxSizeGB                                  : 250
MaxSizeBytes                               : 268435456000
ServiceObjectiveName                       : S2
ServiceObjectiveAssignmentStateDescription : Pending
CreationDate                               : 2016/02/09 12:51:14
RecoveryPeriodStartDate                    : 2016/02/09 13:01:57

PS C:\Users\testuser>

DTU(ServiceObjectiveName)が「S2」のままですが、ServiceObjectiveAssignmentStateDescriptionが「Pending」に変わりました。

数秒おいて、もう一度確認すると、下記のようになります。

PS C:\Users\testuser> Get-AzureSQLDatabase -ServerName "k8fxxxxxxx" -DatabaseName "FBRDB"

Name                                       : FBRDB
CollationName                              : SQL_Latin1_General_CP1_CI_AS
Edition                                    : Standard
MaxSizeGB                                  : 250
MaxSizeBytes                               : 268435456000
ServiceObjectiveName                       : S1
ServiceObjectiveAssignmentStateDescription : Pending
CreationDate                               : 2016/02/09 12:51:14
RecoveryPeriodStartDate                    : 2016/02/09 13:01:57

PS C:\Users\testuser>

DTU(ServiceObjectiveName)が「S1」に変わりました。ServiceObjectiveAssignmentStateDescriptionは「Pending」のままです。

数秒おいて、もう一度確認すると、下記のようになります。

PS C:\Users\testuser> Get-AzureSQLDatabase -ServerName "k8fxxxxxxx" -DatabaseName "FBRDB"

Name                                       : FBRDB
CollationName                              : SQL_Latin1_General_CP1_CI_AS
Edition                                    : Standard
MaxSizeGB                                  : 250
MaxSizeBytes                               : 268435456000
ServiceObjectiveName                       : S1
ServiceObjectiveAssignmentStateDescription : Complete
CreationDate                               : 2016/02/09 12:51:14
RecoveryPeriodStartDate                    : 2016/02/09 13:01:57

PS C:\Users\testuser>

DTU(ServiceObjectiveName)が「S1」で、ServiceObjectiveAssignmentStateDescriptionが「Complete」になりました。
DTUの変更処理が完了したと考えられます。

なお、DTUを「S1」から「S2」に変更するときも同じような処理推移となります。

 

5.タスクスケジューラに登録

PowerShellスクリプトの動作確認が出来たので、次は自動実行する為に、タスクスケジューラに登録します。

「S1へ変更用」、「S2へ変更用」の二つ作成します。

以下にポイント情報のみですが、記載します。

タブ 項目 設定値
全般 名前 DTU変更_S1
トリガー 設定 実行スケジュールを設定
操作 操作 プログラムの開始
プログラム C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加 -Command “.\SetAzureSQL_S1.ps1”
開始 C:\Data

以上になります。

Pocket

コメントを残す

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


*

チェックサイト RSS Feed読者登録はいかがでしょうか?RSS配信中です。