Хочется продолжить свой небольшой цикл статей о том, как использовать Poswershell для резервного копирования. В текущем случае мы будем рассматривать Exchange. Версии 2007 или 2010, по сути разницы особой нету. Так что скрипт сможет работать с обоими системами.Из интересного: в данном скрипте используется режим VSSFULLBACKUP, который после работы по резервному копированию делает обрезание (truncate) лог файлов. Так что нет больше необходимости задавать вопросы типа: «как обрезать лог файлы у Exchange?» Все проходит в автоматическом режиме и штатными средствами обслуживания БД.
#Бэкапим Exchange. Полный делелается и отрезаются логи. #------------------задаем переменные----------------------------- add-psSnapIn Windows.ServerBackup #Куда будем складывать бэкапы $TargetFolder = "\\SRV100\backup$\SRV101" #Полный путь до папки или файла, для бэкапа. разделитель запятая. $FilesToBackup ='C:\Program Files\Microsoft\Exchange Server\V14\Mailbox\Mailbox Database' #Сколько дней храним бэкапы (к примеру, после 4-х суток файлы из папки, #куда сливаются бэкапы - будут удалены) $DayToStore ="30" #Почтовый сервер $IPMailServer="172.0.0.2" #От кого отправляем $SenderEmail="WB_SRV101@InAdmin.ru" #Кому отправляем $RecipientEmail="Backup_report@InAdmin.ru" #--------------------------------------------------------- CLS #Получаем дату в формате 2009.06.15 $Date=Get-Date -uformat %Y.%m.%d #день недели 1,2...7 $week_day=get-date -uformat %u #Функция удаляющая старые данные Function RemoveOldBackup ( $Dir, $DaysToRemove ) { #Записываем дату до которой будем удалять $LastWrite = (Get-date).AddDays(-$DaysToRemove) #выбираем только папки и смотрим на дату Get-ChildItem $Dir | ForEach { If (( $_.Attributes -eq "Directory") -and ($_.LastWriteTime -le $LastWrite)) { #удаляем старые $RemoveDir = "$dir\"+$_.Name Remove-Item -Recurse -Force $RemoveDir write-output $_.Name "Папка удалена. ("$_.LastWriteTime") " } } } #Функция отправки почты function Send-mail ($subj = "VM" ,$body = "Text", $AttachPath = "0") { $SMTPClient = new-object System.Net.Mail.SMTPClient $Msg = new-object System.Net.Mail.MailMessage #Проверка, есть ли вложение if ($AttachPath -ne "0") { $Attach = new-object System.Net.Mail.Attachment($AttachPath) $Msg.Attachments.add($Attach) } $Msg.To.Add($RecipientEmail) $Msg.from=$SenderEmail $Msg.Subject = $subj $Msg.Body= $body $SMTPClient.Host=$IPMailServer $SMTPClient.Send($Msg) if ($AttachPath -ne "0") { $Attach.Dispose() } } #Выбираем и создаем папки #Папка с текущей датой $TodayFolder="$TargetFolder\$date" #Создаем папку с текущей датой if ((Test-Path -path $TodayFolder) -ne $True) { New-Item $TodayFolder -type directory } #Запускаем запись лога #Для того, что б потом посмотреть лог, он будет отправлен по почте. start-transcript "$TodayFolder\Backuplog.txt" #Удаляем старые данные с сервера write-output "### Очистка от старых резерв.копий" #Удаляем уже ненужные данные. RemoveOldBackup -Dir $TargetFolder -DaysToRemove $DayToStore #Стартуем бэкап write-output "### Начинаем резервное копирование данных" write-output "`t### Запускаем полный бэкап" #Создаем политику $BPolicy = New-WBPolicy #Добавляем нужные папки, где лежат базы и логи Exchange $FolderBackup = new-WBFileSpec "$FilesToBackup\" Add-wbFileSpec -policy $BPolicy $FolderBackup #задаем путь куда делаем бэкап Add-WBBackupTarget -Policy $BPolicy -Target (New-WBBackupTarget -network $TodayFolder) #Ставим тип VSS полный, что бы логи обрезались. Set-WBVssBackupOptions -Policy $BPolicy -VssFullBackup #Запускаем работу Start-WBBackup -Policy $BPolicy write-output "### Резервное копирование данных закончено" #останавливаем запись лога Stop-Transcript #Отправим отчет о проделанной работе #$MessageBody = get-content "$TodayFolder\Backuplog.txt" Send-mail -subj "Backup Report (SRV101 - Ex2010- MB)" -body "Job Report.`nDB: Mailbox Database" -AttachPath "$TodayFolder\Backuplog.txt"


С утверждением о том что «Все проходит в автоматическом режиме и штатными средствами обслуживания БД.» позволю не согласиться т.к. подрезка логов производится при бэкапе базы и никогда больше.
Чиста базы действительно производится средствами обслуживания БД.
Маленький комментарий.
Старые бэкапы правильнее удалять с случае если успешно завершился текущий.
Зачем? потому что при невыполнении текущего вы рискуете оказаться нисчем.
не помешало бы еще и результаты работы проверять
And then the following to monitor the job;
# ———————————————————————
# Wait for the backup to complete
# ———————————————————————
while ((Get-WBJob).State -eq «Running») { }
# —————
# Get Job Result
# —————
$ResultJob = Get-WBJob -Previous 1
If (!($ResultJob.JobState -eq «Completed»)) {
#Job Failed
//CODE//
} Else {
# Job Success
//CODE//
}
Подрезку логов можно производить и вручную, используя Eseutil.
По поводу проверки результатов, хорошая идея. Поправлю и допишу.
насчет eseutil сложно не согласиться.
Это тоже вариант бэкапа для бедных
1. отмонтировать базу
2. подрезать логи
3. скопировать файлы
4. сжать файлы
5. подмонтировать базу
Добрый день!
интересует можно ли сделать «инкрементальный» бэкап Exchange 2010
например на win 2003 сервер + exchange 2003 я делал следующим образом:
1. полный бэкап
2. инкрементальный бэкап (по сути логи Exchange)
3. инкрементальный бэкап (по сути логи Exchange)
….
6. инкрементальный бэкап (по сути логи Exchange)
затем опять полный….
допустим базы 100Гб инкрементальный составляет 2-5Г день итого 7 бэкапов 130Г
на 400Гб входит 21день…
а при полном бэкапе 4дня == 400Г…
сможет ли Exchange 2010 сосстановится если предложить ему полный бэкап, а затем бэкап логов??
Я пытался сделать такое. Для этого делал Research по этому направлению. Конфигурация у меня была с DAG хранилищами.
Вот что получилось: После того, как сделан полный бэкап делались копии лог файлов, т.е. по сути делался диф каждый день. Но заставить работать в такой схеме не особо получилось. Точную проблему уже не вспомню, но проблемы были с тем, что лог файлы не хотели особо подходить к файлу с базой. Приходилось выполнять log replay. А скорость восстановления становилось долгой.
Советую вам попробовать делать полную копию, а после этого (через) сутки сделать копию всех файлов, кроме самой базы. А потом все восстановить и посмотреть как заработает.
Для резервного копирования всех файлов стоит смотеть в сторону дополнительного коммандета Add-wbFileSpec -exlude.