© たかやまそら

指数関数バックアップ 2

とりあえず最大世代までは削除しないでキューする。

指数関数バックアップの弱点?

前回、紹介した「指数関数バックアップ」には1つの弱点があった。 それは古い世代が選ばれるとき、その貴重な古い世代が失われる、ということ。

それは仕様ですが

もちろん、それは「スナップショットを、古い世代ほどまれに残したい」仕様によるのだが、 最古級のバックアップが基本的に残りにくいというのは実用上、問題といえる。 そこで、解決策を考えた。すなわち、

とりあえず最大世代までは削除しない

指数関数バックアップを使用して間もないころは、 基本的にバックアップ最大世代までスナップショットは埋まっていない。 そういう頃は「削除」せず、最大世代が埋まるまではキューイングを続けるようにした。

ソース

改造した部分はわずか数行。見ての通りです。


##########################################################################
#
# 指数関数的バックオフ・バックアップ Exponential backup
#
# $pathBackup には バックアップ置き場を指定すること
# 
# バックアップ最大世代の最大値
[int]$backupGenerationMax = 30

if([string]::IsNullOrEmpty($pathBackup)){
	Write-Host "Exponential backup, Skipped. Reason: Backup path is not defined."
}else{
	Write-Host "Exponential backup, Starting..."
	
	# バックアップ最大世代まで埋まっていない場合は単純に積み上げる
	[int]$backupGeneration = $backupGenerationMax
	[string]$backupDst = $pathBackup + $backupGeneration
	
	if (Test-Path $backupDst) {
		# 今回削除するバックアップ世代を決める。
		for($backupGeneration=1;$backupGeneration -le $backupGenerationMax;$backupGeneration++){
			if((Get-SecureRandom -Minimum 0 -Maximum 2) -eq 0){
				break;
			}
		}
		
		# 今回削除するバックアップ世代のフォルダ名を作る
		$backupDst = $pathBackup + $backupGeneration
		
		# 今回のバックアップ最大世代をセット
		$backupGenerationMax = $backupGeneration
		
		# 今回削除するバックアップ世代を(あれば)削除する
		if(Test-Path -Path $backupDst){
			Remove-Item -Path $backupDst -Recurse -Force
		}
	}
	
	[string]$backupSrc = $backupDst
	
	# 今回のバックアップ最大世代まで、バックアップ世代を1つずつずらす(リネームする)
	for($backupGeneration=$backupGenerationMax-1;$backupGeneration -ge 1;$backupGeneration--){
		$backupDst = $backupSrc
		$backupSrc = $pathBackup + $backupGeneration
		if(Test-Path -Path $backupSrc){
			Write-Host "`tRename-Item -Path $backupSrc -NewName $backupDst"
			Rename-Item -Path $backupSrc -NewName $backupDst
		}
	}
	
	# バックアップ先を新造
	$backupDst = $backupSrc
	New-Item -ItemType Directory -Path $backupDst | Out-Null
	
	# バックアップ実行
	Write-Host "`tCopy-Item -Path $pathTarget -Destination $backupDst -Recurse -Force"
	Copy-Item -Path $pathTarget -Destination $backupDst -Recurse -Force
	
	Write-Host "Exponential backup, Completed."
}
#########################################################################

移植や改造はご自由に。間違いがあったらこっそり教えてください。

© たかやまそら