1c

Материал из wiki.nntc.nnov.ru
Версия от 11:42, 25 декабря 2023; Vovan (обсуждение | вклад) (Базовый скрипт)
Перейти к навигации Перейти к поиску

В GNU/Linux

Автоматизация резервного копирования информационных баз

Предполагается, что платформа "1С Предприятие" работает на GNU/Linux системе и скрипт резервного копирования выполняется от пользователя

administrator

, графическое окружение которого автоматически запускается после загрузки компьютера.

Дело в том, что по каким-то причинам, разработчики платформы "1С Предприятие" не заложили в систему запуск резервного копирования в headless-режиме, поэтому платформе необходим дисплей X-сервера.

Также предполагается, что файл с паролем от пользователя платформы "1С Предприятие", которому разрешено выполнять резервное копирование, хранится в файле

/home/administrator/.1c-cluster-infobases-backup.pass

и рекомендуемые права на этот файл

0400


Подготовка каталога для скриптов

mkdir /opt/1c_backup_scripts

Базовый скрипт

При необходимости, в тексте скрипта, отредактируйте строчку

bin1c="/opt/1cv8/x86_64/8.3.23.1912/1cv8"

, указав путь до конкретной версии платформы "1С Предприятие".

Ниже предоставлен текст, который можно выделить, скопировать в текстовый редактор, при необходимости поправить, затем весь этот текст можно бросить в консоль для создания файла посредством heredoc-синтаксиса:

cat << 'EOF' > /opt/1c_backup_scripts/backup_infobase_1c_generic.sh 
#!/bin/bash
export LANG=ru_RU.UTF-8

NON_ROOT_USER="administrator"
DISPLAY=":0"
STORAGE="${1}"
SRV="${2}"
REF="${3}"
LOGIN="${4}"
PASSWORD_FILE="${5}"
KEEP_BACKUPS_FOR_LAST_DAYS="${6}"
BACKUP_TIMEOUT_SEC="${7}"
TIMEOUT_COUNTER=0
#-----------------------------
export DISPLAY="${DISPLAY}"
bin1c="/opt/1cv8/x86_64/8.3.23.1912/1cv8"
PASSWORD=`cat ${PASSWORD_FILE} | head -1`
infobase_suffix="$(date +%Y-%m-%d-%H-%M-%S).dt"
ib_filepath="${STORAGE}/${REF}__${infobase_suffix}"
ib_log="${ib_filepath}.log"

function rotate_backups(){
filenames_cmd="${STORAGE}/${REF}*"
current_unixtime=`date +%s --date="$(date +%Y-%m-%d) 00:00:00"`
test_unixtime=$(($current_unixtime-$KEEP_BACKUPS_FOR_LAST_DAYS*60*60*24))

for f in $(/bin/ls $filenames_cmd); do
datetime_from_file=`echo ${f} | awk -F '__' {'print $2'} | awk -F '.' {'print $1'}`
Y=`echo ${datetime_from_file} | awk -F '-' {'print $1'}`
M=`echo ${datetime_from_file} | awk -F '-' {'print $2'}`
D=`echo ${datetime_from_file} | awk -F '-' {'print $3'}`
h=`echo ${datetime_from_file} | awk -F '-' {'print $4'}`
m=`echo ${datetime_from_file} | awk -F '-' {'print $5'}`
s=`echo ${datetime_from_file} | awk -F '-' {'print $6'}`

unixtime_from_file=`date +%s --date="${Y}-${M}-${D} ${h}:${m}:${s}"`

if [[ $unixtime_from_file -lt $test_unixtime ]]; then
  echo "delete file: ${f}"
  /bin/rm ${f}
else
  echo "keep file: ${f}"
fi
done
}

function wait(){

  if [[ $TIMEOUT_COUNTER -ge $BACKUP_TIMEOUT_SEC ]]; then
    kill -9 ${1}
  fi

  if [ ! -d /proc/${1}/ ]; then
    nice_text="Выгрузка информационной базы успешно завершена"
    res_text=$(grep -o -i "${nice_text}" ${ib_log})

    # start apache2
    sudo systemctl start httpd2

    if [ "${res_text}" = "${nice_text}" ]; then
      rotate_backups
      exit 0
    fi

    exit 1
  fi
  sleep 1
  TIMEOUT_COUNTER=$(($TIMEOUT_COUNTER+1))
  wait ${1}
}

# stop apache2
sudo systemctl stop httpd2
sleep 2

DISPLAY=:0 XAUTHORITY=/home/administrator/.Xauthority ${bin1c} CONFIG /N "${LOGIN}" /P "${PASSWORD}" /S "${SRV}/${REF}" /DumpIB "${ib_filepath}" /OUT "${ib_log}" &
main_process_pid=$!

wait ${main_process_pid}
EOF

Делаем файл исполняемым

chmod +x /opt/1c_backup_scripts/backup_infobase_1c_generic.sh

Скрипт для резервирования конкретной базы данных