Просто и сердито 2. Архивирование (backup) типовых конфигураций для Linux

20.01.25

База данных - Архивирование (backup)

Предлагаю Вашему вниманию 3 скрипта на bash (sh) для архивирования (backup) типовых конфигураций на Linux средствами 1С и Postgres. Перед запуском корректно заполните раздел "Параметры" в соответствии с Вашими настройками.

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
3. Бэкап всего кластера Postgres
#!/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

 

Протестировано на Ubuntu 24.04, PostgreSQL 16 (1C).

Linux 1C Backup dt

См. также

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    73706    629    45    

88

Архивирование (backup) Системный администратор Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Программа позволяет выполнять автоматическое создание копий файловых и серверных информационных баз 1С Предприятие 8 и размещение копий в облаке Яндекс.Диск, локальном или сетевом ресурсе.

1200 руб.

03.09.2014    15974    22    6    

28

Архивирование (backup) Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Платные (руб)

Расширение поможет настроить резервное копирование баз SQL в стандартный файл выгрузки баз 1С (*.dt).

2400 руб.

27.08.2024    1518    1    6    

2

HighLoad оптимизация Администрирование СУБД Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Бэкап в Postgres состоит из набора граблей, которые нужно обойти для успешного восстановления. Они заложены в самых неожиданных местах от предмета резервного копирования (база или кластер) до структуры каталогов. Один неверный шаг и восстановление будет невозможным. Почему нельзя было сделать проще, как в MS SQL или Oracle? Почему бэкап в Postgres оставляет впечатление чьей-то лабораторной работы? Статья адресована прежде всего специалистам 1С, избалованным комфортом в MS SQL, в суровых буднях импортозамещения на Postgres.

13.08.2024    3483    1CUnlimited    9    

6

Инструменты администратора БД Архивирование (backup) Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Обработка для "обновления" своей тестовой базы из резервной копии рабочей базы без помощи админов.

1 стартмани

21.05.2024    2307    11    baidinden    4    

8

Архивирование (backup) Администрирование СУБД Системный администратор Россия Бесплатно (free)

Постараюсь объяснить, зачем нужно резервное копирование именно журнала транзакций, а не только базы данных, и почему я словно сбросил груз, настроив его - как, покажу, естественно. Кстати, будут скрипты T-SQL (с подробными комментариями) - отличный способ сделать администрирование базы более уютным.

04.12.2023    10510    n_mezentsev    15    

27

Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

В данной инструкции будет описано, как с помощью pgAdmin, bat-файлов и планировщика заданий Windows организовать резервное копирование, восстановление и хранение копий баз данных.

07.10.2022    31326    sapervodichka    37    

147
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. starik-2005 3098 28.01.25 12:07 Сейчас в теме
Ну теперь можно написать следующую статью: три скрипта для восстановления бэкапа.
Оставьте свое сообщение