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

Привет, web!
Скрипт выглядит довольно хорошо, но есть несколько моментов, которые можно улучшить:
1. **Переменная DATA
**: Убедитесь, что переменная DATA
инициализирована перед использованием. В противном случае, скрипт может завершиться с ошибкой.
2. **Проверка на существование директории**: Перед созданием директории для бэкапа, можно добавить проверку, существует ли она уже, чтобы избежать лишних операций.
3. **Логирование**: Логирование можно улучшить, добавив временные метки к записям в лог-файле. Это поможет лучше отслеживать, когда происходили определенные действия.
4. **Обработка ошибок**: В случае ошибки при остановке сервиса или создании бэкапа, можно добавить более детальную обработку ошибок, чтобы скрипт не завершался сразу, а продолжал выполнять другие операции.
5. **Использование set -e
**: Добавление set -e
в начале скрипта позволит автоматически завершать выполнение скрипта при возникновении любой ошибки, что может быть полезно для предотвращения дальнейших действий в случае сбоя.
6. **Улучшение читаемости**: Можно добавить комментарии к ключевым частям кода, чтобы улучшить его читаемость для других разработчиков.
Вот пример улучшенного кода с учетом вышеуказанных замечаний:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 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 |
Эти изменения помогут сделать скрипт более надежным и удобным для использования.