【Management】DPM2007 管理シェルで保護領域の容量不足を回避する その1

※2008/8/27 に「【Management】DPM2007 管理シェルで保護領域不足を回避する」というタイトルで投稿した記事のリフレッシュ版です

Data Protection Manager 2007 を使用していると、ストレージプール内の保護領域容量不足によりエラーが発生することがあります。

このエラーを回避するには、2つの方法が考えられます。

  1. 保護領域を拡大する
  2. 保存されているデータを削除する

前者は、DPM管理コンソールから実施することが可能ですが、後者はDPM管理シェルを使用してPowerShellによって実行する必要があります。

この記事では、1. 保護領域を拡大する スクリプトを紹介します。

DPM管理シェルでは、領域を拡大するために 「Set-DatasourceDiskAllocation 」というコマンドレットが用意されています。書式は以下の通りです。詳細な書式は、DPM管理シェルで get-help Set-DatasourceDiskAllocation -detailed を入力して確認してください。

Set-DatasourceDiskAllocation -Manual
-ProtectionGroup <保護グループのインスタンス>
ーDatasource <データソースのインスタンス>
-ReplicaArea または -ShadowCopyArea

<新しいサイズ>

上記の書式からもわかるとおり、サイズを変更するには事前に 保護グループのインスタンスと、データソースのインスタンスを取得しておく必要があります。これは単純に文字列として渡すことはできないので、それぞれ、Get-ProtectionGroup と Get-Datasource を使用して事前に取得しておかなければなりません。

ここで覚えておいていただきたいのは、DPMサーバー、保護グループ、データソースの関係です。これらは階層構造になっており、図示すると以下のようなイメージです。

DPMサーバー
├ 保護グループ1
│ ├ データソース1
│ ├ データソース2
│ ・
│ ・
├保護グループ2
│ ├ データソース3
│ ├ データソース4
・ ├ データソース5

つまり、データソース4 を取得したい場合には、はじめに保護グループ2 のインスタンスを取得しないといけないわけです。この考え方は、DPMをPowerShellから操作する場合に必ずついて回るので、是非覚えておいてください。

それでは、スクリプトを作ってみましょう。長いスクリプトになるので、分割して説明します。

※分割していないソースはこちらから。

このスクリプトでは、指定したサーバーの保護グループに設定されているデータソースをすべてチェックし、領域の使用率が90%を超えていれば1.5倍に拡大しています。この「90%」はOperations Managerにおける監視の閾値であり、このスクリプトでも閾値をそれに合わせています。

まずは情報収集と設定の起点となるDPMサーバーに接続する必要があります。 以下では、DPMサーバー名を引数として渡せるようにしていますが、もし引数が指定されていない場合には、「DPMServerName:」というプロンプトを表示し、入力を促すようにしています。

param([string] $DPMServerName)

if(!$DPMServerName) { $DPMServerName = read-host "DPMServerName:" }

$dpmserver = Connect-DPMServer $dpmservername

次に、Get-ProtectionGroup を使用して、DPMサーバー上の保護グループを取得します。Get-ProtectionGroup はDPMサーバーの配下にあるので、引数としてDPMサーバーのインスタンスを渡します。1つのサーバーには複数の保護グループが含まれている可能性があるので、戻される値はアレイ値となります。

$PGList = @(Get-ProtectionGroup $dpmservername)

$PGList には、複数の保護グループが格納されている可能性があるため、foreach を使用して保護グループを1つずつ取り出します。

