Резервное копирование папок, файлов, файловой базы данных 1С

Часто в работе системных администраторов требуется делать регулярно резервное копирование каких-то директорий, файлов. Например файловой базы данных 1С или папок профилей пользователей. Самое простое решение для выполнения подобных задач это выполнение скрипта по расписанию для резервирования данных.

Рассмотрим скрипт powershell для резервного копирования файловых данных частями.

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

Настройки
# ========== Глобальные настройки скрипта ==========
    # Режим укладки архивов  
    #[int32]$psOperationMode = 0 # Укладываем всё в один архив
    [int32]$psOperationMode = 1 # Укладываем каждую директорию в свой  архив

    # Консоль архиватор 7zip
    [string]$ps7zip = "C:\Program Files\7-Zip\7z.exe"

    # Настройки почты
    [string]$psSMTPServer = "smpt.mail.ru" # SMTP сервер
    [int32]$psSMTPPort = 587 # Порт
    [string]$psSMTPUser = "LOGIN" # Логин
    [string]$psSMTPPass = "PASSWORD" # Пароль
    [string]$psMailFrom = "backup@3dlan.ru" # Отправитель
    [string]$psMailTO = "administrator@3dlan.ru" # Получатель

    # Настройки папок
    [string]$psDays = "-90" # Глубина архива в днях
    [string]$psBackupFolder = "D:\ps_backup\backup\" # Складываем архив
    [string]$psSourceFolder = "D:\server\users\" # Исходная директория подлежащая архивированию
    [string]$psBackupLOG = "D:\ps_backup\log\" # ЛОГ
# ====================================================

Функции располагающиеся ниже предназначены для создания или удаления необходимых директорий резервного копирования. Настройки которых находятся в шапке скрипта.

Создание новых и удаление старых директорий
[string]$psDateFolder = Get-Date -DisplayHint Date -Format d.MM.yyyy # Получаем текущую дату в формате 01.12.1999

$psFolderList = Get-ChildItem -Path $psSourceFolder # Список суб папок и фалов из папки источника

function createFolder { # Создаём новый каталог
    param(
        [Parameter (Mandatory=$true, Position=1)] [string]$backupFolder,
        [Parameter (Mandatory=$true, Position=2)] [string]$newFolder
    )

    if(!(Test-Path $backupFolder$newFolder)) {
            New-Item -Path $backupFolder -Name $newFolder -ItemType directory
    }
}

function removeFolder { # Удаляем старый архив
    param(
        [Parameter (Mandatory=$true, Position=1)] [string]$backupFolder,
        [Parameter (Mandatory=$true, Position=2)] [string]$backupDays
    )
    $removeDateFolder = (Get-date).AddDays($backupDays)

    # Удаляем старые файлы превышающие $psDays дней
    Get-ChildItem -Path $backupFolder | `
        Where-Object { $_.LastWriteTime -lt $removeDateFolder } | `
        Remove-Item -Recurse
}

Это основной алгоритм создания архивной копии директорий и файлов. В зависимости от режима работы скрипта (psOperationMode = 0 или 1) скрипт упаковывает данные в 7z архив с максимальным сжатием (-t7z -ssw -mx9). Пишет лог в директорию которая указана в конфигурации скрипта. В итоге получаем каталог с архивами, каталог с лог из 7z и глобальный log файл.

Резервное копирование
Function Format-FileSize() {
    Param ([int64]$size)
        If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)}
        ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)}
        ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)}
        ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)}
        ElseIf ($size -gt 0) {[string]::Format("{0:0.00} B", $size)}
        Else {""}
}

[string]$tmpGlobalLOG = ""
[string]$psSystemDate = Get-Date

createFolder $psBackupLOG $psDateFolder
$tmpGlobalLOG = "Start: $psSystemDate Files:" + $psFolderList.Name.Count  >> $psBackupLOG\log.txt

if($psOperationMode -eq 0) {
    & $ps7zip a -t7z -ssw -mx9 -r0 $psBackupFolder$psDateFolder.7z $psSourceFolder >> $psBackupLOG$psDateFolder\$psDateFolder.txt
    $tmpFileSize = Format-FileSize (Get-ChildItem "$psBackupFolder$psDateFolder.7z" -Recurse -File | Measure-Object -Property Length -Sum).sum
}

for($i = 0; $i -lt $psFolderList.Name.Count; $i++) {
    if($psFolderList.Name -is [array]) { $tmpFileName = $psFolderList.Name[$i] } else { $tmpFileName = $psFolderList.Name }
    
    if($psOperationMode -eq 1) {
        createFolder $psBackupFolder $psDateFolder
        & $ps7zip a -t7z -ssw -mx9 -r0 $psBackupFolder$psDateFolder\$tmpFileName.7z $psSourceFolder$tmpFileName >> $psBackupLOG$psDateFolder\$psDateFolder.txt
    }
    
    $psSystemDate = Get-Date
    $tmpNum = $i + 1
    $tmpGlobalLOG = "    №$tmpNum $tmpFileName    $psSystemDate"  >> $psBackupLOG\log.txt
    $tmpHTMLList += "<li>" + $tmpFileName + "</li>"
}

