Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Резервное копирование 1С на удаленный сервер linux

Ответить
Настройки темы
CMD/BAT - Резервное копирование 1С на удаленный сервер linux

Новый участник


Сообщения: 43
Благодарности: 2

Профиль | Отправить PM | Цитировать


Необходимо выполнить резервное копирование нескольких файловых бд 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 ############
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:55, 18-01-2010

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Резервное копирование 1С на удаленный сервер linux

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
HDD - Резервное копирование zdughi Накопители (SSD, HDD, USB Flash) 7 15-06-2009 07:36
Резервное копирование linux ZDemon Общий по Linux 15 13-06-2006 12:19
Резервное копирование!! Forest_G Хочу все знать 2 09-06-2006 17:36
Web-сервер и резервное копирование ? m2001 Общий по Linux 13 10-11-2005 17:43
Резервное копирование dimon55 Хочу все знать 1 01-08-2003 23:55




 
Переход