Powershell резервное копирование файлов

Обновлено: 05.07.2024

не работает конкретно вот этот кусок:

причем, если запускать эту часть отдельно, выделяя ее (я использую Power GUI), то удаление файлов происходит.

В связке же со всем кодом удаления не происходит, а все остальные действия выполняются успешно.

ваша проблема вот в чём:

error_mail backupsucsess archive; return 1

видите, в конце стоит Return 1? Если бакуп выполниолся, то вызывается функция отправки письма об успешном бакупе и далее выполняется Return, который блокирует выполнение кода в пределах текущей функции, а в вашем случае это весь скрипт. Поэтому не используйте оператор Return без особой на то надобности, тем более вы этот Return никак не используете. Есть смысл заменить его на тот же exit, который я использую. И будет вам счастье.

Все ответы

Вам нужна помощь в написании или, чтобы мы за вас его написали?

И т.д. в первых выдачах гугла. Возможно, автор очень занятой человек и не может тратить свое драгоценное время на самостоятельный поиск .

Нужна помощь в написании скрипта бэкапа.

Делать он должен следующее:

проверять наличие папки для бэкапа;

проверять наличие свободного места на жестком диске;

архивировать файлы внешним архиватором;

хранить в папке бэкапы последнего дня последних двух месяцев и за вчераний день, все остальное удалять;

любой отчет об ошибке отправлять письмом.

вот жеж, где лентяй, а?

Вобщем, подпилил свой скрипт бэкапа баз 1С встроенным ntbackup. Скрипт написан под мои условия, поэтому перед бездумным копированием разберите на бумаге работу скрипта и внесите необходимые изменения, как пути к папкам и файлам, адрес почты и размер свободного места на диске, при котором разрешается делать бэкап. Для минимального размера диска взял 5ГБ. Если свободного места меньше 5ГБ, то бэкап выполняться не будет, а только отправлено уведомление на почту, что места нету.

new-item -path F:\BaseBackups\1C -itemtype directory -ErrorAction SilentlyContinue

new-item -path F:\BackupTemp -itemtype directory -ErrorAction SilentlyContinue

if ( test-path F:\BaseBackups\1C)

$log = $env:userprofile + "\Local Settings\Application Data\Microsoft\Windows NT\NTBackup\data"

remove-item $log \ * .log -force

$PrevMonth = ( Get-Date -Month ( Get-Date ).month -Day 1).adddays(-1)

$PrevMonth = ( Get-Date ) - $PrevMonth

$2PrevMonth = ( Get-Date -Month (( Get-Date ).month -1) -Day 1).adddays(-1)

$2PrevMonth = ( Get-Date ) - $2PrevMonth

$FreeSpace = gwmi Win32_LogicalDisk | Where

if ( test-path F:\BackupTemp)

C:\WINDOWS\system32\ntbackup.exe backup "@F:\WorkSpace\Jobs\1CDayly.bks" /a /d "Set created 27.11.2007 at 14:34" /v:no /r:no /rs:no /hc:off /m normal /j "BaseEveryDay" /l:s /f "F:\BackupTemp\1C_$date.bkf" | out-null >

$logfile = [ string ]:: join ( "`n" ,( get-content $log \ * .log))

copy-item F:\BackupTemp\1C_$date.bkf -destination F:\BaseBackups\1C

copy-item F:\BackupTemp\1C_$date.bkf -destination \\ BackupServer\BackupShare\1C

if (( test-path F:\BaseBackups\1C\1C_$date.bkf) -and ( Test-Path \\ BackupServer\BackupShare\1C\1C_ $date .bkf))

remove-item F:\BackupTemp\1C_$date.bkf -force

Отлично, а я уж думал потом освобожусь напишу если ни кто не решится.

Еще один вопрос: как в данной строке прописать запуск архиватора не используя путь?

c:\windows\RAR a -r $temp1 \ $date $path1 \ * . * | out-null

чтоб получилось подобие этого

RAR a -r $temp1 \ $date $path1 \ * . * | out-null

$PrevMonth = ( Get-Date -Month ( Get-Date ).month -Day 1).adddays(-1)

$PrevMonth = ( Get-Date ) - $PrevMonth

$2PrevMonth = ( Get-Date -Month (( Get-Date ).month -1) -Day 1).adddays(-1)

$2PrevMonth = ( Get-Date ) - $2PrevMonth

Можно ли эту часть кода разместить в низу? Чтоб файлы удалялись в самую последнюю очередь?

Да, можно вот так:

new-item -path F:\BaseBackups\1C -itemtype directory -ErrorAction SilentlyContinue

new-item -path F:\BackupTemp -itemtype directory -ErrorAction SilentlyContinue

if ( test-path F:\BaseBackups\1C)

$log = $env:userprofile + "\Local Settings\Application Data\Microsoft\Windows NT\NTBackup\data"