$psSystemDate = Get-Date
if($psOperationMode -eq 0) {
    $tmpGlobalLOG = "End: $psSystemDate File: $tmpFile Size: $tmpFileSize"  >> $psBackupLOG\log.txt
} elseif($psOperationMode -eq 1) {
    $tmpFileSize = Format-FileSize (Get-ChildItem "$psBackupFolder$psDateFolder" -Recurse -File | Measure-Object -Property Length -Sum).sum
    $tmpGlobalLOG = "End: $psSystemDate File: $tmpFile Size: $tmpFileSize"  >> $psBackupLOG\log.txt
}

$tmpGlobalLOG = " "  >> $psBackupLOG\log.txt

SendMail $psSMTPServer $psSMTPPort $psSMTPUser $psSMTPPass $psMailFrom $psMailTO $tmpHTMLList
removeFolder $psBackupFolder $psDays
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue

Данная функция отправляет почтовое уведомление администратору (SendMail $psSMTPServer $psSMTPPort $psSMTPUser $psSMTPPass $psMailFrom $psMailTO $tmpHTMLList)

Отправка письма
function SendMail { # Отправка письма
    param(
        [Parameter (Mandatory=$true, Position=1)] [string]$SMTPServer,
        [Parameter (Mandatory=$true, Position=2)] [int32]$SMTPPort,
        [Parameter (Mandatory=$true, Position=3)] [string]$SMTPUser,
        [Parameter (Mandatory=$true, Position=4)] [string]$SMTPPass,
        [Parameter (Mandatory=$true, Position=5)] [string]$MailFrom,
        [Parameter (Mandatory=$true, Position=6)] [string]$MailTO,
        [Parameter (Mandatory=$true, Position=7)] [string]$content
    )

    $MailSubject = "Резервное копирование $psDateFolder" # Тема
    $MailTitle = "<p>Резервное копирование директории $psSourceFolder</p><p>Архив $psBackupFolder</p><p>Лог $psBackupLOG</p><hr>"
    $Maillist = "<ul>$content</ul>"

    $mes = New-Object System.Net.Mail.MailMessage
    $mes.From = $MailFrom
    $mes.To.Add($MailTO)
    $mes.Subject = $MailSubject
    $mes.IsBodyHTML = $true
    $mes.Body = $MailTitle + ' ' + $Maillist

    $SMTP = New-Object Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
    $SMTP.EnableSSL = $true
    $SMTP.Credentials = New-Object System.Net.NetworkCredential($SMTPUser, $SMTPPass);
    $SMTP.Send($mes)
}

Итак предлагаю рассмотреть скрипт powershell для резервного копирования файловых данных целиком

Полный листинг скрипта для резервного копирования
# ========== Глобальные настройки скрипта ==========
    # Режим укладки архивов  
    #[int32]$psOperationMode = 0 # Укладываем всё в один архив
    [int32]$psOperationMode = 1 # Укладываем каждую директорию в свой  архив

    # Консоль архиватор 7zip
    [string]$ps7zip = "C:\Program Files\7-Zip\7z.exe"

    # Настройки почты
    [string]$psSMTPServer = "smpt.mail.ru" # SMTP сервер
    [int32]$psSMTPPort = 587 # Порт
    [string]$psSMTPUser = "LOGIN" # Логин
    [string]$psSMTPPass = "PASSWORD" # Пароль
    [string]$psMailFrom = "backup@3dlan.ru" # Отправитель
    [string]$psMailTO = "administrator@3dlan.ru" # Получатель

    # Настройки папок
    [string]$psDays = "-90" # Глубина архива в днях
    [string]$psBackupFolder = "D:\ps_backup\backup\" # Складываем архив
    [string]$psSourceFolder = "D:\server\users\" # Исходная директория подлежащая архивированию
    [string]$psBackupLOG = "D:\ps_backup\log\" # ЛОГ
# ====================================================

[string]$psDateFolder = Get-Date -DisplayHint Date -Format d.MM.yyyy # Получаем текущую дату в формате 01.12.1999

$psFolderList = Get-ChildItem -Path $psSourceFolder # Список суб папок и фалов из папки источника

