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