Backup Exec DeDup-Store aufräumen

Es gab vom Backup-Team eine Anforderung, den DeDup-Speicher aufzuräumen, sofern der freie Speicher auf dessen Partition unter 10% sinkt.

Das folgende Skript kümmert sich um genau dieses Thema. Aber Vorsicht! Es kann durchhaus über einen Tag dauern bis es durch ist, je nach Größe des Speichers, Geschwindigkeit der Platten, etc… Darum am besten nicht automatisch laufen lassen, sondern händisch nach Bedarf ausführen.

Warum manche Anweisungen so sind wie sie sind, kann ich nicht sagen, hier habe ich mich voll und ganz auf die Anweisungen des Backup-Teams verlassen:

# Eine Funktion die mir den freien Plattenplatz in Prozent für das Laufwerk D zurückgibt.
# Auf D war der B2D- und DeDup Store und muss ggf. angepasst werden
function DiskSpaceD(){
	$Disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='D:'" | Select-Object Size,FreeSpace
	$FreeDiskSpaceProzent = $Disk.FreeSpace / $Disk.Size * 100
	return $FreeDiskSpaceProzent
}

# Datum und LogFile definieren
$Datum = (Get-Date).ToString("yyyyMMdd_HHmmss")
$LogFile = "C:\Skripte\Logs\DeDup-CleanUp_$Datum.log"

# Prozent freuen Speicher auslesen
$DiskSpace = DiskSpaceD

