Ниже моего сценария резервного копирования я хотел бы получить несколько комментариев, советов и предложений по этому поводу. Он стал довольно большим и многофункциональным скриптом, это не мой первый, но я ищу способы его улучшить. особенно способ ведения журнала и способ копирования файлов
$LogFile = "z:\backup_ms01.log"
$before=get-date
"Start backup today $before">> $logfile
Write-Host `n
Write-Host ` ` "============ Start Backup MS01 Exchange databases ============" -foregroundcolor Cyan
write-host ` ` "Datum/tijd begin backup: $before" -foregroundcolor Cyan
write-host `n
Write-Host ` ` ` ` ` ` "opruimen oude backups" -foregroundcolor Cyan
$FolderPath="z:\backup"
$threeweeksAgo = (Get-Date).AddDays(-21)
"check old backups $threeweeksago">> $logfile
Get-ChildItem -Path $FolderPath | Where-Object {$_.mode -match "d" -and $_.CreationTime -lt $threeweeksAgo} | Select-Object Name, CreationTime >> $logfile
Get-ChildItem -Path $FolderPath | Where-Object {$_.mode -match "d" -and $_.CreationTime -lt $threeweeksAgo} | Remove-Item -recurse -force
"Oude backups zijn verwijderd" >> $logfile
$warningpreference="SilentlyContineu"
$server1=gc env:computername
if ($server1 -eq "ms01")
{
"De Server is idd $server1, folders worden aangemaakt...">> $logfile
$foldername=get-date -uformat "%Y-%m-%d"
New-Item "z:\backup\$foldername" -type directory
New-Item "z:\backup\$foldername\l" -type directory
New-Item "z:\backup\$foldername\p" -type directory
New-Item "z:\backup\$foldername\u" -type directory
$source1= "l:\services\*"
$source2= "p:\services\*"
$source3= "u:\services\*"
$dest1= "Z:\backup\$foldername\l"
$dest2= "Z:\backup\$foldername\p"
$dest3= "Z:\backup\$foldername\u"
"getting date and create destination folder date is z:\backup\$foldername">> $logfile
write-host ` ` ` ` ` ` "Stoppen services" -foregroundcolor Cyan
Get-Service | where-Object { $_.name -like '*Exchange*'} | Stop-Service -Force
$services = Get-Service MSExchange*
"====================================================">>$logfile
"Gestopte services:">> $logfile
foreach ($service in $services)
{$service | format-table Name, Status -HideTableHeader >> $logfile}
"====================================================">> $logfile
write-host ` ` ` ` ` ` "Services stoppen" -foregroundcolor Cyan
write-host ` ` ` ` ` ` "Starten Kopieren" -foregroundcolor Cyan
#L: schijf
$Folder1 = Get-childitem $source1
Copy-Item $source1 $dest1 -Force -recurse
"copy items from $source1 to $dest1">> $logfile
write-host ` ` ` ` ` ` ` ` "Kopieren L: klaar" -foregroundcolor Cyan
$Folder2 = Get-childitem $dest1
Compare-Object $Folder1 $Folder2 -Property Name, Length | Where-Object {$_.SideIndicator -eq "<="} >> $logfile
#P: schijf
$Folder3 = Get-childitem $source2
Copy-Item $source2 $dest2 -Force -recurse
"copy items from $source2 to $dest2">> $logfile
write-host ` ` ` ` ` ` ` ` "Kopieren P: klaar" -foregroundcolor Cyan
$Folder4 = Get-childitem $dest2
Compare-Object $Folder3 $Folder4 -Property Name, Length | Where-Object {$_.SideIndicator -eq "<="} >> $logfile
#U: schijf
$Folder5 = Get-childitem $source3
Copy-Item $source3 $dest3 -Force -recurse
"copy items from $source3 to $dest3">> $logfile
write-host ` ` ` ` ` ` ` ` "Kopieren U: klaar" -foregroundcolor Cyan
$Folder6 = Get-childitem $dest3
Compare-Object $Folder5 $Folder6 -Property Name, Length | Where-Object {$_.SideIndicator -eq "<="} >> $logfile
write-host ` ` ` ` ` ` "Kopieren klaar" -foregroundcolor Cyan
write-host ` ` ` ` ` ` "Services starten" -foregroundcolor Cyan
Get-Service | where-Object { $_.name -like '*Exchange*'} | Start-Service | out-null
$services1 = Get-Service MSExchange*
"====================================================">> $logfile
"Gestarte services:">> $logfile
foreach ($service1 in $services1)
{$service1 | format-table Name, Status -HideTableHeaders >> $logfile}
"====================================================">> $logfile
"ending backup">> $logfile
}
$after=get-date
$verstreken=($after - $before)
write-host `n
Write-host ` ` ` ` ` ` ` "Overige informatie:" -foregroundcolor Cyan
write-host ` ` ` ` ` ` ` "Duur van de backup: $verstreken" -foregroundcolor Cyan
"Runtime = $verstreken" >>$logfile
Get-date >$logfile
$msg = new-object Net.Mail.MailMessage
$att = new-object Net.Mail.Attachment($logfile)
$smtp = new-object Net.Mail.SmtpClient($server1)
$msg.From = “...@.....”
$msg.To.Add(”...@.....”)
$msg.To.Add("...@.....”)
$msg.To.Add("...@.....")
$msg.Subject= “Backup MS01 mail database”
$msg.Body = “Logfile is bijgevoegd” + $after
$msg.Attachments.Add($att)
$smtp.Send($msg)
$einde= Get-date
write-host `n
write-host ` ` "Datum/tijd einde backup: $einde" -foregroundcolor Cyan
Write-Host ` ` "============ Einde Backup MS01 Exchange databases ============" -foregroundcolor Cyan
tl; dr
Вы спрашивали мнение, и, короче, сбросьте скрипт и используйте встроенную утилиту Windows Server Backup. Он будет намного более устойчивым, чем ваш скрипт, и сможет делать правильные резервные копии с учетом Exchange.
Я не пытался полностью понять ваш сценарий, но похоже, что вы останавливаете службы Exchange, копируете файлы базы данных, а затем перезапускаете службы Exchange. Это не способ резервного копирования Exchange.
Exchange разработан для постоянной работы и поэтому позволяет выполнять резервное копирование в Интернете. Это означает, что вы можете продолжать использовать Exchange во время резервного копирования и по-прежнему иметь согласованную резервную копию. Кроме того, если ваш скрипт завершится наполовину, скорее всего, все ваши службы останутся остановленными, чего не будет делать надлежащая утилита резервного копирования с поддержкой Exchange.
Кроме того, если у вас не включено циклическое ведение журнала (кстати, это плохо), у вас в руках бомба замедленного действия. Когда Exchange выполняет резервное копирование с использованием подходящего API VSS, журналы транзакций сбрасываются. Важно, чтобы они часто сбрасывались на диск, потому что, если том, на котором ведутся журналы, заполняется до предела, базы данных будут отключены.
Существует множество решений для правильного резервного копирования Exchange, некоторые из которых являются дорогостоящими, другие - не очень. Если вы ищете полную бесплатность, Windows Server Backup интегрирован в операционную систему и может выполнять резервное копирование с учетом Exchange.
Для начала, похоже, что у вас много избыточного кода, просто скопированного / вставленного с несколькими разными значениями. Я бы изменил ваш сценарий для использования функций, а затем передал бы эти разные значения при вызове функции. Это упростит понимание и поддержку вам и / или кому-то другому.