Уважаемые друзья, форма вопрос - ответ снова в строю!

Создание резервной копии базы 1С с помощью Powershell

Создание резервной копии базы 1С с помощью Powershell

Как вы знаете создание резервных копий является не отъемлемой частью работы системного администратора. О важности создания архивных копий я думаю рассказывать не нужно. Используя современные средства мы с вами напишем не большой скрипт на Powershell для архивации баз 1С по расписанию.

Функционал скрипта архивирования баз 1С:

  • Архивирование баз в ZIP
  • Удаление старых архивов
  • Запись логов в файл
  • Отправка отчета архивации на почту администратору

Для создания zip архива можно использовать класс ZipFile из .NET Framework 4.5 или использовать любой консольный архиватор который может создавать zip архивы. Мой выбор пал на консольный архиватор 7zip, в данной статье мы будем использовать его для архивации баз 1С.

Первое что сделаем – это напишем функцию отправки сообщения на email администратору. Как отправить письмо с помощью Powershell я писал в одной из своих статей (Powershell отправка почты с авторизацией через SMTP сервер Яндекса).


# Функция отправки сообщения на почту
function sendMail
{
    param([string]$content)

    $serverSmtp = "smtp.yandex.ru" 
    $port = 587
    $From = "адрес отправителя@yandex.ru" 
    $To = "Кому@mail.ru" 
    $subject = "Архивирование баз 1С"
    $user = "адрес отправителя"
    $pass = "Пароль" 

    $mes = New-Object System.Net.Mail.MailMessage
    $mes.From = $from
    $mes.To.Add($to) 
    $mes.Subject = $subject 
    $mes.IsBodyHTML = $true 
    
    $title = "<h1>Архивирование баз 1С компании ООО Рога и Копыта</h1>" 
    $list = "<ul>"+ $content +"</ul>"

    $mes.Body = $title +' '+ $list
 
    $smtp = New-Object Net.Mail.SmtpClient($serverSmtp, $port) 
    $smtp.EnableSSL = $true 
    $smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);
    $smtp.Send($mes) 
}

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


# Функция удаления старых архивов
function removeFolder
{
    param($backupFolder)

    # Указываем глубину архива 10 дней 
    $days = "-10"
    $removeDateFolder = $date.AddDays($days)

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

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


# Функция создания нового каталога
function createFolder
{
    param(
        $folder, 
        $newFolder
    )

    # Если папка с текущей датой не создана, то создаем ее
    if(!(Test-Path $folder$newFolder))
    {
        New-Item -Path $folder -Name $newFolder -ItemType directory
    }
}

Описываем тело скрипта:

Определяем переменные с каталогами. Указываем путь где находятся базы 1С, а также каталоги куда будем складывать архивы и логи.


# Путь к папке источнику, то что нужно архивировать
$sourceFolder = "C:\base\"

# Папка для хронения резервных копий
$backupFolder = "C:\backup\"

# Папка для хронения логов
$backupLog = "C:\backupLog\" 

Получаем текущую дату для именования новых каталогов.


# Получаем текущую дату в нужном формате для наименования папки
$date = Get-Date
$dateFolder = Get-Date -DisplayHint Date -Format d.M.yyyy 

Указываем путь до консольного архиватора 7zip.


# Путь к консольному архиватору 7zip
$7zip = "C:\Program Files\7-Zip\7z.exe"

Бывает так, что баз в каталоге очень много и указывать каждую в скрипте мягко говоря не правильно. По этому мы прочитаем содержимой папки с базами и в цикле пробежимся по ним.


# Список каталогов для архивации из папки источника
$folderBase = Get-ChildItem -Path $sourceFolder

# Перебираем в цикли каталоги для архивации
for($i = 0; $i -lt $folderBase.Name.Count; $i++)
{
    
    # Если папка не одна
    if($folderBase.Name -is [array])
    {
        # Имя архива 
        $fileName = $folderBase.Name[$i]
    }
    else
    {
        # Имя архива
        $fileName = $folderBase.Name
    }

    # Собираем список каталогов которые архивируем
    $list += "<li>" + $fileName + "</li>"

    # Создаем нужные каталоги
    createFolder $backupFolder $dateFolder
    createFolder $backupLog $dateFolder
        
    # Создаем архив каталога с базой и записываем LOG
    &$7zip a -tzip -r $sourceFolder$fileName.zip $sourceFolder$fileName >> $backupLog$dateFolder\$fileName.txt

    # Перемещаем только что созданный каталог в папку для архивов
    # Если такой архив уже есть, то перезаписываем его
    Move-Item -Path $sourceFolder$fileName.zip -Destination $backupFolder$dateFolder -Force
}

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


# Удаляем старые каталоги превышающие 10 дней
removeFolder $backupFolder

Далее отправляем отчет на электронную почту администратора и удаляем переменные.


# Отправляем письмо с отчетом на почту админу
sendMail $list

# Удаляем переменные
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue

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

Весь скрипт целиком.


<#
Проект:   Архивация баз 1С
Версия:   1.0

Описание: Создание архивных копий баз 1С Предприятия,
а также отправка отчета на почту адинистратора отчета
об ахивации данных.

Автор:    bezramo-tlt.ru
Сайт:     http://bezramok-tlt.ru/
#> 



# Функция отправки сообщения на почту
function sendMail
{
    param([string]$content)

    $serverSmtp = "smtp.yandex.ru" 
    $port = 587
    $From = "адрес отправителя@yandex.ru" 
    $To = "Кому@mail.ru" 
    $subject = "Архивирование баз 1С"
    $user = "адрес отправителя"
    $pass = "Пароль" 

    $mes = New-Object System.Net.Mail.MailMessage
    $mes.From = $from
    $mes.To.Add($to) 
    $mes.Subject = $subject 
    $mes.IsBodyHTML = $true 
    
    $title = "<h1>Архивирование баз 1С компании ООО Рога и Копыта</h1>" 
    $list = "<ul>"+ $content +"</ul>"

    $mes.Body = $title +' '+ $list
 
    $smtp = New-Object Net.Mail.SmtpClient($serverSmtp, $port) 
    $smtp.EnableSSL = $true 
    $smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);
    $smtp.Send($mes) 
}

