Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Резервное копирование 1С на удаленный сервер linux (http://forum.oszone.net/showthread.php?t=163894)

storm2005 18-01-2010 17:55 1323609

Резервное копирование 1С на удаленный сервер linux
 
Необходимо выполнить резервное копирование нескольких файловых бд 1С из каталога содержащего множество различных бд 1С на удаленный linux сервер доступ к которому реализован посредствлм ssh.

Написал соответствующий скрипт. Хотелось бы услышать конструктивную критику. Можно ли данный скрипт улучшить?
Также есть вопрос как сравнить md5 сумму созданного архива локально и того который залился на удаленный хост. Целесообразно ли это вообще?
Код:

@Echo OFF

SetLocal EnableExtensions EnableDelayedExpansion
cls

goto :q1

###########################################
#                                                        #
#        Скрипт резервного копирования 1С                #
#                                                        #
###########################################

Выполняет следующие действия:

1. Проверка существования каталогов и бд 1С заданных в параметрах.
2. Копирование бд 1С на другой раздел. Запись в лог результата.
3. Архивация каталогов 1С и во временный каталог. Запись в лог результата.
4. Тестирование архива. Запись в лог результата.
5. Копирование созданного архива на удаленный хост посредством протокола SСP. Запись в лог результата.
6. Копирование ежедневного архива локально в каталог для хранения. Запись в лог результата.
7. Удаление копии выполненной на 1 шаге. Запись в лог результата.
8. Оставляем в каталоге для хранения 7 новейших файлов, т. е. удаляем старые резервные копии. Запись в лог результата.
? 9. Проверка md5sum архива на локальном и удаленном хосте.

--------------------------------------------------------------------------------
=== Для запуска скрипта выполнить компанду ===

bak.cmd параметр1. параметр2. ... параметрN

гле
параметр1  -  каталог, где находятся рабочие бд 1С
параметр2  -  каталог в который копируются бд 1С
параметр3  -  каталог, куда производится архивация
параметр4  -  каталог, в котором хранятся упакованные резервные копии
параметр5  -  путь к архиватору 7-zip
параметр6  -  лог
параметр7  -  путь к PSCP
параметр8  -  путь к приватному ключу
параметр9  -  параметры удаленного хоста на который производится копирование архива (юзер, сервер, куда копировать)
параметр10 -  имя БД 1С для бекапа
параметр11 -  имя БД 1С для бекапа
      ...
параметрN  -  имя БД 1С для бекапа


Например:

bak.cmd e:\database d:\ f:\backup\temp\database f:\Backup\database "%programfiles%\7-Zip\7z" f:\Backup\database\arch.log 7 "C:\temp\bak_script\putty\pscp.exe" "C:\temp\bak_script\putty\private_key.ppk" bak@192.168.37.2:/var/ftp/pub/backup/test 1SBUKR 1SKASSA LTL Optimus

:q1



rem -=====[ Решение проблем с датой ]=======-

:: Code by Herbert Kleebauer
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>d_t.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>d_t.com
echo LisqMz`wGH@wKuur`G@w?ogBgGG}G?j_egoNOG?w?`gBLksqgG`w?WgBgG>>d_t.com
echo G}G?R_MgoNMy?wSx@W?s?W?@zAB`LrFuBLyt~vuco{@LuKooD?BFHqrIcP>>d_t.com
echo _sdDxb1T??=?rILO_sdDqx1T??=?rILO_sdDnl1T??=?rILO_sdD`c1T??>>d_t.com
echo =?rILO_sdDgg1T??=?rILO_sdDll1T??=?rILO_sdDrr1T??=??IL?0xxx>>d_t.com

FOR /F "delims=" %%i IN ('d_t.com') DO %%i
del d_t.com

goto :q2
echo century: %_cy%
echo    year: %_yr%
echo  month: %_mo%
echo    day: %_da%
echo    hour: %_hh%
echo  minute: %_mm%
echo  second: %_ss%
echo    all: %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%
echo.
echo                %DATE% %TIME%
===========================================================
:q2

rem Проверка существования первого параметра

set Errors=0
if [%1]==[] (
        set Errors=1
        echo.
        echo.
        echo        #################################
        echo        #                                #
        echo        #        NE UKAZANI PARAMETRI        #
        echo        #                                #
        echo        #################################
        echo.
        echo.
)
if %Errors% EQU 1 goto :EOF