remove-item $log \ * .log -force

$FreeSpace = gwmi Win32_LogicalDisk | Where

if ( test-path F:\BackupTemp)

C:\WINDOWS\system32\ntbackup.exe backup "@F:\WorkSpace\Jobs\1CDayly.bks" /a /d "Set created 27.11.2007 at 14:34" /v:no /r:no /rs:no /hc:off /m normal /j "BaseEveryDay" /l:s /f "F:\BackupTemp\1C_$date.bkf" | out-null >

$logfile = [ string ]:: join ( "`n" ,( get-content $log \ * .log))

copy-item F:\BackupTemp\1C_$date.bkf -destination F:\BaseBackups\1C

copy-item F:\BackupTemp\1C_$date.bkf -destination \\ BackupServer\BackupShare\1C

if (( test-path F:\BaseBackups\1C\1C_$date.bkf) -and ( Test-Path \\ BackupServer\BackupShare\1C\1C_ $date .bkf))

remove-item F:\BackupTemp\1C_$date.bkf -force

$PrevMonth = ( Get-Date -Month ( Get-Date ).month -Day 1).adddays(-1)

$PrevMonth = ( Get-Date ) - $PrevMonth

$2PrevMonth = ( Get-Date -Month (( Get-Date ).month -1) -Day 1).adddays(-1)

$2PrevMonth = ( Get-Date ) - $2PrevMonth

Но учтите, что если по каким либо причинам бэкап не выполнился (не прошла любая из проверок), то ротации архивов не произойдёт, а только при полностью успешном завершении бэкапа. И можно поподробнее, что именно у вас не вышло?

Вышеуказанный вариант я пробовал, но все равно не происходит у даления устаревших файлов.

Само выполнения скрипта целиком идет и завершается без ошибок.

Еще один вопрос: как в данной строке прописать запуск архиватора не используя путь?

c:\windows\RAR a -r $temp1 \ $date $path1 \ * . * | out-null

чтоб получилось подобие этого

RAR a -r $temp1 \ $date $path1 \ * . * | out-null

для этого нужно сделать:

Вышеуказанный вариант я пробовал, но все равно не происходит у даления устаревших файлов.

Само выполнения скрипта целиком идет и завершается без ошибок.

прошу прощения, там дважды DIR написан. сотрите одну команду DIR из строки удаления.

з.ы. пофиксил ошибку.

вот код целиком - посмотрите что не так.

$date = Get-Date -UFormat % Y_ % m_ % d

$subj = "Attention please!"

$body = "Alarm! Script not work!"

param ( $reason , $who )

$subj = "$Shortage of an empty seat"

$body = "$date - $who dont create"

$subj = "It was not possible to make reserve copying"

$subj = "Mistake of copying of archive"

$body = "$date - $who dont copy"

$subj = "Creation of archive is successfully completed"

$body = "$date - $who create sucsess"

$subj = "Creation of archive has passed with a mistake"

$body = "$date - $who create error"

$client .Send( $msg )

new-item -path $temp1 -itemtype directory -ErrorAction SilentlyContinue

if ( -not ( $FreeSpace .FreeSpace /1GB -ge $Gb ))

if ( test-path $temp1 )

RAR a -r $temp1 \ $date $path1 \ * . * | out-null >

copy-item $temp1 \ * .rar -destination $dest1

remove-item $temp1 \ * .rar -force

error_mail backupsucsess archive; return 1>

$PrevMonth = ( Get-Date -Month ( Get-Date ).month -Day 1).adddays(-1)

$PrevMonth = ( Get-Date ) - $PrevMonth

$2PrevMonth = ( Get-Date -Month (( Get-Date ).month -1) -Day 1).adddays(-1)

$2PrevMonth = ( Get-Date ) - $2PrevMonth

расскажите конкретно, какие куски кода у вас не работают?

не работает конкретно вот этот кусок:

причем, если запускать эту часть отдельно, выделяя ее (я использую Power GUI), то удаление файлов происходит.

В связке же со всем кодом удаления не происходит, а все остальные действия выполняются успешно.

не работает конкретно вот этот кусок:

причем, если запускать эту часть отдельно, выделяя ее (я использую Power GUI), то удаление файлов происходит.

В связке же со всем кодом удаления не происходит, а все остальные действия выполняются успешно.

ваша проблема вот в чём:

error_mail backupsucsess archive; return 1

видите, в конце стоит Return 1? Если бакуп выполниолся, то вызывается функция отправки письма об успешном бакупе и далее выполняется Return, который блокирует выполнение кода в пределах текущей функции, а в вашем случае это весь скрипт. Поэтому не используйте оператор Return без особой на то надобности, тем более вы этот Return никак не используете. Есть смысл заменить его на тот же exit, который я использую. И будет вам счастье.

