Как улучшить скрипт для ежедневного резервного копирования баз данных?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как улучшить скрипт для ежедневного резервного копирования баз данных?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #32314
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        посмотри скрипт, как он тебе? все ли там хорошо? может что-то исправить надо # Email для уведомлений
        email=»указать вашь адрес электроной почты»
        # Создаём директорию для бэкапа
        mkdir -p /home/backup/day/»$DATA»
        BACKUP_DIR=»/home/backup/day/$DATA»
        PG_DIR=»/opt/pgpro/1c-15/bin/»

        # Список баз данных
        DB_BASE=»$($PG_DIR/psql -qAt -c ‘SELECT * FROM pg_database;’ | cut -d»|» -f2 | grep -v ‘template’ | grep -v ‘postgres’)»

        # Определяем сервис
        #SERVICE=$(systemctl | grep «srv1cv8» | grep «.service» | awk ‘{print $1}’)
        SERVICE=$(systemctl list-units —type=service —all | grep «srv1cv8» | grep «.service» | awk ‘{print $1}’)

        # Удаляем старые бэкапы старше 21 дня
        /usr/bin/find /home/backup/day -mtime +21 -delete

        # Проверяем, найден ли сервис
        if [ -n «$SERVICE» ]; then
        echo «Найден сервис: $SERVICE» >> «$BACKUP_DIR»/backup.log
        # Останавливаем сервис
        sudo /bin/systemctl stop «$SERVICE»
        else
        echo «Сервис не найден!» >> «$BACKUP_DIR»/backup.log
        fi

        # Цикл по базам данных
        for DB_NAME in $DB_BASE; do
        echo «$DATA Начало backup базы ${DB_NAME}» | tee -a «$BACKUP_DIR»/backup.log
        # «$PG_DIR»/pg_dump -Fc $»{DB_NAME}» > «$BACKUP_DIR»/${DB_NAME}_$DATA.dump
        if ! «$PG_DIR/pg_dump» -Fc «${DB_NAME}» > «${BACKUP_DIR}/${DB_NAME}_${DATA}.dump»; then
        echo «$DATA Ошибка завершения backup для базы ${DB_NAME}» | tee -a «$BACKUP_DIR»/backup.log
        echo «Postgres ${DB_NAME} failed $DATA for $(hostname)» | /usr/bin/mail -s «Postgres ${DB_NAME} failed» $email
        exit 1
        else
        echo «$DATA Успешное завершение backup для базы ${DB_NAME}» | tee -a «$BACKUP_DIR»/backup.log
        fi
        echo «———————————————————————» >> «$BACKUP_DIR»/backup.log
        done

        # Запускаем сервис обратно, если он был остановлен
        if [ -n «$SERVICE» ]; then
        echo «Запускаем сервис: $SERVICE» >> «$BACKUP_DIR»/backup.log
        sudo /bin/systemctl start «$SERVICE»
        else
        echo «Сервис не найден для запуска!» >> «$BACKUP_DIR»/backup.log
        fi

      • #32315
        bot_avaOdin — Одинэсник
        Участник

          Привет, web!

          Скрипт выглядит довольно хорошо, но есть несколько моментов, которые можно улучшить:

          1. **Переменная `DATA`**: Убедитесь, что переменная `DATA` инициализирована перед использованием. В противном случае, скрипт может завершиться с ошибкой.

          2. **Проверка на существование директории**: Перед созданием директории для бэкапа, можно добавить проверку, существует ли она уже, чтобы избежать лишних операций.

          3. **Логирование**: Логирование можно улучшить, добавив временные метки к записям в лог-файле. Это поможет лучше отслеживать, когда происходили определенные действия.

          4. **Обработка ошибок**: В случае ошибки при остановке сервиса или создании бэкапа, можно добавить более детальную обработку ошибок, чтобы скрипт не завершался сразу, а продолжал выполнять другие операции.

          5. **Использование `set -e`**: Добавление `set -e` в начале скрипта позволит автоматически завершать выполнение скрипта при возникновении любой ошибки, что может быть полезно для предотвращения дальнейших действий в случае сбоя.

          6. **Улучшение читаемости**: Можно добавить комментарии к ключевым частям кода, чтобы улучшить его читаемость для других разработчиков.

          Вот пример улучшенного кода с учетом вышеуказанных замечаний:

          bash
          #!/bin/bash
          
          # Email для уведомлений
          email="указать вашь адрес электроной почты"
          DATA=$(date +%Y-%m-%d)  # Инициализация переменной DATA
          # Создаём директорию для бэкапа
          BACKUP_DIR="/home/backup/day/$DATA"
          mkdir -p "$BACKUP_DIR"
          PG_DIR="/opt/pgpro/1c-15/bin/"
          
          # Список баз данных
          DB_BASE="$($PG_DIR/psql -qAt -c 'SELECT * FROM pg_database;' | cut -d"|" -f2 | grep -v 'template' | grep -v 'postgres')"
          
          # Определяем сервис
          SERVICE=$(systemctl list-units --type=service --all | grep "srv1cv8" | grep ".service" | awk '{print $1}')
          
          # Удаляем старые бэкапы старше 21 дня
          /usr/bin/find /home/backup/day -mtime +21 -delete
          
          # Проверяем, найден ли сервис
          if [ -n "$SERVICE" ]; then
              echo "$(date) Найден сервис: $SERVICE" >> "$BACKUP_DIR"/backup.log
              # Останавливаем сервис
              if ! sudo /bin/systemctl stop "$SERVICE"; then
                  echo "$(date) Ошибка при остановке сервиса: $SERVICE" >> "$BACKUP_DIR"/backup.log
                  exit 1
              fi
          else
              echo "$(date) Сервис не найден!" >> "$BACKUP_DIR"/backup.log
          fi
          
          # Цикл по базам данных
          for DB_NAME in $DB_BASE; do
              echo "$(date) Начало backup базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.log
              if ! "$PG_DIR/pg_dump" -Fc "${DB_NAME}" > "${BACKUP_DIR}/${DB_NAME}_${DATA}.dump"; then
                  echo "$(date) Ошибка завершения backup для базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.log
                  echo "Postgres ${DB_NAME} failed $DATA for $(hostname)" | /usr/bin/mail -s "Postgres ${DB_NAME} failed" $email
                  exit 1
              else
                  echo "$(date) Успешное завершение backup для базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.log
              fi
              echo "--------------------------------------------------------------------" >> "$BACKUP_DIR"/backup.log
          done
          
          # Запускаем сервис обратно, если он был остановлен
          if [ -n "$SERVICE" ]; then
              echo "$(date) Запускаем сервис: $SERVICE" >> "$BACKUP_DIR"/backup.log
              sudo /bin/systemctl start "$SERVICE"
          else
              echo "$(date) Сервис не найден для запуска!" >> "$BACKUP_DIR"/backup.log
          fi
          

          Эти изменения помогут сделать скрипт более надежным и удобным для использования.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С