Метод резервного копирования — упаковка в архив.
Способ запуска — при включении компьютера.
Реализация — PowerShell.
Сразу объясню, почему я отказался от имеющегося в 1С механизма резервного копирования. Изначально всё было настроено средствами 1С и резервное копирование должно было осуществляться после выхода пользователя, т.е. вечером, в конце рабочего дня. Когда мне через какое-то время понадобилось восстановить базу одного из магазинов из резервной копии, я обнаружил, что копий-то нет. Причиной тому был человеческий фактор. Никто из работников не готов был ждать в конце рабочего дня завершения процесса резервного копирования (какое "ждать"? через 3 минуты автобус!). Всё это и подтолкнуло меня к решению, которое я реализовал.
Итак, что делает мой скрипт, запускающийся при загрузке компьютера (утром, пока работницы пьют кофе, делятся новостями, покупателей ещё нет).
Первым делом, происходит блокировка ИБ, дабы до окончания процесса копирования никто не смог запустить 1С и пытаться изменять ещё не до конца скопированную базу.
"{1,$date_stamp,00010101000000,""ACCESS DENIED!!!"","""",""""}" | Out-File -FilePath $base_dir1Cv8.CDN -Encoding default -Force
(Ранее переменная $date_stamp получает значение ГГГГММДДччммсс, в переменной $base_dir хранится путь к ИБ)
Затем происходит упаковка файла 1Cv8.1CD простым и бесплатным архиватором 7-zip.
$pack_args=@("a", (""""+$bak_dir+""+$arc_name+"_"+$date_stamp+".7z"""), "-r", "-ssw", ("""-w"+$env:TEMP+""""), (""""+$base_dir+"1Cv8.1CD"""))
$process=Start-Process -FilePath $pack_app -ArgumentList $pack_args -NoNewWindow -Wait -PassThru
$exit_code=$process.ExitCode
($bak_dir — путь к каталогу с архивами, $arc_name — префикс архива, $pack_app — путь к исполняемому файлу архиватора, зависит от разрядности ОС)
Логи процесса архивирования (время начала, время завершения, код завершения) складываются на FTP-сервер.
Import-Module PSFTP
$hash=$ftp_user+".pwd"
$password=(Get-Content "$hash" | ConvertTo-SecureString)
$local_path=$log_dir+""+$log_name+".log"
$credential=New-Object Management.Automation.PSCredential($ftp_user,$password)
Set-FTPConnection -Server $ftp_server -Session "BlakitFtp" -Credential $credential
$session=Get-FTPConnection -Session BlakitFtp
Add-FTPItem -LocalPath $local_path -Overwrite -Path $ftp_dir -Session $session
(Модуль PSFTP взят отсюда, $ftp_user — имя пользователя FTP-сервера, $hash — файл, содержащий хеш пароля пользователя, $log_dir и $log_name — каталог и имя файла журнала, $ftp_server — адрес FTP-сервера, $ftp_dir — каталог для журналов на сервере)
Удаляются копии, старше одной недели (жёсткий диск не резиновый всё-таки).
$now=Get-Date
$days="7"
$arc_stamp=$arc_name+"_*.7z"
$last_write=$now.AddDays(-$days)
$files=Get-Childitem -LiteralPath $bak_dir -Filter $arc_stamp | where{$_.LastWriteTime -le "$last_write"}
foreach ($file in $files)
{
if ($file -ne $NULL)
{
Remove-Item $file.FullName | Out-Null
}
}
Снимается блокировка ИБ.
Remove-Item -Path $base_dir1Cv8.CDN -Force
Я постарался снабдить скрипт инсталлятором (install.ps1), который распакует необходимые файлы, установит недостающие компоненты, создаст файл конфигурации, файл с хешем пароля пользователя и ярлык для автоматического запуска. Единственное, что нужно сделать вручную — изменить политику выполнения скриптов PowerShell (подробнее)
Всё, что в архиве — либо написано мной, либо имеется в свободном доступе в сети интернет.
ИМХО, лучше копировать BITS-ом в облако.
Тот же mail.ru даёт 25 GB облака, можно настроить O-диск (есть такая вполне шустрая прога) и будет доступно как диск О.
(1)
Может, оно и лучше. Вероятно, я позже так и буду поступать, но пока я копирую только логи, поскольку сам архив при своём «весе» около 250 Мб через 512-кбитную «трубочку» от Белтелекома будет выгружаться весь рабочий день, а может и дольше.
(2) потому BITS и лучше — не грузит машину, не грузит канал особо
+(3) см Start-BitsTransfer
(4)
Интересная штука, для РИБ отлично подходит.
(1) Облака не нужны. Копировать нужно к себе и убирать в сейф.
(6) Слишком велико влияние человеческого фактора, в определённом смысле достаточно надёжно, но неприемлемо.