Все работает. Огромное спасибо.

Мой первый скрипт можно внедрять =)

Все работает. Огромное спасибо.

Мой первый скрипт можно внедрять =)

только мелкие ошибки пофиксите, как тут:

уберите решётку и поставьте знак доллара.

Коллеги подскажите есть аналогичное задание.

3. сейчас есть архивы в этой папке аж за 2012 год.

В этой статье демонстрируется, как с помощью PowerShell настроить Azure Backup на Windows Server или клиенте Windows и как управлять резервным копированием и восстановлением данных.

Установите Azure PowerShell

В этой статье предусмотрено использование модуля Azure Az PowerShell, который является рекомендуемым модулем PowerShell для взаимодействия с Azure. Чтобы начать работу с модулем Az PowerShell, ознакомьтесь со статьей Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.

Создание хранилища Служб восстановления

Чтобы создать хранилище служб восстановления, выполните описанные ниже действия. Хранилище служб восстановления отличается от хранилища службы архивации.

Если вы используете Azure Backup впервые, выполните командлет Register-AzResourceProvider, чтобы зарегистрировать поставщик Службы восстановления Azure в своей подписке.

Хранилище Служб восстановления представляет собой ресурс ARM, поэтому его нужно разместить в группе ресурсов. Вы можете выбрать существующую группу ресурсов или создать новую. При создании группы ресурсов укажите ее имя и расположение.

Выполните командлет New-AzRecoveryServicesVault, чтобы создать хранилище. Разместите хранилище там же, где находится группа ресурсов.

Укажите необходимый тип избыточности хранилища: Вы можете использовать локально избыточное хранилище (LRS), геоизбыточное хранилище (GRS) или хранилище, избыточное между зонами (ZRS). В следующем примере параметр -BackupStorageRedundancy для хранилища testvault имеет значение GeoRedundant.

Для многих командлетов службы архивации Azure требуется объект хранилища служб восстановления в качестве входных данных. По этой причине объект хранилища Служб восстановления резервных копий удобно хранить в переменной.

Просмотр хранилищ в подписке

Чтобы получить список всех хранилищ в текущей подписке, используйте командлет Get- AzRecoveryServicesVault. Он позволяет убедиться в том, что хранилище создано, или узнать, какие хранилища доступны в подписке.

Выполнив команду Get-AzRecoveryServicesVault, вы получите список всех хранилищ в подписке.

Обновление агента MARS

Версии агента службы восстановления Microsoft Azure Recovery Service (MARS) ранее 2.0.9083.0 связаны зависимостью со Службой контроля доступа Azure (ACS). Агент MARS также называется агентом Azure Backup.

В 2018 году Azure отказался от Службы контроля доступа Azure (ACS). Начиная с 19 марта 2018 г., использование любых версий агента MARS ниже 2.0.9083.0 будет приводить к сбою резервного копирования. Чтобы избежать сбоев резервного копирования или устранить их, установите последнюю версию агента MARS. Чтобы указать серверы, для которых требуется обновление агента MARS, выполните действия, описанные в разделе Обновление агента службы восстановления Microsoft Azure (MARS).

Агент MARS используется для резервного копирования файлов, папок и данных состояния системы в Azure. System Center DPM и Azure Backup Server используют агент MARS для резервного копирования данных в Azure.

Установка агента службы архивации Azure.

Прежде чем устанавливать агент службы архивации Azure, необходимо загрузить установщик и разместить его в системе Windows Server. Последнюю версию установщика можно загрузить в центре загрузки Майкрософт или на странице панели мониторинга для хранилища служб восстановления. Сохраните установщик в удобном для вас месте, например в папке C:\Downloads\* .

Можно также получить установщик с помощью PowerShell:

Чтобы установить агент, в консоли PowerShell с повышенными привилегиями выполните следующую команду:

Агент будет установлен с параметрами по умолчанию. Установка займет всего несколько минут и пройдет в фоновом режиме. Если параметр /nu не указан, в конце установки откроется окно Центра обновления Windows для проверки наличия обновлений. После установки агент появится в списке установленных программ.

Чтобы просмотреть список установленных программ, выберите Панель управления > Программы > Программы и компоненты.

Агент установлен

Варианты установки

Чтобы просмотреть все доступные в командной строке параметры, используйте следующую команду:

Доступны следующие параметры.

Параметр Сведения По умолчанию
/q Позволяет выполнить тихую установку. -
/p:"расположение" Путь к папке установки для агента архивации Azure. C:\Program Files\Microsoft Azure Recovery Services Agent
/s:"расположение" Путь к папке кэша для агента архивации Azure. C:\Program Files\Microsoft Azure Recovery Services Agent\Scratch
/m Позволяет явно согласиться на использование Центра обновления Майкрософт. -
/nu Позволяет отказаться от проверки наличия обновлений после завершения установки. -
/d Удаляет агент служб восстановления Microsoft Azure. -
/ph Адрес узла прокси-сервера. -
/po Номер порта узла прокси-сервера. -
/pu Имя пользователя узла прокси-сервера. -
/pw Пароль прокси-сервера. -

