PDF Печать E-mail

 

Скрипт автоматической переиндексации (reindex) и удаления мертвых данных (full vacuum) в базе postgresql.

 

REINDEX - операция переиндексации, исправление поврежденных индексов в базе.

 

VACUUM - сборка "мусора". VACUUM восстанавливает место занятое "мертвыми" данными. При выполнении обычных операций с данными, PostgreSQL не удаляет данные физически из таблиц, это происходит с операцией FULL VACUUM.

 

 

 

На работе имеется несколько серверов 1с+postgresql, некоторые с относительно не маленькими базами (около 80Гб), поэтому остро встает проблема свободного места на дисках и скорости работы этих баз. Со временем базы в постгрес имеют свойство разрастаться, и начинать медленней шевелиться из-за проблем с индексацией. Для решения этих проблем был написан простой скрипт, который раз в неделю ночью запускает reindex и full vacuum.

 

Создаем файл скрипта:

 

touch reindex.sh

 

Разрешаем его запуск:

 

chmod +x reindex.sh

 

Открываем и копируем туда собственно сам скрипт:

 

vim reindex.sh

 

#!/bin/bash

h=127.0.0.1
p=5432
u=postgres

xxx () {
/bin/echo $db >> /var/log/reindex.log
/bin/date >> /var/log/reindex.log
/bin/echo "begin reindex" >> /var/log/reindex.log
/usr/bin/psql --dbname $db --host $h --port $p --username $u -w --command "reindex DATABASE \"$db\";" >> /var/log/reindex.log
/bin/date >> /var/log/reindex.log
/bin/echo "end reindex" >> /var/log/reindex.log
/bin/echo "begin vacuum full analyze" >> /var/log/reindex.log
/usr/bin/psql --dbname $db --host $h --port $p --username $u -w --command "vacuum full analyze;" >> /var/log/reindex.log
/bin/date >> /var/log/reindex.log
/bin/echo "end vacuum full analyze" >> /var/log/reindex.log
}

db=mhvl
xxx

 

где:

db - имя базы данных,

h - ip-адрес сервера postgresql (в моем случае скрипт лежит на нем),

p - порт, на котором постгрес работает,

u - имя пользователя в postgresql

 

Скрипт запускает reindex и full vacuum, внося записи в файл логов о времени начала и окончания операций с базой.

 

 Для автологина создаем на сервере с базой в корне домашней директории пользователя постгрес файлик:

touch /var/lib/pgsql/.pgpass

nano /var/lib/pgsql/.pgpass


И пишем в моем случае:

10.10.10.4:5432:*:postgres:pass

В общем случае формат его такой:

hostname:port:database:username:password

Т.е.  разрешен автологин с компьютера 10.10.10.4 на стандартный порт postgresql 5432 ко всем базе на сервере для пользователя postgres, и последним указан пароль.

Даем нужные права на файлик:

chmod 600 /var/lib/pgsql/.pgpass
chown postgres:postgres /var/lib/pgsql/.pgpass

Осталось добавить его в cron для автоматического запуска например час ночи воскресенья:

 

crontab -u root -e

 

добавляем строку:

 

0 1 * * 7 /root/reindex.sh

 

и сохраняем.