Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save it2-torchbearer/42a5ab3130ed84a8dfda5e2c92c10382 to your computer and use it in GitHub Desktop.

Select an option

Save it2-torchbearer/42a5ab3130ed84a8dfda5e2c92c10382 to your computer and use it in GitHub Desktop.
Скрипты создания резервных копий баз 1С Windows&Ubuntu
@echo off
rem *******************************************************************************************
rem ********************** Ввод первоначальных данных *****************************************
rem *******************************************************************************************
mode con: cp select=1251
rem Переменная пути, где будут сохраняться выгрузки из баз
rem Можно указать через ; несколько путей, в конце обязательно\
set patharcall=D:\ARC\;E:\ARC\
rem Путь до файла со списком баз 1С
set file1c=%APPDATA%\1C\1CEStart\ibases.v8i
rem Имя пользователя к базам 1С для выгрузок
set username=User1C
rem Пароль к пользователю баз 1С
set userpw=pas_User1C
rem имя пользователя сервера баз данных
set userpg=sa
rem пароль пользователя сервера баз данных
set passpg=pas_sa
set PGPASSWORD=pas_sa
rem Переменная отвечает за день недели в который будет происходить создание недельной копии
rem Понедельник - 1 ..... Воскресенье - 7
set weekday=5
rem Переменная отвечает за день месяца в который будет происходить создание месячной копии
set monthday=01
rem Переменная отвечает за то, сколько дневных резервных копий оставлять
set copysaveday=4
rem Переменная отвечает за то, сколько недельных резервных копий оставлять
set copysaveweek=4
rem Переменная отвечает за то, сколько месячных резервных копий оставлять
set copysavemonth=4
rem Переменная задает тип сохранения для файловой базы
rem 0 - архив папки, 1 - выгрузка 1С
set fbasetype=0
rem Использовать архиватор 7-Zip
rem если 1, то использовать, если что то другое - то не использовать
set zip7=1
rem Переменная задает тип сохранения для серверной базы
rem 0 - дамп базы из сервера, 1 - выгрузка 1С
set sbasetype=1
rem Переменная задает имя папки с архивами для серверной базы
rem 0 - берётся имя из стартера, 1 - берётся имя базы из сервера баз данных
set sbasename=0
rem Переменная задает тип сервера базы данных
rem 0 - MsSQL, 1 - posgresql
set sqltype=0
rem Переменная задает имя сервера баз, если она здесь не задана, то считается, что
rem сервер баз данных и сервер 1с это одно и тоже, задается без кавычек, просто имя
set servbd=""
rem Переменная задает количество попыток выгрузок баз 1С, если что то пошло не так
set popytok=5
rem Переменная задает необходимость выброса пользователей с сервера 1С, даже если используется автономный сервер
rem 0 - принудительный выброс не делать, 1 - выкинуть всех пользователей в любом случае.
set deluserserver1c=0
rem Переменная указывает по какому пити искать установленные 1С
rem может принимать значения Program Files или Program Files (x86)
set pathprogram1C=Program Files
rem Переменная указывает на использование конкретной версии 1с, задается без кавычек
rem например 8.3.15.1830, если же версия не задана, то должны стоять кавычки ""
set ispolzovatvers=""
rem Переменная указывает на то, какой веб сервер используется
rem 0 - IIS, 1 - Apache
set webserv=0
rem Переменная содержит имя пула IIS для выгружаемой 1С,
rem что бы не выгружать полностью веб сервер, да работает так более надежно
set pooliis=DefaultAppPool
rem *******************************************************************************************
rem ********************* Ввод первоначальных данных завершен *********************************
rem *******************************************************************************************
rem Определим, является ли операционка Windows 10
VER | FINDSTR /IL "10.0" > NUL
IF %ERRORLEVEL% EQU 0 (SET win10=1) ELSE (SET win10=0)
cls
chcp 866
echo Начинаем создание резервных копий баз 1С
chcp 1251
SetLocal EnableDelayedExpansion
set wwwstopflag=0
for /F "tokens=1 delims=;" %%a in ("%patharcall%") do set patharc=%%a
rem Проверим задана ли конкретная версия 1С и существует ли она, если нет то будем искать существующую
set ver1c=0
if !ispolzovatvers! neq "" (
if exist "C:\%pathprogram1C%\1cv8\!ispolzovatvers!\bin\1cv8.exe" (set ver1c=!ispolzovatvers!)
)
if !ver1c! equ 0 (
FOR /f %%a IN ('dir /b /o:n /ad "C:\%pathprogram1C%\1cv8"') DO (
echo %%a|>nul find "8."&& set ver1c=%%a
)
)
rem Выделяем из версии номер версии 1С
set ver1crel=!ver1c:~4,-5!
set BinPathC="C:\%pathprogram1C%\1cv8\!ver1c!\bin"
set cluster="0"
set racpath="C:\%pathprogram1C%\1cv8\!ver1c!\bin\rac.exe"
set raspath="C:\%pathprogram1C%\1cv8\!ver1c!\bin\ras.exe"
rem Зададим возможность использовать автосервер 1с
set fileibcmd="C:\%pathprogram1C%\1cv8\!ver1c!\bin\ibcmd.exe"
set avtserver1c="0"
if exist !fileibcmd! (
set avtserver1c="1"
) else (
set avtserver1c="0"
)
rem Определимся с типом сервера баз данных для автосервера
set sqltypestr="PostgreSQL"
if !sqltype! LEQ 0 (
set sqltypestr="MSSQLServer"
)
FOR /f %%a IN ('dir /b /o:n /ad "C:\Program Files\PostgreSQL"') DO (
echo %%a|>nul find "."&& set verpg=%%a
)
set BinPathPG="C:\Program Files\PostgreSQL\!verpg!\bin"
set rs=0
rem Получаем день недели в переменной DayOfWeek
set "exec=wmic path win32_LocalTime get DayOfWeek /value"
for /f "tokens=1,2 delims==" %%i in ('%exec% ^| findstr "="') do set "%%i=%%j"
call :datatime
set namestart="0"
set basenamex=""
set basename="qwe"
set typebase="0"
set pahtbase=""
set serverbase=""
set postgresbase=""
set pathtrue="0"
rem Проводим выброс пользователей с 1С, если это задано в шапке
if !deluserserver1c! EQU 1 (
for /L %%B in (0,1,%poUpytok%) do (
rem Освободим базы от подключенных 1С
call :freebases
call :wwwstop
if %rs% equ 0 call :rss
call :resetuser
ping 127.0.0.1 -n 3 > nul
cls
)
chcp 866
echo Пользователи сброшены
chcp 1251
if !wwwstopflag! equ 1 (
rem iisreset
rem запускаем pool 1С на IIS
if %webserv% equ 1 (net start apache) else (%windir%\system32\inetsrv\appcmd start apppool /apppool.name:"%pooliis%")
)
set wwwstopflag=0 )
for %%b in (%patharcall%) do (
set /A number=number+1
if !number! equ 1 set patharc=%%b
)
rem Путь до файла со списком баз 1С в кодировке Windows 1251
set newfile1c1=%patharc%bases1c1.txt
set newfile1c=%patharc%bases1c.txt
(
chcp 65001
cmd/u/c type %file1c% >%newfile1c1%
chcp 1251
)
type %newfile1c1% >%newfile1c%
for /F "tokens=* delims=" %%i in (%newfile1c%) do (
set sString=%%i
if "!sString!" neq "!sString:[=!" (
set namestart="1"
set basename=""
set typebase="0"
set pahtbase=""
set serverbase=""
set postgresbase=""
set pathtrue="0"
)
rem Начинаем сборку имени базы
if !basename! == "" (
set basename=%%i
set basename=!basename:~0,-1!
set basename=!basename:~1!
if "!basename!" neq "!basename:[=!" set basename=!basename:~3!
)
rem Закончилась сборка имени базы
if "!sString!" neq "!sString:ws==!" (
set typebase="3"
set pahtbase=!sString:~12!
set pahtbase=!pahtbase:~0,-2!
set pathtrue="0"
)
if "!sString!" neq "!sString:Srvr==!" (
set typebase="2"
set pahtbase=!sString:~14!
set pahtbase=!pahtbase:~0,-2!
set pathtrue="0"
for /F "tokens=2 delims=;" %%a in ("!pahtbase!") do set postgresbase=%%a
for /F "tokens=1 delims=;" %%a in ("!pahtbase!") do set serverbase=%%a
set serverbase=!serverbase:~0,-1!
set postgresbase=!postgresbase:~5!
set pathtrue="1"
)
if "!sString!" neq "!sString:File==!" (
set typebase="1"
set pahtbase=!sString:~14!
set pahtbase=!pahtbase:~0,-2!
set pathtrue="1"
)
rem Мы определили и имя базы и путь до базы при этом namestart="0" pathtrue="1"
rem Можно создавать архивы
if !pathtrue! equ "1" (
if !typebase! equ "1" if !pathtrue! equ "1" (
call :datatime
rem Освободим базы от подключенных 1С
call :freebases
call :wwwstop
rem создание выгрузки файловой базы
set number=0
for %%b in ("%patharcall:;=","%") do (
set /A number=number+1
set c=%%b
set c=!c:"=!
echo !c!
mkdir "!c!!basename!\День" "!c!!basename!\Неделя" "!c!!basename!\Месяц"
if !number! equ 1 set patharc=!c!
)
cd %BinPathC%
if %fbasetype% equ 1 (
rem Создание выгрузки из 1С
set rashirenie=.dt
set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
set pathfilename=!patharc!!basename!\День
cls
chcp 866
echo Идет создание выгрузки базы !basename!
chcp 1251
1cv8 CONFIG /F"!pahtbase!" /N"%username%" /P"%userpw%" /DumpIB"!filemane!"
)
if %fbasetype% equ 0 (
rem Создание архива папки базы
if %win10% equ 1 if %zip7% neq 1 set rashirenie=.tar.gz
if %win10% neq 1 set rashirenie=.zip
if %zip7% equ 1 set rashirenie=.zip
set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
set pathfilename=!patharc!!basename!\День
cls
chcp 866
echo Идет создание архива базы !basename!
chcp 1251
if %zip7% equ 1 "C:\Program Files\7-Zip\7z.exe" a -tzip -mx3 -ssw -r0 """!filemane!""" """!pahtbase!"""
if %zip7% neq 1 if %win10% neq 1 powershell "Add-Type -Assembly """System.IO.Compression.FileSystem""" ;[System.IO.Compression.ZipFile]::CreateFromDirectory("""!pahtbase!""", """!filemane!""");"
if %zip7% neq 1 if %win10% equ 1 tar -cvvzf "!filemane!" -C "!pahtbase!" *
)
rem теперь копируем созданный архив во все папки с архивами
for %%b in ("%patharcall:;=","%") do (
set c=%%b
set c=!c:"=!
set pathfilename=!c!!basename!\День\
if !patharc! neq !c! copy /Z /Y "!filemane!" "!pathfilename!"
rem Удаляем из папке с бэкапами день все резервные копии кроме copysaveday последних
for /F "skip=%copysaveday% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
rem Теперь создаем недельные копии архивов
set pathfilename=!c!!basename!\Неделя\
rem Теперь непосредственно копируем
if %DayOfWeek% EQU %weekday% (
set filemanen2=!c!!basename!\Неделя\!namb!-Неделя-!basename!!rashirenie!
copy /Z /Y "!filemane!" "!filemanen2!"
)
rem Удаляем из папке с бэкапами неделя все резервные копии кроме copysaveweek последних
for /F "skip=%copysaveweek% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
rem Теперь создаем месячные копии архивов
set pathfilename=!c!!basename!\Месяц\
rem Теперь непосредственно копируем
if %DD% EQU %monthday% (
set filemanen2=!c!!basename!\Месяц\!namb!-Месяц-!basename!!rashirenie!
copy /Z /Y "!filemane!" "!filemanen2!"
)
rem Удаляем из папке с бэкапами месяц все резервные копии кроме copysavemonth последних
for /F "skip=%copysavemonth% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
)
)
if !typebase! EQU "2" if !pathtrue! equ "1" (
call :datatime
rem создание выгрузки серверной базы
set number=0
if %sbasename% equ 1 (set basename=!postgresbase!)
for %%b in ("%patharcall:;=","%") do (
set /A number=number+1
set c=%%b
set c=!c:"=!
echo !c!
mkdir "!c!!basename!\День" "!c!!basename!\Неделя" "!c!!basename!\Месяц"
if !number! equ 1 set patharc=!c!
)
if %sbasetype% equ 1 (
rem Создание выгрузки из 1С
cd %BinPathC%
set rashirenie=.dt
set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
set pathfilename=!patharc!!basename!\День
for /L %%B in (0,1,%popytok%) do (
for %%I in (^"!filemane!^") do set dumpsize=%%~zI
if !dumpsize! LEQ 0 (
chcp 866
echo Идет создание выгрузки базы !basename!
chcp 1251
rem Разберемся с сервером баз данных, если он задан то он такой, если нет, то он как сервер 1с
if !servbd! EQU "" (
for /F "tokens=1 delims=:" %%a in ("!serverbase!") do set srvbd=%%a
) else (set srvbd=!servbd!)
if !avtserver1c! EQU "1" (
if !ver1crel! GTR 17 (
!fileibcmd! infobase dump --db-server=!srvbd! --dbms=!sqltypestr! --db-name=!postgresbase! --db-user=!userpg! --db-pwd=!passpg! --user=!username! --password=!userpw! "!filemane!"
) else (
!fileibcmd! infobase dump --db-server=!srvbd! --dbms=!sqltypestr! --db-name=!postgresbase! --db-user=!userpg! --db-pwd=!passpg! "!filemane!"
)
)
)
)
rem Если создание выгрузок через автономный сервер провалилось или невозможно сделать,
rem то делаем по старинке, через конфигуратор
for /L %%B in (0,1,%popytok%) do (
for %%I in (^"!filemane!^") do set dumpsize=%%~zI
if !dumpsize! LEQ 0 (
rem Освободим базы от подключенных 1С
call :freebases
call :wwwstop
if %rs% equ 0 call :rss
call :resetuser
ping 127.0.0.1 -n 3 > nul
cls
chcp 866
echo Идет создание выгрузки базы !basename!
chcp 1251
1cv8 CONFIG /S"!serverbase!\!postgresbase!"; /N"%username%" /P"%userpw%" /DumpIB"!filemane!"
)
)
)
if %sbasetype% equ 0 (
rem Создание backup-a средствами сервера баз данных
cd %BinPathPG%
set rashirenie=.dump
set filemane=!patharc!!basename!\День\!namb!-День-!basename!!rashirenie!
set pathfilename=!patharc!!basename!\День
for /L %%B in (0,1,%popytok%) do (
for %%I in (^"!filemane!^") do set dumpsize=%%~zI
if !dumpsize! LEQ 0 (
ping 127.0.0.1 -n 3 > nul
cls
chcp 866
echo Идет создание дампа базы !basename!
chcp 1251
if %sqltype% equ 1 pg_dump -Fc -Z 9 -U %userpg% --file="!filemane!" "!postgresbase!"
if %sqltype% equ 0 sqlcmd -S localhost -U %userpg% -P !passpg! -Q "BACKUP DATABASE [!postgresbase!] TO DISK = N'!filemane!' WITH NOFORMAT, NOINIT, NAME = N'!postgresbase!-full', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10"
)
)
)
rem теперь копируем созданную выгрузку во все папки с архивами
for %%b in ("%patharcall:;=","%") do (
set c=%%b
set c=!c:"=!
set pathfilename=!c!!basename!\День\
if !patharc! neq !c! copy /Z /Y "!filemane!" "!pathfilename!"
rem Удаляем из папки с бэкапами день все резервные копии кроме copysaveday последних
for /F "skip=%copysaveday% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
rem Теперь создаем недельные копии архивов
set pathfilename=!c!!basename!\Неделя\
rem Теперь непосредственно копируем
if %DayOfWeek% EQU %weekday% (
set filemanen2=!c!!basename!\Неделя\!namb!-Неделя-!basename!!rashirenie!
copy /Z /Y "!filemane!" "!filemanen2!"
)
rem Удаляем из папке с бэкапами неделя все резервные копии кроме copysaveweek последних
for /F "skip=%copysaveweek% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
rem Теперь создаем месячные копии архивов
set pathfilename=!c!!basename!\Месяц\
rem Теперь непосредственно копируем
if %DD% EQU %monthday% (
set filemanen2=!c!!basename!\Месяц\!namb!-Месяц-!basename!!rashirenie!
copy /Z /Y "!filemane!" "!filemanen2!"
)
rem Удаляем из папке с бэкапами месяц все резервные копии кроме copysavemonth последних
for /F "skip=%copysavemonth% delims=" %%a in ('dir /O-D /A-D /B "!pathfilename!\*"') do del /F /A "!pathfilename!\%%a"
)
)
set pathtrue="0"
)
)
if %wwwstopflag% equ 1 (
rem iisreset
rem запускаем pool 1С на IIS
if %webserv% equ 1 (net start apache) else (%windir%\system32\inetsrv\appcmd start apppool /apppool.name:"%pooliis%")
)
rem cls
chcp 866
echo Создание резервных копий баз завершено
exit
:resetuser
for /F "tokens=* delims=" %%i in ('!racpath! cluster list') do (
echo %%i|>nul find "cluster"&& set b=%%i
)
for %%a in (!b!) do set cluster=%%a
echo !cluster!
rem Теперь непосредственно завершаем рабочие сессии на сервере 1С
echo Вот список сессий на сервере
set b=0
set session=0
for /F "tokens=* delims=" %%i in ('!racpath! session --cluster=!cluster! list') do (
echo %%i|>nul find "session "&& for %%a in (%%i) do set b=%%a
if !b! NEQ !session! (
set session=!b!
!racpath! session --cluster=!cluster! terminate --session=!session!
)
)
exit /b
:rss
set rs=1
set CtrlPort=1540
set AgentName=localhost
set RASPort=1545
set SrvcName="1C:Enterprise 8.3 Remote Server"
set BinPath="\"C:\Program Files\1cv8\!ver1c!\bin\ras.exe\" cluster --service --port=%RASPort% %AgentName%:%CtrlPort%"
set Desctiption="1C:Enterprise 8.3 Remote Server"
sc stop %SrvcName%
sc delete %SrvcName%
sc create %SrvcName% binPath= %BinPath% start= auto displayname= %Desctiption%
sc start %SrvcName%
exit /b
:datatime
rem создаем для имени файла часть из даты
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
rem в переменной namb хранится часть имени файла из даты
set namb=%fullstamp%
exit /b
:freebases
rem Закрываем открытые 1С
taskkill.exe /F /IM "1cv8.exe"
taskkill.exe /F /IM "1cv8c.exe"
rem Закрываем веб сеансы
rem taskkill.exe /F /IM "w3wp.exe"
rem Закрываем открытые по сети файлы
net session /delete /y
exit /b
:wwwstop
rem Отключим pool 1С на IIS
if %wwwstopflag% equ 0 (
if %webserv% equ 1 (net stop apache) else (%windir%\system32\inetsrv\appcmd stop apppool /apppool.name:"%pooliis%")
set wwwstopflag=1
)
exit /b
#!/bin/bash
#DISPLAY=:99.0 LANG=ru_RU.UTF-8 XAUTHORITY=/home/ceasar/.Xauthority /home/ceasar/ARC1C.sh
#DISPLAY=:99.0 LANG=ru_RU.UTF-8 /home/ceasar/ARC1C.sh
#Автономный сервер для выгрузки баз 1с
#ibcmd infobase dump --db-server=localhost --dbms=MSSQLServer --db-name=sb_demo --db-user=test_db_user --db-pwd=test_pwd_123 --user=user1c --password=pass_1c "%tmp%\sb_demo.dt"
#*******************************************************************************************
#********************** Ввод первоначальных данных *****************************************
#*******************************************************************************************
# Переменная пути, где будут сохраняться выгрузки из баз
# Можно указать через ; несколько путей, в конце обязательно\
patharcall="/media/ARC/ARC/;/media/sf_ARC/"
# Путь до файла со списком баз 1С
file1c=~/.1C/1cestart/ibases.v8i
#Имя пользователя к базам 1С для выгрузок
username="User1C"
#Пароль к пользователю баз 1С
userpw="pas_User1C"
#Пароль sudo
sudopw="pas_sudo"
# Здесь переменные для подключения к серверу баз данных
# имя пользователя сервера баз данных
userpg=postgres
# пароль пользователя сервера баз данных
passpg=pas_postgres
# Переменная отвечает за день недели в который будет происходить создание недельной копии
# Понедельник - 1 ..... Воскресенье - 7
weekday="5"
# Переменная отвечает за день месяца в который будет происходить создание месячной копии
monthday="01"
# Переменная отвечает за то, сколько дневных резервных копий оставлять
copysaveday=4
# Переменная отвечает за то, сколько недельных резервных копий оставлять
copysaveweek=4
# Переменная отвечает за то, сколько месячных резервных копий оставлять
copysavemonth=4
# Переменная задает тип сохранения для файловой базы
# 0 - архив папки, 1 - выгрузка 1С
fbasetype="1"
# Переменная задает тип сохранения для серверной базы
# 0 - дамп базы из сервера, 1 - выгрузка 1С
sbasetype="1"
# Переменная задает тип сервера базы данных
# 0 - MsSQL, 1 - posgresql
sqltype="1"
# Переменная задает имя сервера баз, если она здесь не задана, то считается, что
# сервер баз данных и сервер 1с это одно и тоже, задается без кавычек, просто имя
servbd=""
# Переменная указывает на использование конкретной версии 1с, задается в кавычках
# например "8.3.15.1830", если же версия не задана, то должны стоять кавычки ""
ispolzovatvers=""
# Переменная задает будет ли проводиться очистка базы данных от логов
# 0 - очистка не проводится, 1 - очистка проводится
clearbd="0"
# Переменная задает будет ли проводиться реиндексация базы
# 0 - реиндексация не проводится, 1 - реиндексация проводится
reindex="0"
#Переменная задает возможность полного доступа к созданным файлам для других пользователей
# 0 - не полный доступ, 1 - полный доступ
fullaccess="1"
#Сколько сделать попыток выгрузки из базы при создании выгрузки
popytki=5
#*******************************************************************************************
#********************* Ввод первоначальных данных завершен *********************************
#*******************************************************************************************
# Проверим задана ли конкретная версия 1С и существует ли она, если нет то будем искать существующую
vers=""
if [ "$ispolzovatvers" != '' ];
then
# Проверим наличие 1с такой версии
if [ $(du -k "/opt/1cv8/x86_64/$ispolzovatvers/1cv8" | cut -f 1) -ge 0 ];
then
vers=$ispolzovatvers
fi
fi
#Определяем максимально установленную версию 1С
if [ "$vers" = '' ];
then
for name in $(find /opt/1cv8/x86_64 -maxdepth 1 | sort );
do
vers="1"
vers=${name:17}
done
fi
if [ "$vers" != '' ];
then
versrel=${vers:4}
versrel=${versrel::-5}
else
versrel="15"
fi
#Определяем путь до 1С
if [ "$vers" = '' ];
then
path1c="/opt/1C/v8.3/x86_64"
else
path1c="/opt/1cv8/x86_64/$vers"
fi
#Определим параметры для автосервера 1С
if [[ $sqltype == "1" ]]
then
sqltypestr="PostgreSQL"
else
sqltypestr="MSSQLServer"
fi
# Проверим можно ли использовать автономный сервер
if [ $(du -k "$path1c/ibcmd" | cut -f 1) -ge 0 ];
then
avtserver1c="1"
else
avtserver1c="0"
fi
# Переменная avtserver1c задает режим использования автономного сервера 1С
# 0 - не использовать, 1 - использовать
copysaveday=$((copysaveday+1))
copysaveweek=$((copysaveweek+1))
copysavemonth=$((copysavemonth+1))
label1(){
#Завершаем работу всех сессий на сервере 1C
sudo $path1c/ras --daemon cluster
for cluster in $(sudo $path1c/rac cluster list | grep 'cluster'); do
if [ "$cluster" != 'cluster' ] && [ "$cluster" != ':' ];
then
echo $cluster
fi
done
#Теперь непосредственно завершаем рабочие сессии на сервере 1С
echo 'Вот список сессий на сервер:'
i="0"
for sessionserver in $(sudo $path1c/rac session --cluster=$cluster list); do
if [ "$sessionserver" == 'session' ];
then
i="0"
else
let "i += 1"
if [ "$i" == "2" ];
then
sudo $path1c/rac session --cluster=$cluster terminate --session=$sessionserver
echo $sessionserver
fi
fi
done
}
apachestop="0"
label2(){
#Отключаем apache, что бы выкинуть пользователей 1С
if [[ $apachestop == "0" ]]
then
echo $sudopw | sudo -S service apache2 stop
sudo systemctl stop apache2
apachestop="1"
fi
}
label3(){
#Убиваем все 1С, запущенные на сервере
echo $sudopw | sudo -S killall -SIGKILL 1cv8
echo $sudopw | sudo -S killall -SIGKILL 1cv8c
echo $sudopw | sudo -S killall -SIGKILL 1cv8s
echo $sudopw | sudo -S service srv1cv83 restart
}
# Устанавливаем дату
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
DAY=$(date +"%d")
DOW=$(date +%u)
namestart="0"
basenamex=""
basename=""
typebase=""
pahtbase=""
serverbase=""
postgresbase=""
pathtrue="0"
#Читаем файл записей баз 1С
while read LINE
do
if [[ $LINE =~ "[" ]]
then
namestart="1"
basename=""
typebase=""
pahtbase=""
serverbase=""
postgresbase=""
pathtrue="0"
fi
#Начинаем сборку имени базы
if [[ $basename == "" ]]
then
if [[ $namestart == "0" ]]
then
echo $LINE
else
basenamex="$basenamex $LINE"
fi
if [[ $LINE =~ "]" ]]
then
namestart="0"
basename=${basenamex:2}
basename=${basename::-2}
if [[ $basename =~ "[" ]]
then
basename=${basename:1}
fi
echo $basename
basenamex=""
fi
fi
#Закончилась сборка имени базы
if [[ $LINE =~ "Connect=ws=" ]]
then
typebase="3"
pahtbase=${LINE:12}
pahtbase=${pahtbase::-3}
pathtrue="0"
fi
if [[ $LINE =~ "Connect=Srvr=" ]]
then
typebase="2"
pahtbase=${LINE:14}
pahtbase=${pahtbase::-3}
serverbase=${pahtbase%'"'*}
serverbase=${serverbase::-6}
serverbase=$serverbase'\'
postgresbase=${pahtbase#*'"'}
postgresbase=${postgresbase:6}
pathtrue="1"
fi
if [[ $LINE =~ "Connect=File=" ]]
then
typebase="1"
pahtbase=${LINE:14}
pahtbase=${pahtbase::-3}
pathtrue="1"
fi
# Мы определили и имя базы и путь до базы при этом namestart="0" pathtrue="1"
#Можно создавать архивы
if [ "$namestart" = '0' ] && [ "$pathtrue" = '1' ];
then
case $typebase in
1)
# Устанавливаем дату
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
IFS=';' read -ra my_array <<< "$patharcall"
# Печать разделенной строки
for i in "${my_array[@]}"
do
mkdir -p "$i$basename/День" "$i$basename/Неделя" "$i$basename/Месяц"
chmod -R 777 "$i$basename/День"
chmod -R 777 "$i$basename/Неделя"
chmod -R 777 "$i$basename/Месяц"
done
patharc=${my_array[0]}
if [ "$fbasetype" = '0' ];
then
label2;
label3;
echo "создаем архивную копию папки с базой"
rashirenie=.tar.gz
filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
pathfilename=$patharc$basename/День
find "$pahtbase/" -printf "%P\n" -type f -o -type l -o -type d | tar -cvzf "$filemane" --no-recursion -C "$pahtbase/" -T -
else
label2;
label3;
echo "создаем выгрузку файловой базы"
rashirenie=.dt
filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
pathfilename=$patharc$basename/День
$path1c/1cv8 CONFIG /F"$pahtbase" /N"$username" /P"$userpw" /DumpIB"$filemane"
fi
# теперь копируем созданную выгрузку во все папки с архивами
if [ "$fullaccess" = '1' ];
then
#Если выбран полный доступ для всех
chmod 777 "$filemane"
fi
for i in "${my_array[@]}"
do
# Разбираемся с дневными копиями
pathfilename=$i$basename/День
filemanen=$i$basename/День/$DATA-День-$basename$rashirenie
if [ "$patharc" != "$i" ];
then
cp "$filemane" "$filemanen"
if [ "$fullaccess" = '1' ];
then
#Если выбран полный доступ для всех
chmod 777 "$filemane"
fi
fi
#Оставляем в папке с бэкапами день только copysaveday резервных копий
#find "$pathfilename" -type f -mtime +4 -exec rm -rf {} \;
find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysaveday | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
# Разбираемся с недельными копиями
pathfilename=$i$basename/Неделя
filemanen=$i$basename/Неделя/$DATA-Неделя-$basename$rashirenie
if [ "$DOW" = "$weekday" ];
then
cp "$filemane" "$filemanen"
chmod 777 "$filemanen"
fi
#Оставляем в папке с бэкапами неделя только copysaveweek резервных копий
#find "$pathfilename" -type f -mtime +28 -exec rm -rf {} \;
find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysaveweek | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
# Разбираемся с месячными копиями
pathfilename=$i$basename/Месяц
filemanen=$i$basename/Месяц/$DATA-Месяц-$basename$rashirenie
if [ "$DAY" = "$monthday" ];
then
cp "$filemane" "$filemanen"
chmod 777 "$filemanen"
fi
#Оставляем в папке с бэкапами месяц только copysavemonth резервных копий
#find "$pathfilename" -type f -mtime +112 -exec rm -rf {} \;
find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysavemonth | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
done
;;
2)
# Устанавливаем дату
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
IFS=';' read -ra my_array <<< "$patharcall"
# Печать разделенной строки
for i in "${my_array[@]}"
do
mkdir -p "$i$basename/День" "$i$basename/Неделя" "$i$basename/Месяц"
chmod -R 777 "$i$basename/День"
chmod -R 777 "$i$basename/Неделя"
chmod -R 777 "$i$basename/Месяц"
done
patharc=${my_array[0]}
if [ "$sbasetype" = '0' ];
then
echo "создаем выгрузку базы из postgressql"
rashirenie=.dump
filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
pathfilename=$patharc$basename/День
var1=$popytki
while [ $var1 -gt 0 ]
do
var1=$[ $var1 - 1 ]
if [ "$sqltype" = '1' ];
then
sudo -H -u $userpg pg_dump -F c -Z 9 -U $userpg --file="$filemane" $postgresbase
#PGPASSWORD=$sudopw pg_dump -F c -Z 9 -U $userpg --file="$filemane" $postgresbase
else
sqlcmd -S localhost -U $userpg -P $passpg -Q "BACKUP DATABASE [$postgresbase] TO DISK = N'$filemane' WITH NOFORMAT, NOINIT, NAME = N'$postgresbase-full', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10"
fi
if [ $(du -k "$filemane" | cut -f 1) -ge 0 ]; then
var1=0
fi
done
#Проводим очистку и реиндексацию базы для PostgreSQL
if [ "$DOW" = "$weekday" ];
then
#Проводим очистку и реиндексацию базы для PostgreSQL
if [ "$clearbd" = '1' ] && [ "$sqltype" = '1' ];
then
#Проводим очистку базы
echo "Проводим очистку базы: "$postgresbase
sudo -H -u $userpg vacuumdb --full --analyze --username $userpg --dbname $postgresbase
fi
if [ "$reindex" = '1' ] && [ "$sqltype" = '1' ];
then
#Проводим реиндексацию
echo "Проводим реиндексацию базы: "$postgresbase
sudo -H -u $userpg reindexdb --username $userpg --dbname $postgresbase
fi
fi
else
echo "создаем выгрузку базы с сервера 1С"
rashirenie=.dt
filemane=$patharc$basename/День/$DATA-День-$basename$rashirenie
pathfilename=$patharc$basename/День
var1=$popytki
# Разберемся с сервером баз данных, если он задан то он такой, если нет, то он как сервер 1с
if [[ $servbd == "" ]];
then
srvbd=${serverbase%':'*}
srvbd=${srvbd%'\'*}
else
srvbd=$servbd
fi
# Пробуем выгрузить через авто сервер
while [ $var1 -gt 0 ]
do
var1=$[ $var1 - 1 ]
if [ $avtserver1c = "1" ];
then
if (($versrel > 17)) ; then $path1c/ibcmd infobase dump --db-server=$srvbd --dbms=$sqltypestr --db-name=$postgresbase --db-user=$userpg --db-pwd=$passpg --user=$username --password=$userpw "$filemane";
else $path1c/ibcmd infobase dump --db-server=$srvbd --dbms=$sqltypestr --db-name=$postgresbase --db-user=$userpg --db-pwd=$passpg "$filemane";
fi
fi
if [ $(du -k "$filemane" | cut -f 1) -ge 0 ];
then
var1=0
fi
done
# Если выгрузка через автономны сервер не удалась, то нужно попробовать выгрузить через конфигуратор
if [ $(du -k "$filemane" | cut -f 1) -ge 0 ];
then
var1=0
else
var1=$popytki
label2;
label3;
label1;
label1;
label1;
fi
while [ $var1 -gt 0 ]
do
var1=$[ $var1 - 1 ]
label1;
label1;
$path1c/1cv8 CONFIG /S"$serverbase$postgresbase" /N"$username" /P"$userpw" /DumpIB"$filemane"
if [ $(du -k "$filemane" | cut -f 1) -ge 0 ];
then
var1=0
fi
done
#Проводим очистку и реиндексацию базы для PostgreSQL
if [ "$DOW" = "$weekday" ];
then
#Проводим очистку и реиндексацию базы для PostgreSQL
if [ "$clearbd" = '1' ] && [ "$sqltype" = '1' ];
then
#Проводим очистку базы
echo "Проводим очистку базы: "$postgresbase
sudo -H -u $userpg vacuumdb --full --analyze --username $userpg --dbname $postgresbase
fi
if [ "$reindex" = '1' ] && [ "$sqltype" = '1' ];
then
#Проводим реиндексацию
echo "Проводим реиндексацию базы: "$postgresbase
sudo -H -u $userpg reindexdb --username $userpg --dbname $postgresbase
fi
fi
fi
# теперь копируем созданную выгрузку во все папки с архивами
if [ "$fullaccess" = '1' ];
then
#Если выбран полный доступ для всех
chmod 777 "$filemane"
fi
for i in "${my_array[@]}"
do
# Разбираемся с дневными копиями
pathfilename=$i$basename/День
filemanen=$i$basename/День/$DATA-День-$basename$rashirenie
if [ "$patharc" != "$i" ];
then
cp "$filemane" "$filemanen"
if [ "$fullaccess" = '1' ];
then
#Если выбран полный доступ для всех
chmod 777 "$filemane"
fi
fi
#Оставляем в папке с бэкапами день только copysaveday резервных копий
#find "$pathfilename" -type f -mtime +4 -exec rm -rf {} \;
find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysaveday | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
# Разбираемся с недельными копиями
pathfilename=$i$basename/Неделя
filemanen=$i$basename/Неделя/$DATA-Неделя-$basename$rashirenie
if [ "$DOW" = "$weekday" ];
then
cp "$filemane" "$filemanen"
chmod 777 "$filemanen"
fi
#Оставляем в папке с бэкапами неделя только copysaveweek резервных копий
#find "$pathfilename" -type f -mtime +28 -exec rm -rf {} \;
find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysaveweek | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
# Разбираемся с месячными копиями
pathfilename=$i$basename/Месяц
filemanen=$i$basename/Месяц/$DATA-Месяц-$basename$rashirenie
if [ "$DAY" = "$monthday" ];
then
cp "$filemane" "$filemanen"
chmod 777 "$filemanen"
fi
#Оставляем в папке с бэкапами месяц только copysavemonth резервных копий
#find "$pathfilename" -type f -mtime +112 -exec rm -rf {} \;
find "$pathfilename" -type f | sort -sr -k1 | tail -n +$copysavemonth | sed 's/^/"/'| sed 's/$/"/' | xargs rm -rf
done
;;
esac
pathtrue="0"
fi
#Резервная копия создана
shift 1
done < $file1c
#Включаем apache, что бы восстановить работу 1С
if [[ $apachestop == "1" ]]
then
echo "$sudopw" | sudo -S service apache2 start
sudo systemctl restart apache2
apachestop="0"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment