понедельник, 18 апреля 2011 г.

Установка PostgreSQL на FreeBSD


PostgreSql - очень мощная свободная объектно-реляционная система управления базами данных (СУБД).
Существует в реализациях для следующих платформ: Linux, Solaris/OpenSolaris, Win32, Mac OS X, FreeBSD, QNX 4.25, QNX 6
PostgreSQL базируется на языке SQL и поддерживает многие из возможностей стандарта SQL:2003
Сильными сторонами PostgreSQL считаются:
 - поддержка БД практически неограниченного размера;
 - мощные и надёжные механизмы транзакций и репликации;
 - расширяемая система встроенных языков программирования: в стандартной поставке поддерживаются PL/pgSQL, PL/Perl, PL/Python и PL/Tcl; дополнительно можно использовать PL/Java, PL/PHP, PL/Py, PL/R, PL/Ruby, PL/Scheme и PL/sh, а также имеется поддержка загрузки C-совместимых модулей[5];
 - наследование;
 - легкая расширяемость.

В общем это очень достоя СУБД для корпоративных приложений.
Рассмотрим установку на FreeBSD
Текущая версия  FreeBSD 8.2, PostgreSQL 8.4 (есть уже 9, но далеко не все приложения совместимы с ней)
Установка Postgresql

# cd /usr/ports/databases/postgresql84-server/
# make install clean
Задаем пароль  pgsql:

# passwd pgsql
Changing local password for pgsql
New Password:
Retype New Password:
Устанавливаем каталог баз данных, что нравится - /home/pgsql или /var/pgsql:

# mkdir /var/pgsql
# chpass pgsql 
На всякий случай копируем все файлы(у меня было пусто) из стандартной директории в нашу новую директорию 
# mv /usr/local/pgsql/* /var/pgsql/
# mkdir /var/pgsql/data
Выставляем права доступа к каталогу базы данных:

#chown -R pgsql:pgsql /var/pgsql/
#chmod -R 750 /var/pgsql/
Добавляем в /etc/rc.conf строчки для автозагрузки БД:

postgresql_enable="YES"
postgresql_data="/var/pgsql/data"
postgresql_class="postgres"
Инициализируем кластер БД:

#/usr/local/etc/rc.d/postgresql initdb
У меня отругалось следующим образом

Файлы, сопутствующие этой системе баз данных, будут
принадлежать пользователю "pgsql". Этот пользователь
также должен быть владельцем процесса сервера.
Кластер баз данных будет инициализирован со следующими локалями:
  COLLATE:  C
  CTYPE:    ru_RU.KOI8-R
  MESSAGES: ru_RU.KOI8-R
  MONETARY: ru_RU.KOI8-R
  NUMERIC:  ru_RU.KOI8-R
  TIME:     ru_RU.KOI8-R