После создания хранилища служб восстановления скачайте последнюю версию агента и учетные данные хранилища и сохраните их в удобном расположении, например C:\Downloads.

Ошибка, возникающая при создании сертификата хранилища, исправлена в выпуске Az 3.5.0. Для скачивания сертификата хранилища используйте выпуск Az 3.5.0 или более поздний.

В последней версии модуля Az для PowerShell из-за ограничений базовой платформы для скачивания учетных данных хранилища требуется самозаверяющий сертификат. В следующем примере показано, как предоставить самозаверяющий сертификат и скачать учетные данные хранилища.

На сервере Windows Server или DPM запустите командлет Start-OBRegistration , чтобы зарегистрировать компьютер в хранилище. Этот и другие командлеты, используемые для резервного копирования, входят в модуль MSONLINE, который установщик агента MARS добавляет в процессе установки.

Установщик агента не обновляет переменную $Env:PSModulePath. Это означает, что автоматическая загрузка модуля завершается ошибкой. Чтобы устранить эту проблему, выполните следующие действия.

Кроме того, модуль можно вручную загрузить в скрипте следующим образом:

Когда вы загрузите командлеты Online Backup, зарегистрируйте учетные данные хранилища:

Не используйте относительные пути для указания файла с учетными данными хранилища. Укажите абсолютный путь в качестве входных данных командлета.

Параметры сети

Если подключение компьютера под управлением Windows к Интернету осуществляется через прокси-сервер, параметры этого прокси-сервера могут сообщаться агенту. В нашем примере прокси-сервер не используется, поэтому мы явным образом удаляем все данные прокси-сервера.

Управлять использованием пропускной способности для выбранных дней недели можно с помощью параметров work hour bandwidth и non-work hour bandwidth

Внесение сведений о прокси-сервере и пропускной способности выполняется с помощью командлета Set-OBMachineSetting :

Параметры шифрования.

Для защиты конфиденциальности данных резервные копии данных, отправляемые в службу архивации Azure, зашифровываются. Используемая для шифрования парольная фраза является "паролем" для расшифровки данных во время их восстановления.

Чтобы создать ПИН-код безопасности, выберите действие Создать в меню Параметры > Свойства > ПИН-код безопасности раздела Хранилище Служб восстановления на портале Azure.

ПИН-код безопасности можно создать только на портале Azure.

После этого примените его в качестве generatedPIN в следующей команде:

После создания парольной фразы надежно сохраните ее. Восстановить данные из Azure без этой парольной фразы нельзя.

Резервное копирование файлов и папок

Для управления всеми резервными копиями с серверов и рабочих станций Windows, которые имеются в службе резервного копирования Azure, применяется соответствующая политика. Эта политика содержит три элемента:

  1. Расписание резервного копирования — определяет, когда следует создавать резервные копии и синхронизировать их со службой.
  2. Расписание хранения — определяет период хранения точек восстановления в Azure.
  3. Указания включения/исключения файлов — определяет, для каких элементов следует создавать резервные копии.

Поскольку мы будем использовать автоматическое резервное копирование данных, в этой статье предполагается, что заданных настроек нет. Начнем с создания новой политики резервного копирования с помощью командлета New-OBPolicy .

В настоящее время политика пуста, и необходимо воспользоваться другими командлетами, чтобы определить, какие элементы будут включены или исключены, когда будет выполняться резервное копирование и где будут храниться резервные копии.

Настройка расписания резервного копирования

Первым из трех компонентов политики является расписание резервного копирования, которое создается с помощью командлета New-OBSchedule. В расписании резервного копирования указывается, когда необходимо выполнить резервное копирование. При создании расписания необходимо указать два входных параметра:

  • Дни недели , в которые необходимо выполнять резервное копирование. Можно указать, чтобы задание резервного копирования выполнялось только один день или каждый день недели либо в определенный промежуток времени.
  • Время запуска резервного копирования. Вы можете определить до трех разных значений времени дня, когда будет выполняться резервное копирование.

Например, политику резервного копирования можно настроить таким образом, чтобы соответствующее задание выполнялось в 16:00 каждые субботу и воскресенье.

Расписание резервного копирования должно быть связано с политикой. Этого можно добиться с помощью командлета Set-OBSchedule.

Настройка политики хранения

Политика хранения определяет, как долго хранятся точки восстановления, созданные из заданий резервного копирования. При создании новой политики хранения с помощью командлета New-OBRetentionPolicy можно указать число дней, в течение которых точки восстановления будут храниться в службе Azure Backup. В приведенном ниже примере для политики хранения задано 7 дней.