rem Проверка существования 10 параметра

set Errors=0
if [%10]==[] (
        set Errors=1
        echo.
        echo.
        echo        #########################################
        echo        #                                        #
        echo        #        NE UKAZAN ODIN IZ PARAMETROV        #
        echo        #                                        #
        echo        #########################################
        echo.
        echo.
)
if %Errors% EQU 1 goto :EOF


goto :q3
-========[  Объявление переменных  ]===========-

db_dir - каталог, где находятся рабочие бд 1С

temp_dir - каталог для копирования 1С

arch_temp_dir - каталог, куда производится архивация

arch_dir - каталог, в котором хранятся упакованные резервные копии

path_7z  - путь к архиватору 7-zip

log - имя файла, в который записываются сообщения об ошибках

path_pscp - путь к pscp.exe

path_key - путь к приватному ключу

backup_server - пользователь, сервер и место на сервере куда производится копирование

%10, %11,...%N - каталоги, в которых находятся БД 1С

n_files - количество файлов которое оставляем в локальном хранилище архивов

:q3


set db_dir=%1
set temp_dir=%2
set arch_temp_dir=%3
set arch_dir=%4
set path_7z=%5
set log=%6
set path_pscp=%7
set path_key=%8
set backup_server=%9
set n_files=7


echo. >> %log%
echo. >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        ###############  Start script  ############### >> %log%

rem При желании логирования указанных параметров убрать метку с этого блока
rem goto :q4

echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p1 = %1 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p2 = %2 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p3 = %3 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p4 = %4 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p5 = %5 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p6 = %6 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p7 = %7 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p8 = %8 >> %log%
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        p9 = %9 >> %log%

Set K=0
For %%I In (%*) Do (
        If !K!==9 (
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Имя БД 1С для копирования = %%I >> %log%
        ) Else (
                Set /A K += 1
        )
)


rem :q4


rem Проверка указанной через параметры имени хотя бы одной бд 1С

set Errors=0
if [%11]==[] (
        set Errors=1
        echo.
        echo.
        echo        #########################################
        echo        #                                        #
        echo        #        NE UKAZANA NI ODNA BAZA 1C        #
        echo        #                                        #
        echo        #########################################
        echo.
        echo.
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        ОШИБКА - Не указана ни одна база 1С >> %log%
)
if %Errors% EQU 1 goto end


rem -=================================================-


rem -===[  Проверка доступности каталогов, указанных при объявлении переменных  ]===-

set Errors=0

if not exist %db_dir% (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог db_dir=%db_dir% не существует или недоступен >> %log%
)

if not exist %temp_dir% (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог temp_dir=%temp_dir% не существует или недоступен >> %log%
)

if not exist %arch_temp_dir% (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог arch_temp_dir=%arch_temp_dir% не существует или недоступен >> %log%
)

if not exist %arch_dir% (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог arch_dir=%arch_dir% не существует или недоступен >> %log%
)

if not exist %path_7z% (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог path_7z=%path_7z% не существует или недоступен >> %log%
)

if not exist %path_pscp% (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог path_pscp=%path_pscp% не существует или недоступен >> %log%
)

if not exist %path_key% (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог path_key=%path_key% не существует или недоступен >> %log%
)

if %Errors% EQU 1 goto end

rem -===[  Проверка доступности каталогов 1С, указанных через параметры  ]===-

set Errors=0
Set K=0
For %%I In (%*) Do (
  If !K!==9 (
        if not exist %db_dir%\%%I (
                set Errors=1
                echo.
                echo.
                echo        #########################################################################
                echo        #                                                                        #
                echo        # Dir %db_dir%\%%I is unavailable or does not exist        #
                echo        #                                                                        #
                echo        #########################################################################
                echo.
                echo.
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог %db_dir%\%%I НЕ существует или недоступен>> %log%
        )
) Else (
    Set /A K += 1
  )
)
if %Errors% EQU 1 goto end



rem удаление старого архива из каталога TEMP