# Wenn es weniger als 10% freier Speicher ist
if ([int]$DiskSpace -lt 10){

	# Da das Skript lokal auf dem BE-Server läuft, ist der Hostname "hostname"
	$hostname = Hostname
	$MailFrom = "$hostname@domain.de"
	$MailTo = "rcpt@domain.de"
	$MailSubject = "Backup Exec: CompactStart gestartet"
	$MailSMTPServer = "192.168.0.100"

	# Funktion die ProcessQueue 2 Mal startet
	function 2xProcessqueue(){
		& 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --processqueue
		sleep(5)
		& 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --processqueue
		sleep(5)
		
		# Solange er läuft und nicht beides auf "no" steht, wird weitergemacht
		while (1){
			$query = & 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --processqueueinfo
			$busystate = $query[0] -Replace "Busy   : "
			$pendingstate = $query[1] -Replace "Pending: "
			(Get-Date) | Out-File $LogFile -Append
			echo $query | Out-File $LogFile -Append
			echo "" | Out-File $LogFile -Append
			if (($busystate -eq "no") -and ($pendingstate -eq "no")){
				(Get-Date) | Out-File $LogFile -Append
				echo "Beides wieder auf NO" | Out-File $LogFile -Append
				break;
			}

			sleep(60)
		}
	}

	# Funktion die CRCollect einmal startet
	function 1xCRCollect(){

		Start-Process "C:\Program Files\Symantec\Backup Exec\crcollect.exe" -ArgumentList "-v -m +1,+2" -NoNewWindow -Wait
		sleep(5)
	}

	# Funktion die CompactStart einmal startet
	function 1xCompactStart(){
		Start-Process "C:\Program Files\Symantec\Backup Exec\crcontrol.exe" -ArgumentList "--compactstart" -NoNewWindow -Wait
		sleep(5)
		
		# Solange er läuft und er nicht auf "no" steht, wird weitergemacht
		while (1){	
			$query = & 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --compactstate
			$state = ($query[1] -split ": ")[1]
			(Get-Date) | Out-File $LogFile -Append
			echo $query[1] | Out-File $LogFile -Append
			echo "" | Out-File $LogFile -Append
			
			if ($state -eq "No"){
				(Get-Date) | Out-File $LogFile -Append
				echo "Fertig!" | Out-File $LogFile -Append
				break;
			}

			sleep(60)
		}	
	}

	# Mail-Log zusammenbauen und Live-Log schreiben
	$Mail = @()
	echo "DeDupe Bereinigungs-Script gestartet." | Out-File $LogFile -Append
	$Mail += "DeDupe Bereinigungs-Script gestartet."
	(Get-Date) | Out-File $LogFile -Append
	$Mail += (Get-Date)
	$Mail += ""

	# Freien Plattenplatz vor dem Start auslesen:
	echo "Plattenplatz vor Reinigung:" | Out-File $LogFile -Append
	$Mail += "Plattenplatz vor Reinigung:"
		$PlattenplatzVorStart = DiskSpaceD
	echo "$PlattenplatzVorStart Prozent freier Speicher." | Out-File $LogFile -Append
	$Mail += "$PlattenplatzVorStart Prozent freier Speicher."
	$Mail += ""

	##############################################################################################
	# Folgende Anforderung kam vom Backup-Team
	# WARUM es mehrere Durchläufe für die ProcessQueue, etc. geben musste, kann ich nicht sagen.
	##############################################################################################
	
	# Erster Durchlauf
	echo "Erster Durchlauf:" | Out-File $LogFile -Append
	$Mail += "Erster Durchlauf gestartet um:"
	$Mail += (Get-Date)
		2xProcessqueue
	$Mail += "Erster Durchlauf beendet um:"
	$Mail += (Get-Date)
	$Mail += ""


	# Zweiter Durchlauf
	echo "Zweiter Durchlauf:" | Out-File $LogFile -Append
	$Mail += "Zweiter Durchlauf gestartet um:"
	$Mail += (Get-Date)
		2xProcessqueue
	$Mail += "Zweiter Durchlauf beendet um:"
	$Mail += (Get-Date)
	$Mail += ""

	# Einmal CR-Collect
	echo "Einmal CR-Collect:" | Out-File $LogFile -Append
	$Mail += "CR-Collect gestartet um:"
	$Mail += (Get-Date)
		1xCRCollect
	$Mail += "CR-Collect beendet um:"
	$Mail += (Get-Date)
	$Mail += ""
		
	# Dritter Durchlauf
	echo "Dritter Durchlauf:" | Out-File $LogFile -Append
	$Mail += "Dritter Durchlauf gestartet um:"
	$Mail += (Get-Date)
		2xProcessqueue
	$Mail += "Dritter Durchlauf beendet um:"
	$Mail += (Get-Date)
	$Mail += ""

	# Vierter Durchlauf
	echo "Vierter Durchlauf:" | Out-File $LogFile -Append
	$Mail += "Vierter Durchlauf gestartet um:"
	$Mail += (Get-Date)
		2xProcessqueue
	$Mail += "Vierter Durchlauf beendet um:"
	$Mail += (Get-Date)
	$Mail += ""

	# CompactStart
	echo "CompactStart:" | Out-File $LogFile -Append
	$Mail += "CompactStart gestartet um:"
	$Mail += (Get-Date)
		1xCompactStart
	$Mail += "CompactStart beendet um:"
	$Mail += (Get-Date)
	$Mail += ""

	# Freien Plattenplatz Beendigung auslesen:
	$Mail += "Plattenplatz nach Reinigung:"
		$PlattenplatzNachStart = DiskSpaceD
	$Mail += "$PlattenplatzNachStart Prozent freier Speicher."

	echo "Plattenplatz nach Reinigung:" | Out-File $LogFile -Append
	echo "$PlattenplatzNachStart Prozent freier Speicher." | Out-File $LogFile -Append

	$MailBody = $Mail | Out-String
	$MailBody | Out-File $LogFile -Append

	# E-Mail schicken
	Send-MailMessage -From $MailFrom -To $MailTo -Subject $MailSubject -Body $MailBody -SmtpServer $MailSMTPServer

# Der Plattenplatz ist ok, es muss nichts gemacht werden
}else{
	echo "Plattenplatz bei $DiskSpace Prozent freiem Speicher." | Out-File $LogFile -Append
}