Политику хранения следует связать с основной политикой с помощью командлета Set-OBRetentionPolicy:

Включение и исключение файлов для резервного копирования

Объект OBFileSpec определяет файлы для включения в резервную копию или исключения из нее. Это набор правил, которые определяют область защищенных файлов и папок на компьютере. Можно создать любое количество правил включения или исключения файлов и связать их с политикой. При создании нового объекта OBFileSpec, можно сделать следующее:

  • указать файлы и папки для включения в резервную копию;
  • указать файлы и папки для исключения из резервной копии;
  • указать рекурсивное резервное копирование данных в папке либо указать, что в резервную копию следует включить только файлы верхнего уровня в указанной папке.

Для выполнения последней задачи необходимо установить флаг -NonRecursive в команде New-OBFileSpec.

В примере ниже выполняется резервное копирование томов C: и D: с исключением двоичных файлов операционной системы в папке Windows и других временных папках. Для этого мы создадим две спецификации файлов с помощью командлета New-OBFileSpec — для включения и исключения. После создания спецификации файлов связываются с политикой с помощью командлета Add-OBFileSpec .

Применение политики

Объект политики готов и имеет связанные расписание резервного копирования, политику хранения, а также список включенных и исключенных файлов. На данном этапе эту политику можно зафиксировать в службе архивации Azure для использования. Перед применением новой политики убедитесь в отсутствии существующих политик резервного копирования, связанных с сервером, с помощью командлета Remove-OBPolicy. При удалении политики будет запрошено соответствующее подтверждение. Чтобы пропустить подтверждение, используйте в командлете флаг -Confirm:$false .

Если при выполнении командлет предлагает задать ПИН-код системы безопасности, см. раздел Метод 1.

Фиксация объекта политики выполняется с помощью командлета Set-OBPolicy . При этом также будет запрашиваться соответствующее подтверждение. Чтобы пропустить подтверждение, используйте в командлете флаг -Confirm:$false .

Чтобы просмотреть сведения о существующей политике резервного копирования, воспользуйтесь командлетом Get-OBPolicy . Чтобы получить подробные сведения, воспользуйтесь командлетом Get-OBSchedule для расписания резервного копирования и командлетом Get-OBRetentionPolicy для политик хранения.

Выполнение резервного копирования по требованию

После настройки соответствующей политики резервное копирование будет выполняться по расписанию. Вы также можете выполнить резервное копирование по запросу с помощью командлета Start-OBBackup:

Состояние резервного копирования системы Windows Server в агенте MARS

В этом разделе рассматривается команда PowerShell, которая настраивает состояние системы в агенте MARS.

Расписание

Сохранение

Настройка расписания и времени хранения

Проверка политики

Восстановление данных из службы архивации Azure

В этом разделе представлены шаги по настройке автоматического восстановления данных из службы архивации Azure. Выполнение настройки предполагает указанные ниже действия.

  1. Выбор исходного тома
  2. Выбор точки резервного копирования для восстановления
  3. Выбор элемента для восстановления
  4. Запуск процесса восстановления

Выбор исходного тома

Чтобы восстановить элемент из Azure Backup, сначала необходимо определить его источник. Поскольку мы выполняем команды в контексте Windows Server или клиента Windows, компьютер уже определен. Далее необходимо определить том, на котором находится источник элемента. Список томов или источников, для которых на данном компьютере выполнено резервное копирование, можно получить, выполнив командлет Get-OBRecoverableSource . Эта команда возвращает массив всех источников на сервере или клиенте, для которых созданы резервные копии.

Выбор точки резервного копирования для восстановления

Чтобы получить список точек резервного копирования, выполните командлет Get-OBRecoverableItem с соответствующими параметрами. В нашем примере мы выберем последнюю точку резервного копирования для исходного тома C: и применим ее для восстановления определенного файла.

Объект $Rps представляет собой массив точек резервного копирования. Первый элемент является последней точкой, а n-й элемент — самой старой. Чтобы выбрать последнюю точку, мы укажем $Rps[0] .

Выбор элемента для восстановления

Чтобы восстановить конкретный файл, укажите имя этого файла относительно корневого тома. Например, чтобы получить файл C:\Test\Cat.job, воспользуйтесь следующей командой.

Запуск процесса восстановления

Чтобы запустить процесс восстановления, необходимо сначала указать параметры восстановления. Это можно сделать с помощью командлета New-OBRecoveryOption . Для примера предположим, что нужно восстановить файлы в папку C:\temp и нужно пропустить файлы, которые уже существуют в целевой папке C:\temp. Для создания такого метода восстановления используйте следующую команду:

Теперь запустите процесс восстановления, выполнив команду Start-OBRecovery со значением $Item из выходных данных командлета Get-OBRecoverableItem :