# Функция удаления старых архивов
function removeFolder
{
    param($backupFolder)

    # Указываем глубину архива 10 дней 
    $days = "-10"
    $removeDateFolder = $date.AddDays($days)

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

# Функция создания нового каталога
function createFolder
{
    param(
        $folder, 
        $newFolder
    )

    # Если папка с текущей датой не создана, то создаем ее
    if(!(Test-Path $folder$newFolder))
    {
        New-Item -Path $folder -Name $newFolder -ItemType directory
    }
}

# Путь к папке источнику, то что нужно архивировать
$sourceFolder = "C:\base\"

# Папка для хронения резервных копий
$backupFolder = "C:\backup\"

# Папка для хронения логов
$backupLog = "C:\backupLog\"  

# Получаем текущую дату в нужном формате для наименования папки
$date = Get-Date
$dateFolder = Get-Date -DisplayHint Date -Format d.M.yyyy

# Путь к консольному архиватору 7zip
$7zip = "C:\Program Files\7-Zip\7z.exe"

# Список каталогов для архивации из папки источника
$folderBase = Get-ChildItem -Path $sourceFolder

# Перебираем в цикли каталоги для архивации
for($i = 0; $i -lt $folderBase.Name.Count; $i++)
{
    
    # Если папка не одна
    if($folderBase.Name -is [array])
    {
        # Имя архива 
        $fileName = $folderBase.Name[$i]
    }
    else
    {
        # Имя архива
        $fileName = $folderBase.Name
    }

    # Собираем список каталогов которые архивируем
    $list += "<li>" + $fileName + "</li>"

    # Создаем нужные каталоги
    createFolder $backupFolder $dateFolder
    createFolder $backupLog $dateFolder
        
    # Создаем архив каталога с базой и записываем LOG
    &$7zip a -tzip -r $sourceFolder$fileName.zip $sourceFolder$fileName >> $backupLog$dateFolder\$fileName.txt

    # Перемещаем только что созданный каталог в папку для архивов
    # Если такой архив уже есть, то перезаписываем его
    Move-Item -Path $sourceFolder$fileName.zip -Destination $backupFolder$dateFolder -Force
}

# Удаляем старые каталоги превышающие 10 дней
removeFolder $backupFolder

# Отправляем письмо с отчетом на почту админу
sendMail $list

# Удаляем переменные
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue
Boris_xXx
10:37:45 29/08/2017г.
А как насчет баз данных на сервере?

Тут все зависит от  ОС какую вы используете UNIX или Windows + СУБД.


Например в MS SQL можно настроить планировщик на бэкапы баз. 


Был у меня сервер 1С под Linux + PostgreSQL там пришлось писать скрипт на BASH

- Администрация     - 17:55:51 29/08/2017г.

  • 1

Получить уведомление на Email

Введите код с картинки