Установка 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 на выполнение в любое удобное для Вас время.
В принципе все.
Комментариев нет:
Отправить комментарий