Скрипт автоматической переиндексации (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
 
и сохраняем.

Sept. 28, 2012