if exist %arch_temp_dir%\*.7z (
DEL /Q %arch_temp_dir%\*.7z & echo file 7z DELETE exist %arch_temp_dir%
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Файл *.7z удален из каталога  %arch_temp_dir% >> %log%
) else (
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Файл *.7z не существует в каталоге %arch_temp_dir% >> %log%
)

rem Чистка временного каталога куда будут копироваться бд 1С (в случае, если там по каким либо причинам что то осталось)
Set K=0
For %%I In (%*) Do (
  If !K!==9 (
        if exist %temp_dir%\%%I (
                rmdir /s /q %temp_dir%\%%I & echo Dir %%I DELETE exist %temp_dir%
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Удаление каталога %arch_temp_dir%\%%I >> %log%
        )

  ) Else (
    Set /A K += 1
  )
)



rem Копирование каталогов содержащих базы 1С в место определенное соответствующим параметром
Set K=0
For %%I In (%*) Do (
  If !K!==9 (
        xcopy %db_dir%\%%I %temp_dir%\%%I /e /i /q /h
        If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог %db_dir%\%%I успешно скопирован в  %temp_dir%\%%I >> %log%
        If Errorlevel 1 (
                set Errors=1
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        При копировании каталога %db_dir%\%%I возникла ОШИбКА >> %log%
        )
  ) Else (
    Set /A K += 1
  )
)

if %Errors% EQU 1 goto end


rem архивация каталогов 1С и во временную папку c нормальным сжатием, паролем, шифрованием заголовков
set Errors=0
Set K=0
For %%I In (%*) Do (
  If !K!==9 (
        %path_7z% a  %arch_temp_dir%\%_cy%%_yr%-%_mo%-%_da%_%_hh%-%_mm%.7z -ppass -mhe -ssw %temp_dir%\%%I > nul
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог %temp_dir%\%%I добавлен в архив %arch_temp_dir%\%_cy%%_yr%-%_mo%-%_da%_%_hh%-%_mm%.7z >> %log%
        If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Архивация каталога %temp_dir%\%%I выполнена успешно >> %log%
        If Errorlevel 1 (
                set Errors=1
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        При архивации каталога %temp_dir%\%%I возникла ОШИбКА >> %log%

        )
  ) Else (
    Set /A K += 1
  )
)

if %Errors% EQU 1 goto end


rem Тестирование созданного архива

set Errors=0
%path_7z% t %arch_temp_dir%\*.7z -r -ppass > nul
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Тестирование созданного архива выполнено успешно >> %log%
If Errorlevel 1 (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        При тестировании созданного архива возникла ОШИбКА >> %log%
)

if %Errors% EQU 1 goto end


rem Копирование архива на удаленный сервер через протокол scp

%path_pscp% -i %path_key% %arch_temp_dir%\*.7z %backup_server%

If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Архив успешно скопирован на удаленный сервер %backup_server% >> %log%
If Errorlevel 1 (
        set Errors=1
        echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        При копировании архива на удаленный сервер %backup_server% возникла ОШИбКА >> %log%
)


rem копирование ежедневного архива локально в каталог arch_dir

set Errors=0
XCOPY %arch_temp_dir%\*.7z %arch_dir% /y
If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Архив %arch_temp_dir%\*.7z успешно скопирован в %arch_dir% >> %log%
If Errorlevel 1 (
                set Errors=1
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        При копировании архива %arch_temp_dir%\*.7z возникла ОШИбКА >> %log%
)
if %Errors% EQU 1 goto end


rem -=====[ Оставить в каталоге arch_dir указанное (n_files )количество новейших файлов ]=========-

echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Оставить в каталоге %arch_temp_dir% %n_files% новейших файлов>> %log%
FOR /F "SKIP=%n_files% TOKENS=*" %%I IN ('DIR /B /O:-D "%arch_dir%"\*.7z') DO (
        ERASE "%arch_dir%"\%%I

        If %ERRORLEVEL% EQU 0 echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Файл %arch_dir%\%%I удален успешно >> %log%
        If Errorlevel 1 (
                set Errors=1
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        При попытке удалить файл %arch_dir%\%%I возникла ОШИбКА >> %log%
        )
)

if %Errors% EQU 1 goto end


rem Чистка временного каталога куда были скопированы бд 1С