initdb: несоответствие кодировки
Кодировка которую вы выбрали (UTF8) и кодировка выбранной
локали (KOI8R) не совпадают.  Это может привести к неожиданным
результатам в различных функциях связанных с обработкой строк.
Для исправления  перезапустите initdb и, либо не указывайте
кодировку, либо задайте правильную комбинацию кодировки и локали.
PostgreSQL 8.x использует кодировку UTF-8 по умолчанию. Ругань происходит из-за несоответствия локалей. К сожалению на данный момент FreeBSD еще не поддерживает в консоли UTF-8 :(
Вы можете добавить поддержку UTF-8 по этой заметке.
После чего, сделать следующее :

# добавляем это в /etc/rc.conf
postgresql_class="russian-utf8"
# Выполняем эту команду в консоли
pw usermod pgsql -L russian-utf8

И выполняем инициализацию кластера снова

# /usr/local/etc/rc.d/postgresql initdb
Файлы, сопутствующие этой системе баз данных, будут
принадлежать пользователю "pgsql". Этот пользователь
также должен быть владельцем процесса сервера.
Кластер баз данных будет инициализирован со следующими локалями:
  COLLATE:  C
  CTYPE:    ru_RU.UTF-8
  MESSAGES: ru_RU.UTF-8
  MONETARY: ru_RU.UTF-8
  NUMERIC:  ru_RU.UTF-8
  TIME:     ru_RU.UTF-8
Конфигурация полнотекстового поиска по умолчанию установлена в "russian".

исправление прав на существующую директорию /var/pgsql/data ... ок
создание поддиректорий ... ок
выбирается значение по умолчанию для max_connections ... 40
selecting default shared_buffers ... 28MB
создание конфигурационных файлов ... ок
создание базы template1 в /var/pgsql/data/base/1 ... ок
инициализация pg_authid ... ок
инициализация зависимостей ... ок
создание системных представлений ... ок
загрузка системных описаний объектов ... ок
создание конверсий ... ок
создание словарей ... ок
установка привилегий для встроенных объектов ... ок
создание информационной схемы ... ок
сборка мусора в базе template1 ... ок
копирование template1 в template0 ... ок
копирование template1 в postgres ... ок

ВНИМАНИЕ: используется аутентификация "trust" для локальных подключений.
Вы можете её поменять, отредактировав pg_hba.conf или используя опцию -A,
при следующем выполнении initdb.

Успех. Вы теперь можете запустить сервер баз данных:

    /usr/local/bin/postgres -D /var/pgsql/data
или
    /usr/local/bin/pg_ctl -D /var/pgsql/data -l logfile start
По завершении процедуры инициализации мы получили базу по адресу /usr/local/pgsql/data/. Наш сервер готов к запуску.

-----------------------------------------------------------------------------------
Для исправления ситуации можно также использовать стандартный способ.
Добавляем следующие строки в /etc/login.conf

postgres:\
        :lang=en_US.UTF-8:\
        :setenv=LC_COLLATE=C:\
        :tc=default:
Перестраиваем БД для login

# cap_mkdb /etc/login.conf
Устанавливаем класс postgres для юзера pgsql

# pw usermod pgsql -L postgres
И в /etc/rc.conf обязательно должна быть строчка (мы ее добавили раньше...)

postgresql_class="postgres"
-----------------------------------------------------------------------------------

Запускаем PostgreSQL Server

#/usr/local/etc/rc.d/postgresql start

Проверка состояния сервера

# /usr/local/etc/rc.d/postgresql status
pg_ctl: выполняется сервер (PID: 1261)
/usr/local/bin/postgres "-D" "/var/pgsql/data"

Управление пользователями 
Изначально сервер сконфигурирован так, что любые подключения возможны с локальной машины без пароля. Конечно, это не очень безопасно, поэтому первое, что сделаем, ограничим доступ к серверу без пароля.
Есть 2 способа управлять базами данных и пользователями PosgreSQL:
  -  утилиты коммандной строки (createuser, createdb, dropuser, dropdb и др.)
  -  интерактивный терминал.
Воспользуемся интерактивным терминалом psql для настройки прав доступа.
Заходим в базу.
Проверяем кодировку, чтоб убедиться, что она UTF-8. Выставляем пароль pgsql, который является суперпользователем. А затем создаем нового пользователя. Затем проверяем, какие пользователи есть и с какими привелегиями.

# psql -U pgsql template1
template1=# \encoding
UTF8
template1=# ALTER USER pgsql WITH PASSWORD 'пароль';
ALTER ROLE
template1=#CREATE USER пользователь WITH CREATEDB LOGIN PASSWORD 'пароль';
CREATE ROLE
template1=# \du
            List of roles
 Role name | Attributes  | Member of
-----------+-------------+-----------
 pgsql     | Superuser   | {}
           : Create role
           : Create DB
пользователь| Create DB   | {}

Ctrl+D
Примечание: получить справку можно с помощью команд «\h» и «\?». Получить справку по конкретной команде можно дописав ее после \h (Например \h drop user)
Изменяем доступ к базе данных, правя /var/pgsql/data/pg_hba.conf: доступ по IPv6 отключаем, комментируя строчку

# host all all ::1/128 trust
локальный доступ к БД по паролю, меняем trust на md5 (вместо пароля будет храниться его md5 хеш):

local all all md5
host all all 127.0.0.1/32 md5
Рестратуем PostgreSQL

#/usr/local/etc/rc.d/postgresql restart
Графические средства для управления PostgreSQL
Несмотря на всю мощь командной строки для тех, кто постоянно не занимается базами данных учить кучу команд просто нецелесообразно. В таких случаях могут помочь графические программы. Вот несколько из них:
phpPgAdmin – как видно из названия, написана на PHP, т.е. удобна в тех случаях, когда с базой работает веб-приложение. Для работы требуется любой веб-сервер с поддержкой PHP.
pgAdmin – кроссплатформенное приложение, написанное на C++. Поддерживает множество платформ: FreeBSD, Linux, Mac OS, Windows. Пользователи FreeBSD могут установить приложение из портов: /usr/ports/databases/pgadmin3/.

Ссылки:
www.postgresql.org
Wikipedia - PostgreSQL
Lissyara - Установка PostgreSQL
postgresql.ru.net (рус)
Установка PostgreSQL на FreeBSD
Офф. дока по увеличению значений накладываемых ядром на PostgreSQL 

14 комментариев:

  1. 1. Спасибо, очень интересно
    2. Если не ошибаюсь, в pgsql есть возможность то ли зеркалировать БД, то ли размещать одну БД сразу на нескольких серверах. Короче что-то типа "RAID по сети". Вы не могли бы этот вопрос поподробнее осветить?
    3. По поводу UTF-8 в консоли - вы же наверняка не в той консоли сидите, что по монитору система выводит, а по SSH. А на десктопе вряд ли работаете без иксов. А там UTF-8 чуть ли не с пятой версии (с шестой - точно) можно спокойно использовать. Избежите кучу проблем, если перейдете на ютф.

    ОтветитьУдалить
  2. 1. Вам спасибо за отзыв :).
    2. Я так понимаю под зеркалированием вы подразумеваете репликацию БД в режиме master -> slave. Мне не приходилось этим заниматься, хотя насколько я знаю ее можно сделать двумя способами:
    - Нативный (т.е. средствами самого PostgreSQl) - есть статья http://habrahabr.ru/blogs/postgresql/106872/
    - С использованием Slonny - также есть статья - http://postgresql.ru.net/docs/sloniki-privet.html + доки на английском http://slony.info/documentation/
    3. Да, конечно я сижу через SSH. Вариант, котрый описан мной все равно не дает возможность в чистой консоли работать с UTF-8 (виной тому syscons). При простом выставлении в putty UTF-8, все равно не все символы отображаются корректно (отображаются вместо некоторых символов точки и прямоугольники), да и есть проблемы с вводом русского текста. Т.е. данный вариант дает возможность наиболее комфортно использовать UTF-8 через putty. Если в чем не прав, поправте.

    ОтветитьУдалить
  3. исправь cd /usr/ports/database/postgresql84-server/ на
    cd /usr/ports/databases/postgresql84-server/

    ОтветитьУдалить
  4. Пытаюсь понять смысл всей этой локализации в целом. Насколько вот это

    "Кластер баз данных будет инициализирован со следующими локалями:
    COLLATE: C
    CTYPE: ru_RU.UTF-8
    MESSAGES: ru_RU.UTF-8
    MONETARY: ru_RU.UTF-8
    NUMERIC: ru_RU.UTF-8
    TIME: ru_RU.UTF-8
    Конфигурация полнотекстового поиска по умолчанию установлена в "russian"."

    лучше, как елибы тут были латинское всё.

    Я хочу сказать, что в целом не понял смысла локализации в UTF консоли и т.п. если некоторые программы с этой кодировкой не работают. Скажем тот же mc-light и, наверное таким немало.

    ОтветитьУдалить
  5. Возможно Вы и правы, что лучше устанавливать в латинское все.. Это уже как кому удобно..
    НАсчет локализации в консоли. Для себя я особых проблем не наблюдаю. На серерах я работаю в основном удаленно и мне удобнее, чтоб везде была одна кодировка UTF-8. Насчет mc, тоже не проблема. решается в течение 1 мин.
    # mv /usr/local/bin/mc /usr/local/bin/mc_
    # touch /usr/local/bin/mc
    Вставить в файл /usr/local/bin/mc
    #!/bin/sh
    /usr/local/bin/mc_ -a $1

    # chmod 555 /usr/local/bin/mc
    Все :)

    ОтветитьУдалить
  6. вот поэтому я и не люблю фри.
    гораздо меньше мороки под дебианом
    aptitude install postgresql
    и всё.
    и локаль utf8 и права нужные и пути и стартовые скрипты

    ОтветитьУдалить
  7. У каждой ОС свои + и -. Работаю с обоими осями и как по мне для сервака FreeBSD то что нужно(хотя опять же не во всех случаях), но использовать ее для десктопа - это уже для реальных маньяков :).
    Возможность выбора - это всегда хорошо!!!

    ОтветитьУдалить
  8. а как так фря по-русски разговаривает? )

    pg_ctl: выполняется сервер (PID: 1261)

    ОтветитьУдалить
  9. Можно научить при желании :)
    http://nix-sa.blogspot.com/2011/01/utf8-freebsd.html

    ОтветитьУдалить
  10. всё отлично а вот кто либо подключал модуль PL/java

    ОтветитьУдалить
  11. FreeBSD - офигенная ось. (особенно в сравнении со всякими там opensuse , fedora и тд...) Статья хорошая. Только вот штука такая... Игрался с локалью до данного действа и когда сделал всё как здесь описано, то ничего не вышло... типа всё равно ругается на koi8-r. Тогда начал расширенно шевелить мозгами, почему так. Оказывается, что за юзером pgsql штатным интерпритатором в системе числется sh. А он в свою очередь берет настройки из /etc/profile а там у меня была как раз таки прописана koi8-r. Вобщем походу перевод на UTF-8 для PostgreSQL стоит начинать с этого файла, а дальше уже по мере надобности....

    ОтветитьУдалить
  12. Спасибо за ВАЖНОЕ ДОПОЛНЕНИЕ!

    p.s. а по FreeBSD полностью согласен, отличная ОС. С нее и начинал изучать unix like OS. До сих пор считаю лучшей особенно в ряде задач.

    ОтветитьУдалить
  13. Последнее время я использую Valentina Studio для работы с PostgreSQL. Очень хороший и бесплатный инструмент, рекомендую посмотреть.http://www.valentina-db.com/en/valentina-studio-overview

    ОтветитьУдалить