2008-08-08

Установка PostgreSQL 8.3.1 из исходников + базовая настройка


Установка PostgreSQL 8.3.1 из исходников + базовая настройка

Автор: Филиппов Алексей

Связь: fa13@bk.ru

Дата создания: 27 марта 2008

Постоянный адрес статьи: http://phas13.blogspot.com/2008/08/postgresql-831.html

Имеем установленный SLES9 SP4.

Необходимо получить работающий сервер PostgreSQL версии 8.3.1, собранный из исходников, взятых с официального сайта postgresql.org.

Сразу дам совет — курите маны!!! Прочитайте внимательно инструкцию PostgreSQL по установке. Фиг с ним, что на английском — все равно вы без него никуда не денетесь...

Необходимо проверить, что в системе установлены следующие пакеты:

gcc-3.3.3

gettext-0.14.1

make-3.80

perl-5.8.3

perl-gettext-1.01

readline-devel-4.3

readline-4.3

zlib-1.2.1

zlib-devel-1.2.1

Для проверки используем команду rpm -q.

Версии могут отличаться, главное, чтоб в большую сторону. Может и в меньшую, но незначительно. Более точные и подробные требования приведены в документации PostgreSQL, в разделе «Installation Instructions».

Тянем с postgresql.org исходники последней версии.

Копируем их в каталог /opt

Далее все действия выполняем под root:

root# mkdir /opt/src

root# cp /opt/postgresql-8.3.1.tar.gz /opt/src

root# rm /opt/postgresql-8.3.1.tar.gz

root# cd /opt/src

root# tar -xvzf postgresql-8.3.1.tar.gz

root# cd postgresql-8.3.1

ВНИМАНИЕ!!! Каталог /opt/src/postgresql-8.3.1 и файл /opt/src/postgresql-8.3.1.tar.gz удалять нельзя никогда!!! По крайней мере пока на данном сервере эксплуатируется данная версия postgresql. Продолжаем под root:

root# mkdir /opt/pgsql

root# ./configure --prefix=/opt/pgsql --enable-thread-safety

root# gmake

После ввода последней команды будет долго мелькать информация о компиляции. В конце должно быть выдано следующее сообщение:

All of PostgreSQL successfully made. Ready to install.

Далее делаем предварительный тест установки. Для этого заходим в систему под непривилегированным пользователем (у меня это alexsf):

root# su — alexsf

alexsf> cd /opt/src/postgresql-8.3.1/

alexsf> gmake check

В результате будет выдано большое количество информации. Внимательно смотрим на все выданное, ищем ошибки (у меня их не было, поэтому я не знаю как они выглядят). Самое главное, что у меня было выдано:

=======================

All 114 tests passed.

=======================

В принципе, наверное неплохо... Будем считать, что тест прошел успешно. Выходим из непривилегированного пользователя и продолжаем под root:

alexsf> exit

root# make install

Помелькает на экране много всякого, но достаточно быстро. В результате должно быть выдано:

PostgreSQL installation complete.

Теперь настраиваем наш linux. Первым делом параметры ядра linux.

ВНИМАНИЕ!!! Если на сервере, где ставится postgresql работает oracle, или установлен пакет orarun, то параметры ядра уже настроены, и по этому ничего делать не нужно. Если же сервер девственно чист, то под пользователем root редактируем файл /etc/sysctl.conf. Добавляем или редактируем строку, чтобы получилось так:

kernel.shmmax = 1000000000

После этого перегружаемся или выполняем под пользователем root (что по на самом деле одно и то же):

root# sysctl kernel.shmmax = 1000000000

С параметрами ядра закончили.

Теперь займемся объяснением linux-у, где чего у нас лежит, и как это что-то найти. Редактируем файл /etc/profile. В самый конец дописываем:

LD_LIBRARY_PATH=/opt/pgsql/lib:${LD_LIBRARY_PATH}

export LD_LIBRARY_PATH

PATH=/opt/pgsql/bin:${PATH}

export PATH

MANPATH=/opt/pgsql/man:${MANPATH}

export MANPATH

Создадим пользователя, под которым у нас будет работать база данных:

root# mkdir /opt/pgsql/home

root# mkdir /opt/pgsql/data

root# groupadd postgres

root# useradd postgres -d /opt/pgsql/home -s /bin/bash

root# usermod -G postgres postgres

root# passwd postgres

root# chown postgres:postgres /opt/pgsql/home

