• RemoveRecoveryPoint.ps1

    このソースの解説はこちらから。
    【Management】DPM2007 管理シェルで保護領域の容量不足を回避する その2  

    *********************

    param([string] $DPMServerName, [string] $ProtectionGroupName,[string] $Datasource, [string] $RepeisentedPointInTime)

    if(!$DPMServerName)
    {
         $DPMServerName = read-host "DPMサーバー名:"
    }

    $DPMServer = Connect-DPMServer $DPMServerName

    if(!$ProtectionGroupName)
    {
         $PGList = Get-ProtectionGroup $DPMServerName
         $PGList 
         Write-Host "保護グループを選択してください"
         $ProtectionGroupName = read-host "保護グループ名:"
    }

    $pg = Get-ProtectionGroup $DPMServerName | where {$_.FriendlyName -eq $ProtectionGroupName}

    if(!$Datasource)
    {
         $DSList = Get-Datasource $pg | format-table Name,ProductionServerName
         $DSList
         Write-Host "データソースを選択してください"
         $Datasource = read-host "データソース名:"
    }

    $ds = Get-Datasource -ProtectionGroup $pg | where {$_.Name -eq $Datasource}

    $ds

    $RPList = Get-RecoveryPoint -DataSource $ds |format-table RepresentedPointInTime,UserFriendlyName,Size |out-string

    if(!$ReprisentedPointInTime)
    {
         $RPList
         Write-Host "削除したい回復ポイントの RepresentedPointInTime を指定してください"
         $RepresentedPointInTime = read-host "回復ポイントの日時:"
    }

    $RP = Get-RecoveryPoint -DataSource $ds | where {$_.RepresentedPointInTime -eq $RepresentedPointInTime}

    Write-Host "回復ポイントを削除します"
    Write-Host "-- 保護グループ:: $ProtectionGroupName"
    Write-Host "-- 回復ポイント:: $RepresentedPointInTime"

    #Remove-RecoveryPoint -RecoveryPoint $rp -ForceDeletion -Confirm:$false
    Remove-RecoveryPoint -RecoveryPoint $rp

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

    ※2008/8/28 に「【Management】Data Protection Managere 2007 で回復ポイントを削除する というタイトルで投稿した記事にリフレッシュ版です

    先日の投稿で、保護領域を拡張する方法についてご紹介しました。

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

    今回は、もう1つの容量不足対策をご紹介します。

    DPMでは、保護グループ作成時に「保存期間」を日数単位で指定することができます。そのため、一度バックアップが取られると、指定した日数が経過しない限り削除されることはありません。

    この機能によりバックアップの信頼性は向上するわけですが、ときによっては「あのバックアップいらねー」となることもあるでしょう。

    そこで、古いバックアップを保護領域から削除するスクリプトをご紹介します。

    ソース全体はこちらから。

    このスクリプトでは、指定したサーバーの保護グループにある、特定の回復ポイントを削除します。

    スクリプト名につづいて[サーバー名]、[保護グループ名]、[データソース名], [回復ポイントの日時(yyyy/mm/dd hh:nn:ss)]を指定することができます。保護グループ名やデータソース名、回復ポイントの日時が分からない場合でも安心してください。なにも入れなければ一覧から選択できるようになっています(以降参照)

    param([string] $DPMServerName, [string] $ProtectionGroupName,[string] $Datasource, [string] $RepeisentedPointInTime)

    サーバー名が指定されていなければ、プロンプトが表示されてサーバー名の入力を求められます。

    if(!$DPMServerName)
    {
         $DPMServerName = read-host "DPMサーバー名:"
    }

    DPM サーバーに接続します。

    $DPMServer = Connect-DPMServer $DPMServerName

    もし保護グループ名が指定されていなければ、指定したサーバーの保護グループ一覧を表示し、保護グループの選択を求めます。

    if(!$ProtectionGroupName)
    {
         $PGList = Get-ProtectionGroup $DPMServerName
         $PGList   
         Write-Host "保護グループを選択してください"
         $ProtectionGroupName = read-host "保護グループ名:"
    }

    選択された(またはパラメタとして指定された)保護グループのインスタンスを取得します。

    $pg = Get-ProtectionGroup $DPMServerName | where {$_.FriendlyName -eq $ProtectionGroupName}

    データソースが指定されていない場合には、保護グループ内のデータソース一覧を表示し、「データソース名」というプロンプトでデータソースを指定できるようにします。

    if(!$Datasource)
    {
         $DSList = Get-Datasource $pg | format-table Name,ProductionServerName
         $DSList
         Write-Host "データソースを選択してください"
         $Datasource = read-host "データソース名:"
    }

    パラメタに指定された、または一覧から選択したデータソースのインスタンスを取得します。

    $ds = Get-Datasource -ProtectionGroup $pg | where {$_.Name -eq $Datasource}

    回復ポイントがパラメタとして指定されていない場合には、データソースの回復ポイント一覧を表示し、「回復ポイントの日時」というプロンプトに回復ポイントの日時を指定することができるようにします。

    大量に回復ポイントがある場合には、ちょっとアレですねぇ。どなたかエレガントなUIを考えてみてくださいませ。

    if(!$ReprisentedPointInTime)
    {
         $RPList = Get-RecoveryPoint -DataSource $ds |format-table RepresentedPointInTime,UserFriendlyName,Size |out-string
         $RPList
         Write-Host "削除したい回復ポイントの RepresentedPointInTime を指定してください"
         $RepresentedPointInTime = read-host "回復ポイントの日時:"
    }

    指定された回復ポイントのインスタンスを取得します。

    $RP = Get-RecoveryPoint -DataSource $ds | where {$_.RepresentedPointInTime -eq $RepresentedPointInTime}

    Remove-RecoveryPoint を使用して回復ポイントを削除します。

    このとき、依存関係がある回復ポイント一覧が表示されるので、削除の際には必ずチェックしてください。

    また、#で始まる行は「自動削除」の記述の仕方です。この行を生かすと、「削除するかどうか」のプロンプトが表示されずに無条件で削除されてしまいます。ご注意ください。

    Write-Host "回復ポイントを削除します"
    Write-Host "-- 保護グループ:: $ProtectionGroupName"
    Write-Host "-- 回復ポイント:: $RepresentedPointInTime"

    #Remove-RecoveryPoint -RecoveryPoint $rp -ForceDeletion -Confirm:$false
    Remove-RecoveryPoint -RecoveryPoint $rp

    それでは、よい Scripting Life を!

  • ResizeStoragePool.ps1

    このソースの解説はこちらから。
    【Management】DPM2007 管理シェルで保護領域の容量不足を回避する その2

    ************************* 

    param([string] $DPMServerName)

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

    $dpmserver=Connect-DPMServer $dpmservername

    $PGList = @(Get-ProtectionGroup $dpmservername)

    foreach($PG in $PGList)
    {

     $MPG = Get-ModifiableProtectionGroup $PG

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

     $dslist=@(get-datasource $MPG)

     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 %"

     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 %"
     }

     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 %"
     }
     }
    }
    Disconnect-DPMServer $dpmservername

  • 【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サーバー名>

  • 【TechEd】T4304 DPM セッションで失敗したスクリプト ~失敗の原因が判明

    ホテルの部屋で、一人本日のセッションを反省しています。
    本日のデモで、正しく動かなかったスクリプトがありました。それは、以下の記事にある 「デモ2-3」です。
    【TechEd】T4304 DPM セッションに参加くださった皆様 ありがとうございました ~ デモのおさらい

    障害が発生したDPMサーバーが復旧後、Switch-Protection.ps1 で 再度Primaryに戻し、整合性チェックをスクリプトで行ったところ、以下のエラーが発生しました。

    無題

    ご覧頂くとわかりますが、Gyomu02 という保護グループが取得できないというエラーが発生しています。

    「そんなはずない」と、何度も何度も何度も実行し、あせっている様子がわかります....(汗)

    もう10回以上テストして動作確認しているのに....

    で、先ほど、セッションに参加されていた 指崎さん からメールが届き、「あれが動かなかったのはこれが原因じゃないですか?」と1枚の証拠写真を突き付けられました。

    T4-304_DSC03504

    な、なんと....Primary にスイッチした後に作成しなおした保護グループの名前が、「保護グループ 1」 になっている....

    再度、手元のデモ機で確認したところ...確かに間違えています....

    これじゃ動くはずがありません...

    ご参加の皆さん、大変失礼いたしました。