1. Бэкап средствами 1С - получение dt файлов:
#!/bin/bash
#=========== П А Р А М Е Т Р Ы ===========
#Параметры запуска: адрес сервера, основной порт кластера, информационная база, логины, пароли
#Логин и пароль на вход в 1С. У всех баз должен быть одинаковый логин и пароль администратора на вход в 1С
LoginDB1C='Backup' #Логин на доступ к базе данных 1C (вход в конфигуратор)
PassDB1C='VeryStrongP@ssw0rd' #Пароль на доступ к базе данных 1C (вход в конфигуратор)
PathToMount="/mnt" #точка монтирования удалённого сервера
PathToSaveDT=$PathToMount"/dt/" #Путь к каталогу выгрузки
PathToNFSServer="<IP_NFS>:/mnt/SATA-pool/NFS_backup/backup_1c" #Путь к каталогу выгрузки на NFS сервере
UserNoExit='notexpel' #Пользователь НеВыгонять. Если в базе открыт сеанс этого пользователя то выгрузка не сделается
PassUC='ПарольUC' #Код разрешения на подключение к 1С (параметр /UC)
SrvName='localhost' #Имя сервера 1С
SrvNameDB='localhost' #Имя сервера базы данных postgres, mssql ...
MainPort='1541' #Главный порт для подключения к серверу 1С
RacPort='1545' #Порт для запуска команд rac
Version1C='8.3.26.1498' #Версия программы 1С
PathProgram1C="/opt/1cv8/x86_64/$Version1C" #Путь к каталогу программы 1С
DaysArchiveStorage='365' #Количество дней хранения бэкапов
DbToBackup="UT10 UT11 ZUP3 BP3 UT11_Test" #Список баз
SleepOnHours=1,5 #Убить все зависшие процессы выгрузки баз(ibcmd) через это количество часов
logfile="backup_dt.log" #Место хранения лога из 1С
#Логин и пароль у суперпользователя базы данных mssql, postgres...
LoginPostgres='postgres' #Логин суперпользователя
PassPostgres='VeryStr@ngP@stgres' #Пароль суперпользователя
#======= КОНЕЦ РАЗДЕЛА ПАРАМЕТРЫ =========
#Аргументы для запуска команды архивирования
#ArgumentBackupDES="DESIGNER /S $SrvName:$MainPort\\$DBName /N $LoginDB1C /P $PassDB1C /UC $PassUC /DumpIB $DTfilename" #Если бэкапы делаем через конфигуратор
ArgumentBackupIBCMD="infobase dump --dbms=PostgreSQL --db-server=$SrvNameDB --db-user=$LoginPostgres --db-pwd=$PassPostgres --db-name=$DBName -u $LoginDB1C -P $PassDB1C $DTfilename" #Если бэкапы делаем через ibcmd
HostRac="$SrvName:$RacPort"
HostMain="$SrvName:$MainPort"
#Получаем кластер 1С
ClustersID=$("$PathProgram1C/rac" cluster list "$HostRac" | grep 'cluster\|port'| awk -F' ' '{print $3}')
for Cluster in $ClustersID; do
#Если количество символов больше шести, то это идентификатор кластера
if [ ${#Cluster} -gt 6 ]; then
ClusterID=$Cluster
else # иначе это порт кластера
if [ "$MainPort" -eq "$Cluster" ]; then
ClusterPort=$Cluster
fi
fi
done
#Монтируем удалённую шару
mount -o soft $PathToNFSServer $PathToMount
#Проходимся циклом по списку баз
i=0
for Base in $DbToBackup; do
DoNotUnload="yes"
NowDateTime=$(date +%Y-%m-%d_%H-%M) #Текущая дата время
DTfilename="$PathToSaveDT$Base/$Base""_$NowDateTime.dt" #Полный путь к файлу .dt
#если нет каталога для выгрузки базы, то создаем его
mkdir -p "$PathToSaveDT$Base"
BaseID=$("$PathProgram1C/rac" infobase --cluster=$ClusterID summary list | grep -E -B1 name.*$Base | grep infobase | awk '{print$3}')
if [ -z "BaseID" ]
then
continue
fi
ArgumentBackupIBCMD="infobase dump --dbms=PostgreSQL --db-server=$SrvNameDB --db-user=$LoginPostgres --db-pwd=$PassPostgres --db-name=$Base -u $LoginDB1C -P $PassDB1C $DTfilename" #Если бэкапы делаем через ibcmd
#Устанавливаем блокировку соединений и регламентных заданий БД
$PathProgram1C/rac infobase update $HostRac --cluster=$ClusterID --infobase=$BaseID --infobase-user=$LoginDB1C --infobase-pwd=$PassDB1C --permission-code=$PassUC --sessions-deny=on --scheduled-jobs-deny=on
echo "==============================================" >> "$PathToSaveDT/$logfile"
echo "== УСТАНОВЛЕНА БЛОКИРОВКА ПОЛЬЗОВАТЕЛЕЙ $Base=" >> "$PathToSaveDT/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDT/$logfile"
echo "" >> "$PathToSaveDT/$logfile"
sleep 5
#Завершаем сеансы пользователей, если требуется
SessionsID=$("$PathProgram1C/rac" session list $HostRac --cluster=$ClusterID --infobase=$BaseID | grep 'session ' | awk '{print$3}')
UserNames=$("$PathProgram1C/rac" session list $HostRac --cluster=$ClusterID --infobase=$BaseID | grep user-name | awk '{print$3}')
SessApps=$("$PathProgram1C/rac" session list $HostRac --cluster=$ClusterID --infobase=$BaseID | grep app-id | awk '{print$3}')
IDSession=""
sesUser=""
sesApp=""
TestUserNoExit=$(echo $UserNames | grep $UserNoExit)
if [ -z "$TestUserNoExit" ]; then
k=$(echo $UserNames | wc -w)
for (( iter=1; iter<=$k;iter++ )) do
IDSession=$(echo $SessionsID | head -n1 | cut -d " " -f$iter)
sesUser=$(echo $UserNames | head -n1 | cut -d " " -f$iter)
sesApp=$(echo $SessApps | head -n1 | cut -d " " -f$iter)
if [ "$IDSession" != "" ] && [ "$sesApp" != "" ] && [ "$sesUser" != "" ]; then
$PathProgram1C/rac session terminate $HostRac --cluster=$ClusterID --session=$IDSession
echo "++ Отключаем сеанс пользователя $Base $sesUser $sesApp" >> "$PathToSaveDT/$logfile"
sleep 10
fi
done
fi
"$PathProgram1C/ibcmd" $ArgumentBackupIBCMD & #Если бэкапы делаем через ibcmd
sleep 5
echo "" >> "$PathToSaveDT/$logfile"
echo "==============================================" >> "$PathToSaveDT/$logfile"
echo "== ВЫГРУЗКА $Base ЗАПУЩЕНА В ФОНОВОМ РЕЖИМЕ ==" >> "$PathToSaveDT/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDT/$logfile"
echo "" >> "$PathToSaveDT/$logfile"
SleepOnSeconds=$(( $SleepOnHours * 3600 ))
cur_time=$(echo $EPOCHSECONDS)
time_stop=$(( $cur_time + $SleepOnSeconds))
while : # [ $i -gt 0 ]
do
ps_ibcmd=$(ps -auxf | grep $PathProgram1C/'ibcm[d]')
if [ -z "$ps_ibcmd" ]; then
echo "==============================================" >> "$PathToSaveDT/$logfile"
echo "======= ВЫГРУЗКА $Base ЗАВЕРШЕНА ======" >> "$PathToSaveDT/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDT/$logfile"
echo "" >> "$PathToSaveDT/$logfile"
find "$PathToSaveDT/$Base" -name "*.dt" -type f -mtime "+$DaysArchiveStorage" -exec rm {} \;
echo "==============================================" >> "$PathToSaveDT/$logfile"
echo "= УДАЛЕНЫ ФАЙЛЫ $Base СТАРШЕ $DaysArchiveStorage дней =" >> "$PathToSaveDT/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDT/$logfile"
echo "" >> "$PathToSaveDT/$logfile"
break
fi
cur_time=$(echo $EPOCHSECONDS)
if [ $cur_time -gt $time_stop ]; then
killall ibcmd
echo "==============================================" >> "$PathToSaveDT/$logfile"
echo "== ВЫГРУЗКА $Base ЗАВИСЛА И ЗАВЕРШЕНА ==" >> "$PathToSaveDT/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDT/$logfile"
echo "" >> "$PathToSaveDT/$logfile"
break
fi
done
#Снимаем блокировку соединений и регламентных заданий БД
$PathProgram1C/rac infobase update $HostRac --cluster=$ClusterID --infobase=$BaseID --infobase-user=$LoginDB1C --infobase-pwd=$PassDB1C --permission-code='' --sessions-deny=off --scheduled-jobs-deny=off
echo "==============================================" >> "$PathToSaveDT/$logfile"
echo "== СНЯТА БЛОКИРОВКА ПОЛЬЗОВАТЕЛЕЙ $Base=" >> "$PathToSaveDT/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDT/$logfile"
echo "" >> "$PathToSaveDT/$logfile"
done
echo "" >> "$PathToSaveDT/$logfile"
echo "===============================================================================================================================================" >> "$PathToSaveDT/$logfile"
#Размонтируем удалённую шару
umount $PathToMount
sleep 5
2. Бэкап по базам средствами Postgres
#!/bin/sh
#=========== П А Р А М Е Т Р Ы ===========
PGPASSWORD=VeryStr@ngP@stgres #Пароль на доступ к базам данных PostgreSQL
export PGPASSWORD
host='localhost' #Имя сервера PostgreSQL
PathToMount="/mnt" #точка монтирования удалённого сервера
PathToSaveDump=$PathToMount"/backup_pg_dump/" #Путь к каталогу выгрузки
PathToNFSServer="<IP_NFS>:/mnt/SATA-pool/NFS_backup/backup_1c" #Путь к каталогу выгрузки на NFS сервере
dbUser=postgres #Логин на доступ к базам данных PostgreSQL
DaysArchiveStorage='+60' #Количество дней хранения бэкапов
FileExtension="sql" #!!!расширения архивируемого файла могут быть: dump,gz,bz2
#======= КОНЕЦ РАЗДЕЛА ПАРАМЕТРЫ =========
logfile="log_unload.log" #файл хранения логов
#Проверяем, установлен ли пакет архиватора
if [ "$FileExtension" = "gz" ]; then
#если используем архиватор gzip
Package=$(echo $(dpkg --get-selections | grep -v deinstall | grep gzip))
if [ "$Package" ]
then
echo $Package
else
echo "!!! Не установлен пакет gzip !!!"
exit 0
fi
elif [ "$FileExtension" = "bz2" ]; then
#если используем архиватор pbzip2
Package=$(echo $(dpkg --get-selections | grep -v deinstall | grep pbzip2))
if [ "$Package" ]; then
echo $Package
else
echo "!!! Не установлен пакет pbzip2 !!!"
exit 0
fi
fi
#Монтируем удалённую шару
mount -o soft $PathToNFSServer $PathToMount
#Получаем список имен баз
Bases=$(/opt/pgpro/1c-16/bin/psql -h $host -U $dbUser -A -q -t -c "select datname from pg_database")
for Base in $Bases; do
echo "Идет выгрузка базы $Base ..."
NowDateTime=$(date +%Y-%m-%d_%H-%M) #Текущая дата время
#полный путь к файлу, если используем без сжатия
if [ "$FileExtension" = "sql" ]; then
DumpFilename="$PathToSaveDump$Base/$Base""_$NowDateTime.sql"
else
DumpFilename="$PathToSaveDump$Base/$Base""_$NowDateTime.sql.$FileExtension"
fi
#если нет каталога для выгрузки базы, то создаем его
mkdir -p "$PathToSaveDump$Base"
echo "==============================================" >> "$PathToSaveDump$Base/$logfile"
echo "============== ВЫГРУЗКА НАЧАЛАСЬ =============" >> "$PathToSaveDump$Base/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDump$Base/$logfile"
echo "" >> "$PathToSaveDump$Base/$logfile"
if [ "$FileExtension" = "sql" ]; then
# /usr/bin/pg_dump -h $host -Fc $Base -U $dbUser > $DumpFilename
/opt/pgpro/1c-16/bin/pg_dump -h $host -Fc $Base -U $dbUser > $DumpFilename
elif [ "$FileExtension" = "gz" ]; then
#если используем архиватор gzip
# /usr/bin/pg_dump -h $host $Base -U $dbUser | gzip > $DumpFilename
/opt/pgpro/1c-16/bin/pg_dump -h $host $Base -U $dbUser | gzip > $DumpFilename
elif [ "$FileExtension" = "bz2" ]; then
#если используем архиватор bpzip2
# /usr/bin/pg_dump -h $host $Base -U $dbUser | pbzip2 -p2 -9 > $DumpFilename
/opt/pgpro/1c-16/bin/pg_dump -h $host $Base -U $dbUser | pbzip2 -p2 -9 > $DumpFilename
fi
echo "" >> "$PathToSaveDump$Base/$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSaveDump$Base/$logfile"
echo "============= ВЫГРУЗКА ЗАКОНЧИЛАСЬ ===========" >> "$PathToSaveDump$Base/$logfile"
echo "==============================================" >> "$PathToSaveDump$Base/$logfile"
echo "" >> "$PathToSaveDump$Base/$logfile"
echo "" >> "$PathToSaveDump$Base/$logfile"
echo "" >> "$PathToSaveDump$Base/$logfile"
#Удаляем старые архивы, оставляем только последние несколько, указанные в параметре $DaysArchiveStorage
if [ -e $DumpFilename ]
then
find "$PathToSaveDump$Base" -name "*.$FileExtension" -mtime "$DaysArchiveStorage" -type f -delete
fi
done
#Размонтируем удалённую шару
umount $PathToMount
unset PGPASSWORD
#!/bin/sh
#=========== П А Р А М Е Т Р Ы ===========
PGPASSWORD=VeryStr@ngP@stgres #Пароль на доступ к базам данных PostgreSQL
export PGPASSWORD
host='localhost' #Имя сервера PostgreSQL
PathToMount="/mnt" #точка монтирования удалённого сервера
PathToSave=$PathToMount"/backup_pg_basebackup/" #Путь к каталогу выгрузки
PathToNFSServer="<IP_NFS>:/mnt/SATA-pool/NFS_backup/backup_1c" #Путь к каталогу выгрузки на NFS сервере
dbUser=postgres #Логин на доступ к базам данных PostgreSQL
DaysArchiveStorage='+60' #Количество дней хранения бэкапов
#======= КОНЕЦ РАЗДЕЛА ПАРАМЕТРЫ =========
#Монтируем удалённую шару
mount -o soft $PathToNFSServer $PathToMount
logfile="log_unload.log" #файл хранения логов
echo "Идет выгрузка ..."
NowDateTime=$(date +%Y-%m-%d_%H-%M) #Текущая дата время
#bzFilename="$PathToSave$NowDateTime.sql.bz2" #Полный путь к файлу выгрузки
#если нет каталога для выгрузки базы, то создаем его
mkdir -p "$PathToSave""pg_$NowDateTime"
echo "==============================================" >> "$PathToSave$logfile"
echo "============== ВЫГРУЗКА НАЧАЛАСЬ =============" >> "$PathToSave$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
#/usr/bin/pg_basebackup -h $host -p 5432 -U $dbUser -D "$PathToSave""pg_$NowDateTime" -Ft -Xs
/opt/pgpro/1c-16/bin/pg_basebackup -h $host -p 5432 -U $dbUser -D "$PathToSave""pg_$NowDateTime" -Ft -Xs
#pg_basebackup -h $host -p 5432 -U $dbUser -D "$PathToSave""pg_$NowDateTime" -Ft -z -Xs -P
echo "" >> "$PathToSave$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSave$logfile"
echo "============= ВЫГРУЗКА ЗАКОНЧИЛАСЬ ===========" >> "$PathToSave$logfile"
echo "==============================================" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
#Удаляем старые архивы, оставляем только последние несколько, указанные в параметре $DaysArchiveStorage
#if [ -e $bzFilename ]
#then
find "$PathToSave" -name "pg_*" -mtime "$DaysArchiveStorage" -type d -exec rm -fr "{}" \;
#fi
#find $PathToSave \( -name "*-1[^5].*" -o -name "*-[023]?.*" \) -ctime $DaysArchiveStorage -delete
echo "==============================================" >> "$PathToSave$logfile"
echo "============= НАЧАЛСЯ AUTOVACUUM =============" >> "$PathToSave$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
#/usr/bin/vacuumdb -h $host -p 5432 --full --analyze --all -U $dbUser
/opt/pgpro/1c-16/bin/vacuumdb -h $host -p 5432 --full --analyze --all -U $dbUser
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSave$logfile"
echo "============ ЗАКОНЧИЛСЯ AUTOVACUUM ===========" >> "$PathToSave$logfile"
echo "==============================================" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
echo "==============================================" >> "$PathToSave$logfile"
echo "============== НАЧАЛСЯ REINDEXDB =============" >> "$PathToSave$logfile"
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSave$logfile"
#/usr/bin/reindexdb -h $host -p 5432 --all -U $dbUser -j 4
/opt/pgpro/1c-16/bin/reindexdb -h $host -p 5432 --all -U $dbUser -j 4
echo "============= $(date +'%Y.%m.%d %H:%M:%S') ============" >> "$PathToSave$logfile"
echo "============= ЗАКОНЧИЛСЯ REINDEXDB ===========" >> "$PathToSave$logfile"
echo "==============================================" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
echo "" >> "$PathToSave$logfile"
#Размонтируем удалённую шару
umount $PathToMount
unset PGPASSWORD