База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как улучшить скрипт для ежедневного резервного копирования баз данных?
- В этой теме 1 ответ, 2 участника, последнее обновление 6 месяцев, 2 недели назад сделано  Odin — Одинэсник. Odin — Одинэсник.
- 
		АвторСообщения
- 
		
			- 
12 апреля 2025 в 19:15 #32314 OdineskiУчастник OdineskiУчастникпосмотри скрипт, как он тебе? все ли там хорошо? может что-то исправить надо # 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
- 
12 апреля 2025 в 19:15 #32315 Odin — ОдинэсникУчастник Odin — ОдинэсникУчастникПривет, web! Скрипт выглядит довольно хорошо, но есть несколько моментов, которые можно улучшить: 1. **Переменная DATA**: Убедитесь, что переменнаяDATAинициализирована перед использованием. В противном случае, скрипт может завершиться с ошибкой.2. **Проверка на существование директории**: Перед созданием директории для бэкапа, можно добавить проверку, существует ли она уже, чтобы избежать лишних операций. 3. **Логирование**: Логирование можно улучшить, добавив временные метки к записям в лог-файле. Это поможет лучше отслеживать, когда происходили определенные действия. 4. **Обработка ошибок**: В случае ошибки при остановке сервиса или создании бэкапа, можно добавить более детальную обработку ошибок, чтобы скрипт не завершался сразу, а продолжал выполнять другие операции. 5. **Использование set -e**: Добавлениеset -eв начале скрипта позволит автоматически завершать выполнение скрипта при возникновении любой ошибки, что может быть полезно для предотвращения дальнейших действий в случае сбоя.6. **Улучшение читаемости**: Можно добавить комментарии к ключевым частям кода, чтобы улучшить его читаемость для других разработчиков. Вот пример улучшенного кода с учетом вышеуказанных замечаний: 1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152bash#!/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" ]; thenecho "$(date) Найден сервис: $SERVICE" >> "$BACKUP_DIR"/backup.log# Останавливаем сервисif ! sudo /bin/systemctl stop "$SERVICE"; thenecho "$(date) Ошибка при остановке сервиса: $SERVICE" >> "$BACKUP_DIR"/backup.logexit 1fielseecho "$(date) Сервис не найден!" >> "$BACKUP_DIR"/backup.logfi# Цикл по базам данныхfor DB_NAME in $DB_BASE; doecho "$(date) Начало backup базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.logif ! "$PG_DIR/pg_dump" -Fc "${DB_NAME}" > "${BACKUP_DIR}/${DB_NAME}_${DATA}.dump"; thenecho "$(date) Ошибка завершения backup для базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.logecho "Postgres ${DB_NAME} failed $DATA for $(hostname)" | /usr/bin/mail -s "Postgres ${DB_NAME} failed" $emailexit 1elseecho "$(date) Успешное завершение backup для базы ${DB_NAME}" | tee -a "$BACKUP_DIR"/backup.logfiecho "--------------------------------------------------------------------" >> "$BACKUP_DIR"/backup.logdone# Запускаем сервис обратно, если он был остановленif [ -n "$SERVICE" ]; thenecho "$(date) Запускаем сервис: $SERVICE" >> "$BACKUP_DIR"/backup.logsudo /bin/systemctl start "$SERVICE"elseecho "$(date) Сервис не найден для запуска!" >> "$BACKUP_DIR"/backup.logfiЭти изменения помогут сделать скрипт более надежным и удобным для использования. 
 
- 
- 
		АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.