root# chown postgres:postgres /opt/pgsql/data

Инициализируем кластер базы данных:

root# su — portgres

postgres> initdb -D /opt/pgsql/data

В результате мы должны увидеть, что кластер инициализировался нормально.

Осталось совсем немного — создать скрипты останова-запуска базы и обеспечить автоматический старт при загрузке сервера.

postgres> exit

root# cp /opt/src/postgresql-8.3.1/contrib/start-scripts/linux /etc/init.d/

root# mv /etc/init.d/linux /etc/init.d/postgresql

root# chmod 755 /etc/init.d/postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc3.d/K13postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc3.d/S09postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc5.d/K13postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc5.d/S09postgresql

Редактируем файл /etc/init.d/postgresql.

Меняем строку

prefix=/usr/local/pgsql

на

prefix=/opt/pgsql

Меняем строку

PGDATA="/usr/local/pgsql/data"

на

PGDATA="/opt/pgsql/data"

Ну и собственно пробуем запустить:

root# /etc/init.d/postgresql start

Должно выдать

Starting PostgreSQL: ok

Ну собственно вся работа по установке закончена. Сервер запущен. Работает. Осталась базовая настройка и ввод в эксплуатацию. К сборке PostgreSQL из исходников это отношения не имеет, но информация полезная. так что...

Поменяем пароль пользователю базы данных postgres:

root# su — postgres

postgres> psql

postgres=# alter role postgres password 'some_password';

postgres=# \q

postgres> exit

root#

Обеспечим, чтоб PostgreSQL принимал запросы от любых хостов. Редактируем файл /opt/pgsql/data/pg_hba.conf. У меня он выглядит так:

local all all ident sameuser

host all all 127.0.0.1/32 ident sameuser

host all all 0.0.0.0/0 password

Потом редактируем файл /opt/pgsql/data/postgres.conf. У меня он выглядит так:

#---------------------------------------------------------------------------

# FILE LOCATIONS

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# CONNECTIONS AND AUTHENTICATION

#---------------------------------------------------------------------------

listen_addresses = '*'

max_connections = 100

superuser_reserved_connections = 5

#---------------------------------------------------------------------------

# RESOURCE USAGE (except WAL)

#---------------------------------------------------------------------------

max_fsm_pages = 153600

max_stack_depth = 2MB

shared_buffers = 300MB

temp_buffers = 20MB

work_mem = 2MB

#---------------------------------------------------------------------------

# WRITE AHEAD LOG

#---------------------------------------------------------------------------

fsync = off

#---------------------------------------------------------------------------

# QUERY TUNING

#---------------------------------------------------------------------------

constraint_exclusion = on

#---------------------------------------------------------------------------

# ERROR REPORTING AND LOGGING

#---------------------------------------------------------------------------

log_line_prefix = '%s %h %u '

log_min_duration_statement = 60000

log_min_error_statement = warning

log_statement = 'ddl'

redirect_stderr = on

#---------------------------------------------------------------------------

# RUNTIME STATISTICS

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# AUTOVACUUM PARAMETERS

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# CLIENT CONNECTION DEFAULTS

#---------------------------------------------------------------------------

datestyle = 'iso, dmy'

lc_messages = 'ru_RU.UTF-8'

lc_monetary = 'ru_RU.UTF-8'

lc_numeric = 'ru_RU.UTF-8'

lc_time = 'ru_RU.UTF-8'

#---------------------------------------------------------------------------

# LOCK MANAGEMENT

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# VERSION/PLATFORM COMPATIBILITY

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# CUSTOMIZED OPTIONS

#---------------------------------------------------------------------------

Перезапускаем PostgreSQL:

root# /etc/init.d/postgres restart

Теперь нам нужно создать базу данных, в которой будут рабочие данные:

root# mkdir /u02/pgdata/res -p

root# chown postgres:postgres /u02/pgdata/res

root# su — postgres

postgres# psql

postgres=# CREATE ROLE res LOGIN PASSWORD 'res' NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;

postgres=# CREATE TABLESPACE res OWNER res LOCATION '/u02/pgdata/res';

postgres=# CREATE DATABASE "res" WITH ENCODING='UTF8' OWNER=res TABLESPACE=res;

postgres=# CREATE SCHEMA res AUTHORIZATION res;

postgres=# \q

postgres> exit

root#

Теперь настраиваем автоматический сбор статистики и vacuum.

root# mkdir /u02/scheduler/analyze/pgsql -p

