Найти тему
ИТ инженегр

Оптимизация СУБД PostgreSQL, обслуживание баз 1с, бэкап, восстановление

В этой статье опишу настройку СУБД PostgreSQL для работы с базами 1С под определенное железо, а также немаловажный фактор обслуживания баз, бэкап и восстановления.

Настройка СУБД делается в обязательном порядке, иначе вы можете столкнуться с проблемами быстродействия как само сервера, так и баз которые у вас расположены по управление. Для начала опишу параметры, которые в принципе необходимы для настройки их не так много:

Заходим в терминал под root, запускаем Command Center через команду mc

Переходим в папку /var/lib/pgpro/1c-15/data и правим через клавишу F4 файл postgresql.conf

-2

max_connections = 100 - определяет максимальное количество одновременных подключений к серверу базы данных.

shared_buffers = NGB задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой память. На СУБД мы выделяем 1/4 от общего объема.

effective_cache_size = NGB – указываю практически полностью все ОЗУ, но оставляю пару GB свободными.

work_mem = 4MB – это параметр я не меняю, т.к. были проблемы с сложными запросами.

maintenance_work_mem = 1GB – автовакуум, тут чем больше таблиц в базе тем больше этот параметр, выставляю обычно его от 1-2GB.

max_wal_size = 1GB – выделяет место на диске. Величина его обычно влияет на обращение к диску, чем больше тем меньше нагрузка, ставлю 1GB.

checkpoint_completion_target = 0.9 – Задаёт целевое время для завершения процедуры контрольной точки, как коэффициент для общего времени между контрольными точками

random_page_cost = 1.1 – значение для дисков SSD . Для обычных дисков = 4

default_statistics_target = 1000 - для лучшей работы оптимизатора запросов устанавливают

Далее немаловажная доработка - это бэкап и обслуживание баз, т.к. во время работы база создает необходимый для работы “мусор”.

Открываем терминал, набираем необходимые команды для создания будущего скрипта

mkdir -p /opt/script - папка где будем хранить скрипт

cd /opt/script - команда перехода в папку

mcedit 1c.bash - создание файла 1c.bash в котором будет скрипт ниже

PATH=/sbin:/bin:/usr/sbin:/usr/bin

BASES=("название базы1" "название базы2" "название базы3")

#Переменная даты и времени

DATA="$(date +%Y-%m-%d_%H-%M)"

#папка для логов

LOGS=/путь к папке где будут храниться логи

#папка для бэкапов

BACKUPDIR=/путь к папке где будут храниться бэкапы

# N количество бэкапов

FILEBACK="N"

CheckDir()

{

if touch "$1"/"$2".test > /dev/null 2>&1 ; then

rm "$1"/"$2".test

return 0

else

echo "Ошибка создания файла "

return 1

fi

}

Backup()

{

CheckDir "$BACKUPDIR" "$DATA"

echo "$(date +%Y-%m-%d_%H-%M-%S)" " резервное копирование" "$1" >> "$LOGS"/"$DATA".log

if sudo -u postgres /usr/lib/postgres/bin/pg_dump -U postgres "$1" > "$BACKUPDIR"/"$DATA"-"$1".sql ; then

echo "$(date +%Y-%m-%d_%H-%M-%S)" " сжатия файла" >> "$LOGS"/"$DATA".log

pigz "$BACKUPDIR"/"$DATA"-"$1".sql

echo "$(date +%Y-%m-%d_%H-%M-%S)" "окончено" "$1" >> "$LOGS"/"$DATA".log

return 0

else

echo "$(date +%Y-%m-%d_%H-%M-%S)" "ошибка создания копии" "$1" >> "$LOGS"/"$DATA".log

exit

fi

}

ClearOldFiles()

{

local FILES

local NUM="1"

FILES=$(find "$BACKUPDIR" -maxdepth 1 -type f -name "*.gz" | wc -l)

if [ "$FILES" -gt "$FILEBACK" ] ; then

FILEBACK=$((FILEBACK+NUM))

cd $BACKUPDIR || exit

ls -tp | grep -v '/$' | tail -n +$FILEBACK | xargs -I {} rm -- {}

cd $LOGS || exit

ls -tp | grep -v '/$' | tail -n +$FILEBACK | xargs -I {} rm -- {}

echo "$(date +%Y-%m-%d_%H-%M-%S)" "очистка файлов и логов" >> "$LOGS"/"$DATA".log

return 0

else

echo "$(date +%Y-%m-%d_%H-%M-%S)" "ошибка очистки файлов и логов" >> "$LOGS"/"$DATA".log

return 1

fi

}

Maintance()

{

echo "$(date +%Y-%m-%d_%H-%M-%S)" "Стартvacuumdb" "$1" >> "$LOGS"/"$DATA".log

if sudo -u postgres /usr/lib/postgres/bin/vacuumdb --full --analyze --username postgres --dbname "$1" > /dev/null 2>&1 ; then

echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конецvacuumdb" "$1" >> "$LOGS"/"$DATA".log

else

echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибкаvacuumdb" "$1" >> "$LOGS"/"$DATA".log

exit

fi

echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт переиндексации" "$1" >> "$LOGS"/"$DATA".log

if sudo -u postgres /usr/lib/postgres/bin/reindexdb --username postgres --dbname "$1" > /dev/null 2>&1 ; then

echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конец переиндексации" "$1" >> "$LOGS"/"$DATA".log

else

exit

fi

return 0

}

for i in ${BASES[@]};

do

if Backup $i ; then

Maintance $i

else

exit

fi

done

ClearOldFiles $i

(date +%Y-%m-%d_%H-%M) > /var/log/timestamp

echo "$(date +%Y-%m-%d_%H-%M-%S)" "Создание файла для мониторинга" >> "$LOGS"/"$DATA".log

Создаем регламентное задание для запуска скрипта 1с.bash в 00:00 часов ежедневно через Cron

0 0 * * * bash /opt/script/1с.bash > /dev/null 2>&1

Для восстановления бэкапа используем команды

su postgres

/opt/pgpro/1c-15/bin/createdb названиеноваябаза

/opt/pgpro/1c-15/bin/psql названиеноваябаза < /home/копия.sql