Нередко встречаются случаи, когда в организации используется один или несколько хостов под управлением Hyper-V, на которых расположены виртуальные машины с “инфраструктурой” и “бизнес-приложениями” (в кавычках, потому что граница между ними достаточно размыта).
В таком случае разумно выполнять резервное копирование виртуальных машин (расписание для “инфраструктурных” и “бизнесовых” обычно разное), резервное копирование конфигурации хостов и резервное копирования баз SQL сервера.
Резервное копирование в таких случаях чаще всего выполняется на USB диск или сетевую шару. Неплохо держать на UBS или локальном диске резервную копию “на подхвате”, а на сетевой шаре хранить бэкап на случай если что-то случится с основной площадкой.
Для таких задач использование “тяжелых” систем резервного копирования вроде SC DPM, Symantec, Acronis очевидно излишне.
Поэтому я решил написать несколько скриптов, которые будут создавать резервные копии, удалять старые и отправлять отчеты на электронную почту с шифрованием.
Резервное копирование виртуальных машин Hyper-V
Обычно для отправки отчетов используется отдельный почтовый ящик, пароль от которого не представляет особой ценности и поэтому хранится как plain text в теле скриптов.
Но во-первых я буду использовать свой основной почтовый ящик для отправки отчетов, а во-вторых хранить пароли в plain text плохо :)
Поэтому для начала сделаем “дамп” пароля (после выполнения командлета пароль нужно будет ввести):
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File C:\scripts\MailboxSecurePass.txt
Этот файл нужно будет создавать заново на каждом хосте, где вы будуте использовать этот скрипт.
Отправлять результаты будем не только на email, но и в Event Log – в инфраструктурах среднего и крупного размера это сильно удобнее. Для этого создадим в логе Application новый Source – “Backup scripts”:
New-EventLog –LogName Application –Source “Backup scripts”
.. что и как в него будет записываться:
Резервное копирование виртуальных машин можно делать с помощью их экспорта, например так:
[pastacode lang=”bash” user=”kagarlickij” repos=”windows-backup-automation-powershell” path_id=”vms_export.ps1″ revision=”” highlight=”” lines=”” provider=”bitbucket”/]
Такой вариант не очень удобен, и хотя его можно улучшить, лучше воспользоваться HVBackup:
[pastacode lang=”markup” user=”kagarlickij” repos=”windows-backup-automation-powershell” path_id=”vms_hvbackup.ps1″ revision=”” highlight=”” lines=”” provider=”bitbucket”/]
Если вам нужно хранить резервные копии в еще одном месте, их можно копировать по расписанию (например раз в сутки или неделю) с помощью такого скрипта:
[pastacode lang=”markup” user=”kagarlickij” repos=”windows-backup-automation-powershell” path_id=”vms_bckp_cp.ps1″ revision=”” highlight=”” lines=”” provider=”bitbucket”/]
Что касается восстановления, его я выполняю не с помощью HVBackup, а вручную.
Для этого распакуем архив и сделаем из него импорт виртуальной машины. Т.к. восстановление задача относительно редкая, и может проходить каждый раз с новыми условиями, есть смысл использовать не скрипт, а GUI:
Условно виртуальные машины можно поделить на infrastructure, production и lab, для каждого из типов скорректировать скрипт и настроить расписание.
Как показывает практика, несмотря на то что предложенное решение простое и бесплатное, оно в состоянии удовлетворить потребности большого количества небольших предприятий.
Резервное копирование хоста Hyper-V
Для резервного копирования хоста Hyper-V нам нужно будет Bare metal recovery, создадим соответствующее расписание с помощью Windows Server Backup:
Напомню, на компьютере, резервное копирование которого будет выполнятся должен присутствовать такой же пользователь как и на сетевой шаре, с таким же паролем – на время тестов я включил его в группу Backup Operators.
На сетевой шаре будет доступна только последняя резервная копия:
В моем случае я бэкаплю с помощью WBS только System state, так что мне этого будет вполне достаточно.
Если вам нужно несколько версий, или не только System State, есть смысл делать бэкапы на отдельный диск, тип бэкапа дифференциальный, так что с местом все будет ок:
Можно, конечно, извратится и таки сохранять на сетевой шаре несколько копий WSB, но т.к. виртуалки мы бэкапим отдельно то смысла в этом не так чтобы много.
Если все-таки решитесь на это, обратите внимание что старые резервные копии с сетеовой шары нужно будет удалять вручную или скриптом (только папки с именем Backup %date%):
[pastacode lang=”markup” user=”kagarlickij” repos=”windows-backup-automation-powershell” path_id=”wsb_old_delete.ps1″ revision=”” highlight=”” lines=”” provider=”bitbucket”/]
Результаты работы WSB можно отправлять на email из Task Scheduler, но я не хочу отправлять эту почту без шифрования, поэтому из Task Scheduler в случае успеха (ID 4):
… я буду запускать такой скрипт:
[pastacode lang=”markup” user=”kagarlickij” repos=”windows-backup-automation-powershell” path_id=”WSB_succeed_alert.ps1″ revision=”” highlight=”” lines=”” provider=”bitbucket”/]
.. и получать такое уведомление:
А в случае ошибок (ID 5,8,9,17,22,49,50,52,100,517,518,521,527,528,544,545,546,561,564,612):
.. запускать немного другой скрипт:
[pastacode lang=”markup” user=”kagarlickij” repos=”windows-backup-automation-powershell” path_id=”WSB_failure_alert.ps1″ revision=”” highlight=”” lines=”” provider=”bitbucket”/]
.. и получать соответствующее уведомление:
Если вы выполняете резервное копирование на диск, есть смысл сохранять вторую копию на сетевой шаре, сделать это можно с помощью скрипта, аналогичного тому, который я приводил для виртуальных машин.
SQL
Для резервного копирования SQL будем использовать встроенные средства, благо они достаточно хороши.
Для начала включим Autostart для SQL Server Agent:
Затем создадим оператора:
Запустим Database Mail Configuration Wizard:
Теперь включим все это дело в SQL Agent:
Используя мастер создадим Maintenance Plan:
.. и проверим его результат:
Как и с Windows Server Backup, для SQL резервное копирование выполнять удобнее на локальный диск, а затем копировать содержимое на сетевую шару.
Но в ряде случаев необходимо создавать резервные копии сразу на сетевую шару, для этого будем использовать процедуру с net use:
CREATE PROC map_drive_satrtup As EXEC xp_cmdshell 'net use X: \\fs1\bckp_share\sql [email protected]$$w0rd /user:bckp_usr' ________ sp_procoption @ProcName = 'map_drive_satrtup' , @OptionName = 'startup' , @OptionValue = 'on'
Проверить очень просто:
EXEC xp_cmdshell 'Dir X:'
Теперь можно скорректировать Maintenance Plan:
Если вы выполняете резервное копирование на диск, есть смысл сохранять вторую копию на сетевой шаре, сделать это можно с помощью скрипта, аналогичного тому, который я приводил для виртуальных машин.
Заключение
Чтобы выполнять скрипты регулярно, запускать их можно из Task Scheduler:
Надеюсь озвученная информация будет полезной, а если нужна будет помощь — используйте форму на главной странице моего сайта.