root# chown postgres:postgres /u02/scheduler/analyze/pgsql

root# touch /u02/scheduler/analyze/pgsql/pgsql.sh

root# chmod 754 /u02/scheduler/analyze/pgsql/pgsql.sh

Редактируем файл /u02/scheduler/analyze/pgsql/pgsql.sh. Должно получиться следующее:

#!/bin/bash

su - postgres -c "cd /u02/scheduler/analyze/pgsql; psql -d res -f vacuum.sql -o vacuum_execute -t; psql -d res -f vacuum_execute -o vacuum_execute.log"

su - postgres -c "cd /u02/scheduler/analyze/pgsql; psql -d res -f analyze.sql -o analyze_execute -t; psql -d res -f analyze_execute -o analyze_execute.log"

Обратите внимание, что строки с табуляцией — это продолжение первой строки без табуляции. Короче все в строчку должно писаться. Дальше выполняем:

root# su - postgres

postgres# touch /u02/scheduler/analyze/pgsql/vacuum.sql

postgres# touch /u02/scheduler/analyze/pgsql/analyze.sql

postgres# exit

Редактируем файл /u02/scheduler/analyze/pgsql/analyze.sql. Должно получиться следующее:

select 'analyze verbose ' || table_schema || '.' || table_name || ';'

from information_schema.tables

where lower(table_schema) = 'res'

and lower(table_type) = 'base table'

order by table_schema, table_name;

Редактируем файл /u02/scheduler/analyze/pgsql/vacuum.sql. Должно получиться следующее:

select 'vacuum full verbose ' || table_schema || '.' || table_name || ';'

from information_schema.tables

where lower(table_schema) = 'res'

and lower(table_type) = 'base table'

order by table_schema, table_name;

После этого ставим /u02/scheduler/analyze/pgsql/pgsql.sh в cron на еженощное выполнение.

Ну и дело за малым — обеспечить резервное копирование. Заморачиваться по тяжелому не будем, сделаем все по простому.

root# mkdir /u02/scheduler/backup/pgsql/data -p

root# mkdir /u02/scheduler/backup/pgsql/mountpoint

root# chown postgres:postgres /u02/scheduler/backup/pgsql -R

root# touch /u02/scheduler/backup/pgsql/pgsql.sh

root# chmod 754 /u02/scheduler/backup/pgsql/pgsql.sh

Редактируем файл /u02/scheduler/backup/pgsql/pgsql.sql. Должно получиться следующее:

#!/bin/bash

export CURDT=$(date +%Y-%m-%d.%H.%M.%S)

#cool backup

/etc/init.d/postgresql stop

tar -cvf data/pgsql.cool.tar /u02/pgdata

tar -uvf data/pgsql.cool.tar /var/lib/pgsql

tar -uvf data/pgsql.cool.tar /u02/scheduler/analyze/pgsql

tar -uvf data/pgsql.cool.tar /u02/scheduler/backup/pgsql/pgsql.sh

tar -cvzf data/pgsql.cool.$CURDT.tar.gz data/pgsql.cool.tar

rm data/pgsql.cool.tar

/etc/init.d/postgresql start

# full dump

su - postgres -c "cd /u02/scheduler/backup/pgsql/data; pg_dumpall -v > pgsql.pg_dumpall"

tar -cvzf data/pgsql.pg_dumpall.$CURDT.tar.gz data/pgsql.pg_dumpall

rm data/pgsql.pg_dumpall

# res dump

su - postgres -c "cd /u02/scheduler/backup/pgsql/data; pg_dump -C -F c -b -f pgsql.res "res""

tar -cvzf data/pgsql.res.$CURDT.tar.gz data/pgsql.res

rm data/pgsql.res

# copy backup files

umount mountpoint

mount 196.77.150.3:/files/backup/pgsql mountpoint -w

cp -fv data/pgsql.cool.$CURDT.tar.gz mountpoint

cp -fv data/pgsql.pg_dumpall.$CURDT.tar.gz mountpoint

cp -fv data/pgsql.res.$CURDT.tar.gz mountpoint

umount mountpoint

Обратите внимание, что в данном скрипте подразумевается, что на хосте 196.77.150.3 в NFS экспортирована директория /files/backup/pgsql с доступом на запись.

Ну и естественно ставим /u02/scheduler/backup/pgsql/pgsql.sql в cron на выполнение в любое удобное для Вас время.

В принципе все.

27 марта 2008

Комментариев нет: