Итак, коллеги, большинство из нас так или иначе сталкивались с таким продуктом автоматизации предприятия как 1С:Предприятие и с различными конфигурациями на его базе. Сегодня, я хочу поделиться простым и в то же время удобным рецептом резервного копирования баз 1С. Мы все помним, что бекап это наше все!
Если у Вас на предприятии используется т.н. «файловый режим» работы с базами, Вы можете использовать резервное копирование самого файла базы или каталога с ней любыми удобными средствами. Главное, чтобы в этот момент базу никто не использовал. Более того, начиная с версии платформы 8.3, а конфигураций (типа БП или ЗУП) — 3.х, появился встроенный механизм резервного копирования. В таком случае, эта статья не очень вам и нужна, за исключением одного НО, о котором я упомяну чуть поздней.
В случае, если у Вас используется т.н. SQL версия базы (т.е. серверный вариант) — зачастую удобней производить резервное копирование средствами самой СУБД. Более того, это позволит делать резервные копии в т.ч. в течении дня.
Используемый мною способ достаточно популярен в контексте 1С — использование т.н. механизма выгрузки. Он не очень хорошо подходит для больших баз (несколько десятков ГБ), но в общей массе такое встречается редко. Лично я тестировал резервное копирование выгрузкой на базах до 8гб — работает. При этом быстро, удобно, проблем не замечено.
Что же такого нового я хочу тут описать? По сути ничего, просто делюсь готовым скриптом, автоматизирующим этот процесс и прекрасно подходящим как для серверных, так и для файловых баз. Если у Вас на производстве встречаются оба типа, а серверные базы используют еще и разные виды СУБД (например MS SQL и PostgreSQL — ну мало ли, исторически сложилось), этот способ будет для Вас очень удобным.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
@echo off rem разрешаем переопределять переменные setlocal rem задаем набор параметров скрипта set log= *путь к папке где будем хранить логи* set taskname= *имя задания* set backup=*временная папка для хранения выгрузки* set base=*путь к базе в файловой версии и имя базы в серверной версии* rem в серверной версии имя базы задается в формате "имя сервера"\"имя базы"" set archive=*путь к временной папке для архива*\%taskname%_%date%.7z set BackupServer=*путь к шаре, куда переместить архив в конце задания* set Backupuser=*пользователь бекапа* set BackupPassword = *пароль пользователя rem логирование echo #==================================================================# >> "%log%\backup-%taskname%.log" echo Запуск задания [%taskname%]... >> "%log%\backup-%taskname%.log" echo Имя базы 1C: %base% >> "%log%\backup-%taskname%.log" echo Дата/время: %date%/%time% >> "%log%\backup-%taskname%.log" echo %time% Создание дампа 1C... >> "%log%\backup-%taskname%.log" rem формат команды для файловой базы "C:\Program Files (x86)\1cv8\common\1cestart.exe" DESIGNER /F "%base%" /DisableStartupMessages /N %Backupuser% /P %BackupPassword% /DumpIB "%backup%\%taskname%_%date%.dt" /OUT "%log%\backup-%taskname%.log" -NoTruncate rem формат команды для серверной sql базы "C:\Program Files (x86)\1cv8\common\1cestart.exe" DESIGNER /S "%base%" /DisableStartupMessages /N %Backupuser% /P %BackupPassword% /DumpIB "%backup%\%taskname%_%date%.dt" /OUT "%log%\backup-%taskname%.log" -NoTruncate echo %time% жду завершения 1С... >> "%log%\backup-%taskname%.log" rem ждем пока не завершится 1с-ка :loop ping -n 1 127.0.0.1 >nul tasklist /FI "IMAGENAME eq 1cv8.exe" /V /NH | findstr /i %username% >nul&& goto loop echo %time% Создание дампа 1C Завершено! >> "%log%\backup-%taskname%.log" rem переходим в каталог архиватора cd "C:\Program Files\7-Zip" rem запускаем сжатие нашего архива с базой echo %time%: Архивируем дамп 1C... >> "%log%\backup-%taskname%.log" 7z.exe a -t7z %archive% -mx3 "%backup%\%taskname%_%date%.dt" >> "%log%\backup-%taskname%.log" rem обработка ошибок - если не прошла архивация дампа rem 7zip возвращает 0 в случае успеха if errorlevel 0 goto continue echo %time%: Ошибка архивирования! >> "%log%\backup-%taskname%.log" exit 1 :continue echo %time%: Архивация дампа 1С завершена! >> "%log%\backup-%taskname%.log" rem переносим архив на файл-сервер на диск с бекапами echo %time%: Переносим архив на сервер резервных копий... >> "%log%\backup-%taskname%.log" move %archive% %BackupServer% rem обработка ошибок - если не смог переместить if not errorlevel 1 goto continue2 echo %time%: moving archive on backup server error! >> "%log%\backup-%taskname%.log" exit 1 :continue2 echo %time%: Перемещение на сервер завершено! >> "%log%\backup-%taskname%.log" echo %time%: путь к архиву:[%BackupServer%] >> "%log%\backup-%taskname%.log" echo %time%: Удаляем дамп 1С >> "%log%\backup-%taskname%.log" erase "%backup%\%taskname%_%date%.dt" echo %time%: Задание [%taskname%] успешно завершено! >> "%log%\backup-%taskname%.log" endlocal exit 0 |
Суть работы в чем — скрипт делает выгрузку базы, после чего упаковывает ее в архив и перемещает на файловую шару. После чего подчищает за собой на исходном сервере. Плюс ведет лог своих действий. Запускаются скрипты при помощи планировщика.
Я сам пользуюсь этим скриптом, лог файл мониторится при помощи zabbix, и в случае чего я получаю информацию о неудачном бекапе. Причин обычно две — либо кто-то не вышел из базы (выгрузка должна идти в монопольном режиме, тут сама 1С это отслеживает за Вас), либо работает фоновое задание (например обновление классификатора банков и тп).