function SendMail { # Отправка письма
    param(
        [Parameter (Mandatory=$true, Position=1)] [string]$SMTPServer,
        [Parameter (Mandatory=$true, Position=2)] [int32]$SMTPPort,
        [Parameter (Mandatory=$true, Position=3)] [string]$SMTPUser,
        [Parameter (Mandatory=$true, Position=4)] [string]$SMTPPass,
        [Parameter (Mandatory=$true, Position=5)] [string]$MailFrom,
        [Parameter (Mandatory=$true, Position=6)] [string]$MailTO,
        [Parameter (Mandatory=$true, Position=7)] [string]$content
    )

    $MailSubject = "Резервное копирование $psDateFolder" # Тема
    $MailTitle = "<p>Резервное копирование директории $psSourceFolder</p><p>Архив $psBackupFolder</p><p>Лог $psBackupLOG</p><hr>"
    $Maillist = "<ul>$content</ul>"

    $mes = New-Object System.Net.Mail.MailMessage
    $mes.From = $MailFrom
    $mes.To.Add($MailTO)
    $mes.Subject = $MailSubject
    $mes.IsBodyHTML = $true
    $mes.Body = $MailTitle + ' ' + $Maillist

    $SMTP = New-Object Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
    $SMTP.EnableSSL = $true
    $SMTP.Credentials = New-Object System.Net.NetworkCredential($SMTPUser, $SMTPPass);
    $SMTP.Send($mes)
}

function createFolder { # Создём новый каталог
    param(
        [Parameter (Mandatory=$true, Position=1)] [string]$backupFolder,
        [Parameter (Mandatory=$true, Position=2)] [string]$newFolder
    )

    if(!(Test-Path $backupFolder$newFolder)) {
            New-Item -Path $backupFolder -Name $newFolder -ItemType directory
    }
}

function removeFolder { # Удаляем старый архив
    param(
        [Parameter (Mandatory=$true, Position=1)] [string]$backupFolder,
        [Parameter (Mandatory=$true, Position=2)] [string]$backupDays
    )
    $removeDateFolder = (Get-date).AddDays($backupDays)

    # Удаляем старые файлы превышающие $psDays дней
    Get-ChildItem -Path $backupFolder | `
        Where-Object { $_.LastWriteTime -lt $removeDateFolder } | `
        Remove-Item -Recurse
}

Function Format-FileSize() {
    Param ([int64]$size)
        If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)}
        ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)}
        ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)}
        ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)}
        ElseIf ($size -gt 0) {[string]::Format("{0:0.00} B", $size)}
        Else {""}
}

[string]$tmpGlobalLOG = ""
[string]$psSystemDate = Get-Date

createFolder $psBackupLOG $psDateFolder
$tmpGlobalLOG = "Start: $psSystemDate Files:" + $psFolderList.Name.Count  >> $psBackupLOG\log.txt

if($psOperationMode -eq 0) {
    & $ps7zip a -t7z -ssw -mx9 -r0 $psBackupFolder$psDateFolder.7z $psSourceFolder >> $psBackupLOG$psDateFolder\$psDateFolder.txt
    $tmpFileSize = Format-FileSize (Get-ChildItem "$psBackupFolder$psDateFolder.7z" -Recurse -File | Measure-Object -Property Length -Sum).sum
}

for($i = 0; $i -lt $psFolderList.Name.Count; $i++) {
    if($psFolderList.Name -is [array]) { $tmpFileName = $psFolderList.Name[$i] } else { $tmpFileName = $psFolderList.Name }
    
    if($psOperationMode -eq 1) {
        createFolder $psBackupFolder $psDateFolder
        & $ps7zip a -t7z -ssw -mx9 -r0 $psBackupFolder$psDateFolder\$tmpFileName.7z $psSourceFolder$tmpFileName >> $psBackupLOG$psDateFolder\$psDateFolder.txt
    }
    
    $psSystemDate = Get-Date
    $tmpNum = $i + 1
    $tmpGlobalLOG = "    №$tmpNum $tmpFileName    $psSystemDate"  >> $psBackupLOG\log.txt
    $tmpHTMLList += "<li>" + $tmpFileName + "</li>"
}

$psSystemDate = Get-Date
if($psOperationMode -eq 0) {
    $tmpGlobalLOG = "End: $psSystemDate File: $tmpFile Size: $tmpFileSize"  >> $psBackupLOG\log.txt
} elseif($psOperationMode -eq 1) {
    $tmpFileSize = Format-FileSize (Get-ChildItem "$psBackupFolder$psDateFolder" -Recurse -File | Measure-Object -Property Length -Sum).sum
    $tmpGlobalLOG = "End: $psSystemDate File: $tmpFile Size: $tmpFileSize"  >> $psBackupLOG\log.txt
}

$tmpGlobalLOG = " "  >> $psBackupLOG\log.txt

SendMail $psSMTPServer $psSMTPPort $psSMTPUser $psSMTPPass $psMailFrom $psMailTO $tmpHTMLList
removeFolder $psBackupFolder $psDays
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue

Теперь осталось создать задание в планировщике задач


Рейтинг: 0/5 - 0 голосов

Комментарии ()