Удаление агента службы архивации Azure.

Удалить агент службы архивации Azure можно с помощью следующей команды:

Удаление с компьютера двоичных файлов агента имеет некоторые последствия, которые следует учитывать.

  • С компьютера удаляется фильтр файлов, а также останавливается отслеживание изменений.
  • Все данные политики удаляются с компьютера, однако сведения о политике по-прежнему хранятся в службе.
  • Удаляются все расписания резервного копирования, и последующие операции резервного копирования больше не выполняются.

Но хранящиеся в Azure данные сохранятся в течение периода времени, установленного политикой хранения. Предыдущие точки восстановления автоматически рассматриваются как устаревшие.

Удаленное управление

PowerShell обеспечивает удаленное управление агентом службы архивации Azure, политикой и источниками данных. Компьютер, который будет управляться удаленно, необходимо специально подготовить.

По умолчанию служба WinRM настроена на запуск вручную. Установите тип запуска Automatic. Служба запустится. Чтобы проверить работу службы WinRM, присвойте свойству Status значение Running.

Для удаленного взаимодействия необходимо настроить PowerShell.

Теперь компьютером можно управлять удаленно. Начните с установки агента. Например, следующий сценарий копирует агент на удаленный компьютер и устанавливает его.

Дальнейшие действия

Дополнительная информация о службе Azure Backup для сервера или клиента Windows.


Допустим, вы системный администратор в малой/средней (да чего уж там, иногда даже большой) компании, перед которым стоит задача организации резервного копирования файлового сервера исключительно с помощью подручных средств. Или вы продвинутый пользователь, которому небезразлична судьба хранящихся на вашем жестком диске файлов.

Пусть задача будет звучать следующим образом:

  1. Как продолжение предыдущего пункта, формат архива также должен быть открытым и распространенным, чтобы в случае чего его без проблем открыть откуда угодно с помощью чего-угодно
  2. Более того, он должен быть таким, чтобы из любого, даже дифференциального архива, можно было бы без труда вытащить любой файл, не распаковывая для этого весь архив.
  3. Глубина архивации должна настраиваться (что называется, backup rotate).
  4. Было бы неплохо также с архивом сохранять дескрипторы безопасности NTFS.
  5. И вообще, хочется максимальной расширяемости и настраиваемости, если завтра возникнет желание нагородить дополнительный функционал.

Выбор средств

Поскольку сторонние средства мы решили отметать, то как такового выбора технологий у нас почти не остается:

Глубоко вздохнув, приходится делать шаг в сторону от одного из вышеозначенных принципов и взять на роль архиватора готовое решение. С точки зрения опенсорсности и бесплатности опять же практически безальтернативно выбор падает на:

План алгоритма

Скрипт

Ходить вокруг да около тут незачем, сразу публикую готовый скрипт:

Для работы скрипта мы должны заполнить выделенный в начале файла блок переменных (пути архивации, глубина хранения архивов) и создать файл с папками-источниками, например, такой:

Использование

Убедившись, что всё работает (или поправив параметры, если нет) создаём задание в планировщике (отдельно для полного копирования и отдельно для дифференциального).

Экспортированный пример задания: scheduled-backup-task-full.xml

Ну вот, в целом, и всё, можно настроить, представить папку с архивами системе мониторинга наличия резервных копий (если есть) и забыть.

Замечания

  • Для корректной работы (в первую очередь для создания теневой копии) powershell должен быть запущен от имени администратора (или «с наивысшими привилегиями» в терминологии планировщика заданий).
  • По идее способ также годится для горячего консистентного резервного копирования хоть баз MSSQL, хоть MS Exchange (при установке соотв. shadow copy providers, которые к подобному софту идут в комплекте), хотя конкретно в этих случаях удобнее пользоваться встроенными средствами.
  • Инкрементным резервным копированием я не пользуюсь (много хлопот найти удаленный файл среди кучи инкрементных архивов), но если возникнет потребность, то он получается буквально комбинированием нескольких срочек из полного и дифференциального блоков скрипта.
  • Здесь также не реализован механизм сохранения ACL (формат zip, да и 7zip не поддерживают хранение дескрипторов безопасности в архиве; RAR умеет, но это уже не свободное ПО, что сильно противоречит условиям задачи). В случае необходимости дескрипторы можно сохранять в файл встроенными утилитами типа icacls и добавлять полученный дамп в создаваемый архив.
  • Увы и ах, алгоритм не подходит для XP/2003. Сложность возникает на моменте создания ярлыка на теневую копию (в этих ОС нет утилиты mklink, а по-быстрому обойти эти грабли у меня не вышло).

