- Код: Выделить всё
#!/bin/bash
# Шлях до каталогу з архівами
DUMP_BASEDIR=/home/backup
# Шлях до конфігурації DebetPlus
PATH_JDEBET=/opt/JDebet
# Шлях до даних організації
PATH_ORGDATA=/opt/orgdata
# Назва бази даних DebetPlus
DPBASE_NAME=dpbase
# Ім'я суперкористувача PostgreSQL.
# Користувач також має існувати в системі і мати право входу.
# У цьому випадку я використав postgres оскільки він є суперкористувачем для всієї БД.
# Рекомендовано, щоб користувач був з встановленим паролем.
PGADMIN=postgres
TIMESTAMP=$(date +%Y-%m-%d_%H_%M)
DATESTAMP=$(date +%Y-%m-%d)
FILENAME_CURRENT=$DUMP_BASEDIR/$DATESTAMP
FILENAME_DPBASE=$FILENAME_CURRENT/"$DPBASE_NAME"_"$TIMESTAMP".sql.tar
FILENAME_ORGDATA=$FILENAME_CURRENT/"orgdata_$TIMESTAMP".tar
if [ ! -d "$FILENAME_CURRENT" ]; then
mkdir "$FILENAME_CURRENT"
fi
DEBET_USERS=$(grep -oEi "<DBTEMP\s+value=(\"|\')\w+\1\s*/>" "${PATH_JDEBET}/administration.xml" | sed -re "s|^<DBTEMP\s+value=\"(.+?)\"\s*/>$|\1|g" | sort | uniq)
exec 4>&1
CLEAN_RESULT=$( {
for DP_USER in $DEBET_USERS; do
echo "Cleaning temporary data for user ${DP_USER}."
USER_VIEWS=$(su -l $PGADMIN -c "psql -U$PGADMIN -tAc\"SELECT schemaname || '.' || viewname FROM pg_views WHERE schemaname ~* '${DP_USER}' ORDER BY viewname\" $DPBASE_NAME")
USER_TABLES=$(su -l $PGADMIN -c "psql -U$PGADMIN -tAc\" SELECT schemaname || '.' || tablename FROM pg_tables WHERE schemaname ~* '${DP_USER}' ORDER BY tablename\" $DPBASE_NAME")
for USER_VIEW in $USER_VIEWS; do
su -l $PGADMIN -c "psql -U$PGADMIN -a -c\"DROP VIEW IF EXISTS ${USER_VIEW} CASCADE\" $DPBASE_NAME"
done
for USER_TABLE in $USER_TABLES; do
su -l $PGADMIN -c "psql -U$PGADMIN -a -c\"DROP TABLE IF EXISTS ${USER_TABLE} CASCADE\" $DPBASE_NAME"
done
echo "Done."
done
} 2>&1 1>&4 )
exec 4>&-
if [ ! -z "$CLEAN_RESULT" ]; then
echo "ERROR!"
echo "Error occured while cleaning temporary tables: $CLEAN_RESULT"
exit 1
fi
echo -n "Dumping database $DPBASE_NAME... "
su -l $PGADMIN -c "pg_dump --format=tar $DPBASE_NAME" > "$FILENAME_DPBASE"
DUMP_RESULT=$(su -l $PGADMIN -c "pg_dump --format=tar $DPBASE_NAME" 2>&1 1>"$FILENAME_DPBASE")
if [ ! -z "$DUMP_RESULT" ]; then
echo "ERROR!"
echo "Error occured on dump. pg_dump returns: $DUMP_RESULT"
exit 2
fi
echo "Done."
echo -n "Archivating... "
tar -cf "$FILENAME_ORGDATA" "$PATH_ORGDATA"
bzip2 -z9 "$FILENAME_DPBASE" "$FILENAME_ORGDATA"
echo "Done."
echo "Dump successfuly completed.
Created dump file: '${FILENAME_DPBASE}.bz2', '${FILENAME_ORGDATA}.bz2'."
echo -n "Analyzing ${DPBASE_NAME}... "
su -l $PGADMIN -c "psql -U$PGADMIN -c\"VACUUM FULL ANALYZE\" $DPBASE_NAME"
echo "Done."
Скрипт очищає тимчасові таблиці користувачів DebetPlus, після цього - створює індексований дамп БД, створює архів даних організації, стискає дамп і архів, після чого виконує VACUUM та аналізує існуючу БД для покращення швидкодії.
Скрипт розрахований на виконання оболонкою bash на сервері без встановленого користувацького середовища DebetPlus.
Скрипт можна викликати вручну, а також повісити на cron для виконання, наприклад, щоденно о 2-й ночі.
Приймаю будь-які запитання, зауваження, рекомендації і пропозиції.