Created
May 21, 2025 03:57
-
-
Save it2-torchbearer/42a5ab3130ed84a8dfda5e2c92c10382 to your computer and use it in GitHub Desktop.
Скрипты создания резервных копий баз 1С Windows&Ubuntu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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