Перед необходимостью изобретать свой велосипед автор за несколько лет намучался перепробовал большое количество разнообразного бесплатного готового ПО со похожей функциональностью (Cobian Backup, COMODO Backup и др.). Вдоволь находившись по разнообразным встроенным в упомянутый софт граблям, было принято решение написать что-то своё. На данный момент описанное решение успешно работает на серверах (Windows Server 2008 R2) и рабочих станциях (Windows 7 и Windows 8.1).

комментарии ( 41 )

Под XP/2003 для создания линков скорее всего поможет утилита junction
  1. junction не входит в комплект XP/2003.
  2. При попытке скормить ей путь до теневой копии (вида "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\"), ругается на то, что якобы данный том имеет файловую систему отличную от NTFS и ярлык не создает.
  • Bareos server components run on Windows now
  • Better VSS support Volume Mount Points (VMP) supported
  • Windows Encrypted Filesystems (EFS) supported
  • Windows Dedup Support
  • System Registry key 'NotToBackup' supported
  • New installers for pre- and post Vista Windows versions
Да, но зачем? Чем не устраивает встроенная в Windows система архивации? Для Bare-Metal бекапа еще ничего, но есть у нее ограничение. На сетевое хранилище только FullBackup. Подключаете сетевое хранилище по iSCSI и делаете инкрементальные бекапы. Зачастую он устраивает, но не всегда:
1. Конкретно iSCSI не всегда подходит для домашнего применения, да и в корпоративной инфраструктура не всегда имеется.
2. Также часто хочется дополнительного функционала (прикрутить оповещения на почту или еще что).
3. Если нужно бэкапить не весь том целиком, а лишь отдельные каталоги, то встроенная система этого делать не умеет.
4. Плюс, если просто всё бэкапить в один образ, так как это делает Windows Image Backup (и полные, и дифф. бэкапы), то потом возникают сложности с мониторингом наличия файлов бэкапа (когда создается по одному файлу на каждый день, гораздо проще контролировать, когда и какие копии не создались, какие создались, но почему-то оказались пустыми архивами (например, кончилось место на целевом диске) и т.п.).
1. Конкретно iSCSI не всегда подходит для домашнего применения, да и в корпоративной инфраструктура не всегда имеется.

FreeNAS вам в помощь. А в домашней инфраструктуре бекапы вообще можно делать на подключенный локальный диски.

2. Также часто хочется дополнительного функционала (прикрутить оповещения на почту или еще что).
3. Если нужно бэкапить не весь том целиком, а лишь отдельные каталоги, то встроенная система этого делать не умеет.
4. Плюс, если просто всё бэкапить в один образ, так как это делает Windows Image Backup (и полные, и дифф. бэкапы), то потом возникают сложности с мониторингом наличия файлов бэкапа (когда создается по одному файлу на каждый день, гораздо проще контролировать, когда и какие копии не создались, какие создались, но почему-то оказались пустыми архивами (например, кончилось место на целевом диске) и т.п.).


FreeNAS вам в помощь. А в домашней инфраструктуре бекапы вообще можно делать на подключенный локальный диски.

Тут мы уходим немного в оффтоп, а точнее, в вопросы подходов построения ИТ-инфраструктуры :)
Нагородить iSCSI ТОЛЬКО ради функции дифференциального/инкрементного бэкапа в моем случае неоправданное роскошество. Наколенный файловый zip-бэкап поддерживать/разворачивать/и т.д. может и рядовой эникей после 10-минутного инструктажа. Разобраться с какой-либо проблемой NAS4Free, OMV и подобн. софтовых таргетов потребует привлечения сисадмина более высокого уровня. Итого при прочих равных (если нам не нужна time machine и состояние каждого файла на любой момент времени) стоимость владения инфраструктурой в описанном вами случае выше.

По первому пункту прошу пардона, действительно отдельные папки выбрать можно. По второй части: я имею в виду бэкапы не столь файлов, сколь отдельных папок с разными политиками резервного копирования. Типовая ситуация, когда на каком-нибудь файлсервере есть несколько шаренных папок, одни из которых надо бэкапить ежедневно, другие можно вообще не бэкапить или делать это крайне редко (какие-нибудь дистрибутивы, базы экспертных систем или еще какое почти статичное содержимое).

Я понимаю о чем вы, у этого подхода есть как плюсы, так и минусы.
Как в этом случае без лишней головной боли убедиться, и делать это на ежедневной основе в автоматическом режиме, что у меня на NN серверах, на которых делается такой бэкап, действительно наличествуют все резервные копии за все дни согласно политикам резервного копирования? Подчеркиваю: хотелось бы убедиться не только в том, что процесс копирования прошел без ошибок, а в том, что копия действительно существует и из нее, опять же, при желании автоматически без разворачивания образа извлекается любой маркерный файл с референсным содержимым для проверки на битость или еще какие неприятности (согласитесь, разница с простым созерцанием колонки надписей «Successful» имеется; да, такие мы параноики).

