Резервное копирование папок, файлов, файловой базы данных 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
Теперь осталось создать задание в планировщике задач
Комментарии ()