Set K=0
For %%I In (%*) Do (
  If !K!==9 (
        if exist %temp_dir%\%%I (
                rmdir /s /q %temp_dir%\%%I & echo Dir %%I DELETE exist %temp_dir%\%%I
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Удаление каталога %temp_dir%\%%I >> %log%
        ) else (
                echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        Каталог %temp_dir%\%%I не существует >> %log%
        )

  ) Else (
    Set /A K += 1
  )
)

echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        ##############  End script normal ############ >> %log%
exit /b


:end
echo %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%        #############  End script  ERROR ########### >> %log%

Создаем для запуска второй скрипт.
Код:

C:\temp\bak_script\bak.cmd "C:\temp\test\db dir" "C:\temp\test\temp_dir" "C:\temp\test\arch_temp_dir" "C:\temp\test\arch_dir" "%programfiles%\7-Zip\7z.exe" "C:\temp\test\arch.log" "C:\temp\bak_script\putty\pscp.exe" "C:\temp\bak_script\putty\private_key.ppk" bak@192.168.37.2:/var/ftp/pub/backup/test LTL Optimus
Также необходимо наличие приватного ключа в недовормате putty, т. к. утилита pscp.exe не поддерживает работу с приватными ключами в стандартном формате openssh.

Пример лога

Цитата:

2010-01-18 15:43:08 ############### Start script ###############
2010-01-18 15:43:08 p1 = "C:\temp\test\db dir"
2010-01-18 15:43:08 p2 = "C:\temp\test\temp_dir"
2010-01-18 15:43:08 p3 = "C:\temp\test\arch_temp_dir"
2010-01-18 15:43:08 p4 = "C:\temp\test\arch_dir"
2010-01-18 15:43:08 p5 = "C:\Program Files\7-Zip\7z.exe"
2010-01-18 15:43:08 p6 = "C:\temp\test\arch.log"
2010-01-18 15:43:08 p7 = "C:\temp\bak_script\putty\pscp.exe"
2010-01-18 15:43:08 p8 = "C:\temp\bak_script\putty\private_key.ppk"
2010-01-18 15:43:08 p9 = bak@192.168.37.2:/var/ftp/pub/backup/test
2010-01-18 15:43:08 Имя БД 1С для копирования = LTL
2010-01-18 15:43:08 Имя БД 1С для копирования = Optimus
2010-01-18 15:43:08 Файл *.7z удален из каталога "C:\temp\test\arch_temp_dir"
2010-01-18 15:43:08 Каталог "C:\temp\test\db dir"\LTL успешно скопирован в "C:\temp\test\temp_dir"\LTL
2010-01-18 15:43:08 Каталог "C:\temp\test\db dir"\Optimus успешно скопирован в "C:\temp\test\temp_dir"\Optimus
2010-01-18 15:43:08 Каталог "C:\temp\test\temp_dir"\LTL добавлен в архив "C:\temp\test\arch_temp_dir"\2010-01-18_15-43.7z
2010-01-18 15:43:08 Архивация каталога "C:\temp\test\temp_dir"\LTL выполнена успешно
2010-01-18 15:43:08 Каталог "C:\temp\test\temp_dir"\Optimus добавлен в архив "C:\temp\test\arch_temp_dir"\2010-01-18_15-43.7z
2010-01-18 15:43:08 Архивация каталога "C:\temp\test\temp_dir"\Optimus выполнена успешно
2010-01-18 15:43:08 Тестирование созданного архива выполнено успешно
2010-01-18 15:43:08 Архив успешно скопирован на удаленный сервер bak@192.168.37.2:/var/ftp/pub/backup/test
2010-01-18 15:43:08 Архив "C:\temp\test\arch_temp_dir"\*.7z успешно скопирован в "C:\temp\test\arch_dir"
2010-01-18 15:43:08 Оставить в каталоге "C:\temp\test\arch_temp_dir" 7 новейших файлов
2010-01-18 15:43:08 Файл "C:\temp\test\arch_dir"\2010-01-15_15-20.7z удален успешно
2010-01-18 15:43:08 Удаление каталога "C:\temp\test\temp_dir"\LTL
2010-01-18 15:43:08 Удаление каталога "C:\temp\test\temp_dir"\Optimus
2010-01-18 15:43:08 ############## End script normal ############


Время: 13:23.

Время: 13:23.
© OSzone.net 2001-