В качестве бонуса для дополнительного контроля хочется наглядно видеть объемы каждой полной и дифференциальной копии (видеть тенденции роста ну и вообще бывает полезно посмотреть что где внезапно распухло). Не исключаю, что сделать это как-то можно и в вашем случае, подкопавшись к создаваемому WIB-снимку через какой-нибудь API, но этот способ точно не будет проще ситуации «файл на каждый день».

Способов резервного копирования превеликое множество, но лично для меня они имеют свои минусы из-за которых я не использую их. Проще написать несколько простых скриптов, например, с помощью так называемого bat-ника или PowerShell. В этой статье я расскажу, как можно настроить резервное копирование с помощью скриптов, я их комбинирую и создаю связки.

Схема резервного копирования

В большинстве случаев backup сводится к сохранение неких файл. Это могут образы виртуальных машин, файлы пользователей, бекап базы SQL, выгрузка информационной базы 1С:Предприятие и т.д. Правильнее все эти резервные копии файлов хранить в другом месте, это может быть облачное хранилище owncloud, сетевая папка, внешний диск, ленточный накопитель, ftp и т.д. Из-за удобства я использую ftp сервер.

Давайте разберем схему как же это все происходит:

  1. Копируем или перемещаем их в папку для отправки в архив
  2. Проверяем папку на наличие в ней новых backup'ов
  3. Отправляем файлы в архив на FTP сервер
  4. Удаляем старые backup файлы

В первом пункте мы создали файлы, которые нам необходимо скопировать на наш FTP сервер. Теперь нам нужно скопировать их в папку, которую в свою очередь отправим на FTP. Для этого можно воспользоваться простой командой:

copy "ПУТЬ_К_ИСХОДНОЙ_ПАПКЕ\* C:\Backup\

Выполнив эту команды все наши файлы будут скопированы C:\Backup\. Выполнять данную команду имеет смысл, если Вы собираете из разных мест Ваши backup'ы. Теперь нам понадобится скрипт, который будет проверять папку на появление новых файлов и отправлять их на FTP сервер. Создаем пустой файл backup.ps1 и в него записываем следующий скрипт.

Давайте разберем как же работает данный скрипт. Сначало задаются переменные, в которых указывается сервер, имя пользователя, пароль, исходная папка. Затем в строке $Files = Get-ChildItem $localDirectory | Where делается выборка всех файлов, у которых дата изменения больше (-qt) чем текущая дата минус 1 день. Здесь можете подкорректировать под Ваше расписание. Я резервное копирование делаю каждый день. Затем в цикле мы проходим по каждому файлу, удовлетворяющему условия и отправляем его на FTP сервер.

Дабы не занимать место на диске, я удаляю бекапы старше 30 дней. В принципе, после отправки на FTP их можно тут же удалять, я оставляю их только для того что, если они вдруг понадобятся не пришлось бы тратить время на скачивание их с FTP, да и лишняя копия backup'ов не помешает, мало ли что может случится с FTP. Так что если место Вам позволяет, рекомендую хранить их и на исходном сервере.

Для очистки папки я использую скрипт removeOldBackups.ps1

Нередко встречается ситуация, когда резервное копирование Windows Server выполняется на сетевую шару штатными средствами.

Разумеется, размер сетевой шары ограничен, а штатные срдства не имеют возможности удалять резервные копии старше определенного возраста.

Ситуацию можно решить с помощью скриптов, которые предлагаю вашему вниманию. Примеры скриптов взяты из Интернета, и дополнены мной под реальные сценарии для этой статьи. Если вы еще используете .bat-скрипты, обратите внимание насколько PowerShell проще и логичнее.

Для резервных копий Windows Server Backup, удалять нужно не все подряд, а только папки, и только с именем Backup %date%

Обратите внимание, Remove-Item запрашивает подтверждение, чтобы автоматически на него соглашаться, использование флагов -Confirm:$false и/или -Force не подходит (на TechNet описано, что они на самом деле делают), использовать нужно флаг -Recurse

Если вам нужно удалять резервные копии, которые делает SQL сервер, то удалять нужно не папки, а файлы (маску файлов указывать нет смысла, т.к. в этой папке только *.bak файлы):

Если продолжать про SQL, то резервное копирование штатными средства выполняется в локальную папку, где хранится какое-то время, а затем переносится в архив (сетевую шару):

Если вы хотите хранить резервные копии в нескольких местах, копировать их можно с помощью командлета Copy-Item , вот пример, в котором будут копироваться только свежие бэкапы:

Копировать бэкапы Windows Server Backup можно аналогичным образом (обратите внимание, папки будут перезаписаны):

Для резервного копирования виртуальных машин Hyper-V, можно использовать HVBackup :

Копировать эти бэкапы в другое место можно так же, как и бэкапы 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.

Читайте также: