Управление резервными копиями средствами PowerShell

Нередко встречается ситуация, когда резервное копирование 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 путь к скрипту:

Screen Shot 2014-10-21 at 10.36.57 AM

 

Разумеется, все вышесказанное относится больше к тестовым средам и в реальной среде подойдет компаниям малого и очень малого размеров, для средних и крупных разумно будет использовать адекватное ПО, например, System Center Data Protection Manager.

Надеюсь озвученная информация будет полезной, а если нужна будет помощь — пишите мне на почту d.kagarlickij@outlook.com

 

Pin It

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.