Нередко встречается ситуация, когда резервное копирование Windows Server выполняется на сетевую шару штатными средствами.
Разумеется, размер сетевой шары ограничен, а штатные срдства не имеют возможности удалять резервные копии старше определенного возраста.
Ситуацию можно решить с помощью скриптов, которые предлагаю вашему вниманию. Примеры скриптов взяты из Интернета, и дополнены мной под реальные сценарии для этой статьи. Если вы еще используете .bat-скрипты, обратите внимание насколько PowerShell проще и логичнее.
Для резервных копий Windows Server Backup, удалять нужно не все подряд, а только папки, и только с именем Backup %date%
# set folder path $dump_path = "servershareidWindowsImageBackupservername" # set min age of files $max_days = "-3" # get the current date $curr_date = Get-Date # determine how far back we go based on current date $del_date = $curr_date.AddDays($max_days) # delete the files Get-ChildItem $dump_path -Recurse | Where-Object { $_.LastWriteTime -lt $del_date -and $_.Attributes -eq 'Directory' -and $_.name -like 'Backup*'} | Remove-Item -Recurse
Обратите внимание, Remove-Item запрашивает подтверждение, чтобы автоматически на него соглашаться, использование флагов -Confirm:$false и/или -Force не подходит (на TechNet описано, что они на самом деле делают), использовать нужно флаг -Recurse
Если вам нужно удалять резервные копии, которые делает SQL сервер, то удалять нужно не папки, а файлы (маску файлов указывать нет смысла, т.к. в этой папке только *.bak файлы):
# set folder path $dump_path = "serversharefolder" # set min age of files $max_days = "-3" # get the current date $curr_date = Get-Date # determine how far back we go based on current date $del_date = $curr_date.AddDays($max_days) # delete the files Get-ChildItem $dump_path -Recurse | Where-Object {$_.LastWriteTime -lt $del_date} | Remove-Item -Recurse
Если продолжать про SQL, то резервное копирование штатными средства выполняется в локальную папку, где хранится какое-то время, а затем переносится в архив (сетевую шару):
#Path to already connected share $sourceFullPath = "C:MSSQLBackupdatabase" $targetFullPath = "serversharesqldatabase" # copy all files Get-ChildItem $sourceFullPath -Recurse | Move-Item -Destination $targetFullPath
Если вы хотите хранить резервные копии в нескольких местах, копировать их можно с помощью командлета Copy-Item , вот пример, в котором будут копироваться только свежие бэкапы:
#Path to already connected share $sourceFullPath = "serversharesqldatabase" # set target path $targetServer = "server" $targetFullPath = "$targetServersharesqldatabase" $targetUsername = "username" $targetPassword = "password" net use $targetServer $targetPassword /USER:$targetUsername # get the current date $curr_date = Get-Date # set min age of files $max_days = "-1" # determine how far back we go based on current date $del_date = $curr_date.AddDays($max_days) # copy all files Get-ChildItem $sourceFullPath -Recurse | Where-Object {$_.LastWriteTime -gt $del_date} | Copy-Item -Destination $targetFullPath #Disconnect shares net use $targetServer /delete
Копировать бэкапы Windows Server Backup можно аналогичным образом (обратите внимание, папки будут перезаписаны):
#Path to already connected share $sourceFullPath = "servershareWindowsImageBackup" # set target path $targetServer = "server" $targetFullPath = "$targetServersharewsb" $targetUsername = "user" $targetPassword = "password" net use $targetServer $targetPassword /USER:$targetUsername # copy all folder Copy-Item $sourceFullPath $targetFullPath -Recurse -Container -ErrorAction SilentlyContinue #Disconnect shares net use $targetServer /delete
Для резервного копирования виртуальных машин Hyper-V, можно использовать HVBackup :
# set folder path $targetFullPath = "serversharevms" # set min age of files $max_days = "-2" # get the current date $curr_date = Get-Date # determine how far back we go based on current date $del_date = $curr_date.AddDays($max_days) # delete the files Get-ChildItem $targetFullPath -Recurse | Where-Object {$_.LastWriteTime -lt $del_date} | Remove-Item -Recurse # Run HVBackup C:HVBackup.HVBackup.exe --a --compressionlevel 0 --output $targetFullPath 1> lastlog_out.txt 2> lastlog_err.txt
Копировать эти бэкапы в другое место можно так же, как и бэкапы SQL.
Эти и другие скрипты для управления резервным копированием удобно сложить в папку C:scripts , разрешить выполнение с помощью Set-ExecutionPolicy Remotesigned и автоматизировать выполнение в Task Scheduler. С последним пунктом могут быть вопросы, поэтому обратите внимание, в настройках Action нужно указать в качестве Program powershell , а в качестве Argument путь к скрипту:
Разумеется, все вышесказанное относится больше к тестовым средам и в реальной среде подойдет компаниям малого и очень малого размеров, для средних и крупных разумно будет использовать адекватное ПО, например, System Center Data Protection Manager.
Надеюсь озвученная информация будет полезной, а если нужна будет помощь — пишите мне на почту d.kagarlickij@outlook.com