ここ最近Windows OSでPowerShellスクリプトを組む機会に遭遇したのでまとめておく。
新人の頃、NetBackupのサポート時代からあった問題。2002年ごろだったかな。この仕様を変えるつもりはないんだろうなぁ。
##NetBackupのボリュームプール設計のコツ
この問題は、テープバックアップをジョブスケジューラで回す場合に絶対的について回る。
テープメディアの保持期間のExpire状態からAvailable状態への遷移中に、バックアップを実行すると、使用可能なテープメディアがないと判断されてしまう事象。
これは、テープの保持期間を強制的に削除することで解決できるのだが、外部運用スケジュールミドルウェア(JP1/AJSなど)でジョブ実行している場合は作りこみをせねばならない。
なぜこの問題が発生するかというと、テープのローテーションを最低限の本数で回そうとすると、上書きをどこかでしないといけないのだが、上書きをするためにはテープの保持期間が切れている必要がある。テープの保持期間が切れている状態とは、テープに取得したバックアップデータの保持期間がすべて期限切れとなっている状態である。例えば保持期間7日間のバックアップデータを取得した場合は、24*7時間経過した後でなければそのテープは上書き用として利用できない。
さらに、ボリュームプールに複数のテープが登録されている場合は、保持期間を持つテープが優先的にバックアップ対象として選択され、追記書きされる仕様となっていることにも注意だ。そのため、ボリュームプール設計において、各ボリュームプールに1本ずつメディアIDを登録するなどの工夫をしておくと、運用上扱いやすい設計となる。
##前提条件
前提として、ボリュームプール内のすべてのメディアの保持期限をクリアするので、テープを1本だけクリアしたい場合はこのスクリプトの例を応用して作成してほしい。
保持期間が残っているメディアのみ対象にするなどの改修が必要なので注意。
##vmqueryコマンドによるメディアの状態確認
テープメディアが下記のように設定されている状態を例に説明する。
# /usr/openv/volmgr/bin/vmquery -b
メディメディロボッ ロボッロボット 側面/ 光 # マウント/ 最終
アID ア形式 ト形式 ト# スロット 断面 パートナークリーニングマウント時間
-------------------------------------------------------------------------------
LTOD01 HCART TLD 0 1 - - 23 yyyy/mm/dd HH:MM
LTOD02 HCART TLD 0 2 - - 5 yyyy/mm/dd HH:MM
LTOD03 HCART TLD 0 3 - - 6 yyyy/mm/dd HH:MM
LTOD04 HCART TLD 0 4 - - 1 yyyy/mm/dd HH:MM
#
また、ボリュームプールの構成は以下例とする。
4本のテープメディアを3つのボリュームプールに所属させる。
2本は同じボリュームプールに所属している構成だ。(test_pool_03
に2本設定されている)
ボリュームプール名 メディアID
---
test_pool_01 LTOD01
test_pool_02 LTOD02
test_pool_03 LTOD03
test_pool_03 LTOD04
##配列にボリュームプール内のメディアIDを入れる
PowerShellスクリプトで以下のように実装する。
ボリュームプール名は$v_TARGET_MEDIA
変数にローテーションで定義するファンクションを別途実装しているが、ここでは割愛し、test_pool_01
を手動設定した例にて説明。
$v_TARGET_MEDIA = "test_pool_01"
try{
$media_array =@("C:\Program Files\Veritas\Volmgr\bin\vmquery" `
" -b -pn "$v_TARGET_MEDIA `
| ?{ $_ -match '^ *LTOD'} | Select-Object -first 2 | %{ $_.Split()[00] })
}catch{
return 1
}
vmqueryコマンドが異常終了した場合は、return 1を返すので、ループの判定等に使用してほしい。
##保持期間のクリア処理
保持期間のクリアはbpexpdate
コマンドを使用する。
メディアIDしか指定できないため、このような作りとする必要がある。
※ボリュームプールを指定可能としてしまうと、本来クリアしてはならないバックアップまで利用不可としてしまうので、製品仕様としては致し方ない。
配列$media_array
に代入したすべてのメディアIDに対して保持期間のクリアを実行する。
$MediaCount = $media_array.Count
do{
$media_count++
try{
$v_RESULT = "C:\Program Files\Veritas\NetBackup\bin\admincmd\bpexpdate" `
-m "$media_array[$MediaCount]" -d 0 -force
}catch{
return 1
}
}while($media_count -lt $MediaCount)
ここでもコマンドが異常終了した場合は、return 1を返すので、ループの判定等に使用してほしい。