В этой статье опишу настройку СУБД PostgreSQL для работы с базами 1С под определенное железо, а также немаловажный фактор обслуживания баз, бэкап и восстановления.
Настройка СУБД делается в обязательном порядке, иначе вы можете столкнуться с проблемами быстродействия как само сервера, так и баз которые у вас расположены по управление. Для начала опишу параметры, которые в принципе необходимы для настройки их не так много:
Заходим в терминал под root, запускаем Command Center через команду mc
Переходим в папку /var/lib/pgpro/1c-15/data и правим через клавишу F4 файл postgresql.conf
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