foreach($PG in $PGList) {

ここは重要です。 保護グループの設定を変更するには、Get-ModifiableProtectionGroup を使用して、変更可能なオブジェクトに変換する必要があります。

  $MPG = Get-ModifiableProtectionGroup $PG

  $ModifiableProtectionGroupName = $MPG.FriendlyName Write-Host "保護グループ::$ModifiableProtectionGroupName"

変更可能な保護グループオブジェクトを使用して、Get-Datasource によりデータソースを取得します。保護グループには複数のデータソースが含まれる可能性があるため、戻り値 $dslist はアレイ値となっています。

  $dslist=@(Get-Datasource $MPG)

戻り値の中から1つずつデータソースを取り出します。Nameプロパティはデータソースの名前を返します。

  foreach ($ds in $dslist) { $DataSourceName = $ds.Name

高速完全バックアップの領域(レプリカサイズ)について、現在のレプリカサイズ(高速完全バックアップ領域のサイズ)、既に使用している容量、使用率を取得しています。

        $RecentReplicaSize = $ds.ReplicaSize $RecentReplicaUsedSpace = $ds.ReplicaUsedSpace $RecentReplicaUsedPercent = $RecentReplicaUsedSpace / $RecentReplicaSize * 100

同様に、回復ポイントの領域についても、現在のサイズ、使用されているサイズ、使用率を取得しています。

         $RecentShadowCopyAreaSize = $ds.ShadowCopyAreaSize $RecentShadowCopyUsedSpace = $ds.ShadowCopyUsedSpace $RecentShadowCopyUsedPercent = $RecentShadowCopyUsedSpace / $RecentShadowCopyAreaSize * 100

ひとまず現在の状態を画面に表示しています。

         Write-Host "- データソース::$DataSourceName" Write-Host "-- 現在のレプリカサイズ ::$RecentReplicaSize ($RecentReplicaUsedSpace) $RecentReplicaUsedPercent %" Write-Host "-- 現在のシャドウコピーサイズ::$RecentShadowCopyAreaSize ($RecentShadowCopyUsedSpace) $RecentShadowCopyUsedPercent %"

レプリカサイズについて、使用量が90%を超えている場合には、容量を1.5倍にしています。サイズを設定するには、Set-DatasourceDiskAllocation を使用し、パラメタとして -ReplicaArea を指定します。

注意しなければならないのは、Set-ProtectionGroup というコマンドレットです。Set-DatasourceDiskAllocation でサイズを指定しただけではコミットがされないため、必ず Set-ProtectionGroup によって保存してあげる必要があります。

        if($ds.ReplicaSize * 0.9 -lt $ds.ReplicaUsedSpace) { $NewReplicaSize = $ds.ReplicaSize * 1.5 Set-DatasourceDiskAllocation -Manual -Datasource $ds -ProtectionGroup $MPG -ReplicaArea $NewReplicaSize

             Set-ProtectionGroup $MPG

             $RecentReplicaSize = $NewReplicaSize $RecentReplicaUsedPercent = $RecentReplicaUsedSpace / $RecentReplicaSize * 100 Write-Host "---- 新しいレプリカサイズ ::$RecentReplicaSize ($RecentReplicaUsedSpace) $RecentReplicaUsedPercent %" }

同様にして、回復ポイントの領域についてもサイズを変更します。Set-DatasourceDiskAllocation のパラメタには -ShadowCopyArea を使用します。

        if($ds.ShadowCopyAreaSize * 0.9 -lt $ds.ShadowCopyUsedSpace) { $NewSCSize = $ds.ShadowCopyAreaSize * 1.5 Set-DatasourceDiskAllocation -Manual -Datasource $ds -ProtectionGroup $MPG -ShadowCopyArea $NewSCSize

               Set-ProtectionGroup $MPG

               $RecentShadowCopyAreaSize = $NewSCSize $RecentShadowCopyUsedPercent = $RecentShadowCopyUsedSpace / $RecentShadowCopyAreaSize * 100 Write-Host "---- 新しいシャドウコピーサイズ::$RecentShadowCopyAreaSize ($RecentShadowCopyUsedSpace) $RecentShadowCopyUsedPercent %" }

最後に、DPMサーバーから切断して完了です。

   } } Disconnect-DPMServer $dpmservername

スクリプトは拡張子 ps1 で保存し、DPM管理シェル上で実行します。

通常のコマンドプロンプトから実行する場合には、以下のようなバッチファイルを作成するとよいでしょう。

以下は1行で書かれています。

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe
-PSConsoleFile "C:\Program Files\Microsoft DPM\DPM\bin\dpmshell.psc1"
-command ".'<スクリプトのフルパス>' -DPMServerName <DPMサーバー名>