Сайт FSA
02.10.2010

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

Заметка написана для тех, кто первый раз встречается с PostgreSQL, но, возможно, имел дело с MySQL. Рассчитана в основном для начинающих пользователей, хотя и требует некоторого знания особенностей работы с FreeBSD.

Предисловие или особенности локализации FreeBSD

PostgreSQL 9.0 использует кодировку UTF-8 по умолчанию. Поскольку в качестве операционной системы я выбрал имеющуюся у меня FreeBSD 8.1, которая не совсем полноценно поддерживает эту кодировку, хочу описать особенности локализации. С UTF-8 не умеет работать консольный драйвер syscons, т.е. в текстовой консоли UTF-8 вы использовать не сможете. Сначала может показаться, что UTF-8 использовать будет просто невозможно, но если учесть, что управление сервером осуществляется по сети, а клиенты SSH как правило умеют работать с любой кодировкой, то использование UTF-8 не вызовет затруднений. Если же вы используете Xorg, то можете воспользоваться любым графическим терминалом, которые в большинстве своём так же без проблем работают с UTF-8 (например, gnome-terminal).

Наиболее удобным способом локализации системы оказался метод Class Login, описанный в handbook - http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/using-localization.html (см. п. 21.3.4.1.1.). Я использовал уже имеющийся класс russian слегка модифицировав его путём замены кодировки KOI8-R на UTF-8. Метод выбран из-за того, что хотелось сохранить работоспособность пользователя root в консоли, т.е. сохранить ему LOCALE, поддерживаемую syscons. При доступе по SSH пользователь root сохраняет LOCALE пользователя, с которого произошло переключение по команде su root.

Если вы используете другой способ локализации и тем более, используете KOI8-R, то вам придётся позаботиться о том, чтобы пользователь pgsql (появится после установки postgresql из порта) имел локаль UTF-8. Так же имеется возможность заставить работать postgresql с кодировкой KOI8-R, но я считаю это нецелесообразным. Использование KOI8-R далее в тексте не рассматривается.

Установка PostgreSQL

Установку будем производить из портов, но не непосредственно, а с помощью portmaster, который можно найти в /usr/ports/ports-mgmt/portmaster.

Если ранее была установлена старая версия клиента, заменяем на новую:

portmaster -o databases/postgresql90-client postgresql-client-\*

Если клиент ранее не был установлен, то установим его следующим образом:

portmaster databases/postgresql90-client

Устанавливаем сервер PostgreSQL 9.0:

portmaster databases/portgresql90-server

После скачивания и сборки из исходного кода мы получаем готовый сервер PostgreSQL. Теперь нужно позаботиться о создании кластера базы данных. Поскольку всю черновую работу сделал за нас порт, мы можем не заботиться о создании необходимого пользователя, а сразу перейти к инициализации базы.

Во-первых, разрешим автоматический запуск сервера в /etc/rc.conf:

postgresql_enable="YES"

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

/usr/local/etc/rc.d/postgresql initdb

На этом шаге нас может поджидать проблема с кодировками. Если это всё-таки случилось, советую перечитать предисловие и перейти к использованию UTF-8.

По завершении процедуры инициализации мы получили базу по адресу /usr/local/pgsql/data/. Наш сервер готов к запуску:

service postgresql start

Сервер будет запускаться автоматически при каждом запуске сервера, т.к. мы внесли необходимую запись в rc.conf ранее.

Первоначальное конфигурирование сервера PostgreSQL

Изначально сервер сконфигурирован так, что любые подключения возможны с локальной машины без пароля. Конечно, это не очень безопасно, поэтому первое, что сделаем, ограничим доступ к серверу без пароля.

Есть 2 способа управлять базами данных и пользователями PosgreSQL: утилиты командной строки (createuser, createdb, dropuser, dropdb и др.) и интерактивный терминал.

Воспользуемся интерактивным терминалом psql для настройки прав доступа. Первую команду следует выполнять от root, т.к. в этом случае нам не потребуется пароль для пользователя pgsql:

# su pgsql
$psql -U pgsql template1

В ответ получим что-то вроде:

psql (9.0.0)
Type "help" for help.
template1=#

Здесь мы можем ознакомиться с предоставляемыми нам возможностями с помощью команд \h и \?. Для примера попробуем создать пользователя test и базу данных test к которой он будет иметь доступ.

template1=# create user test;
CREATE ROLE
template1=# \du
                       List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 pgsql     | Superuser, Create role, Create DB | {}
 test      |                                   | {}

Обращаю ваше внимание на то, что команда должна завершаться символом “;”. Если символ отсутствует, то оболочка ожидает продолжение команды. Если вы вдруг забыли установить “;” после команды, можете сделать это в следующей строке. После выполнения команды всегда выдаётся ответ, как в нашем примере выше “CREATE ROLE”.

Как мы видим из результатов вывода команды \du у нас имеются 2 пользователя PostgreSQL: pgsql - обладающий правами на настройку сервера, создания пользователей и баз данных, и наш новый пользователь test с ограниченными правами. Мы можем изменить права доступа пользователя следующим образом:

template1=# alter user test superuser createrole createdb;
ALTER ROLE
template1=# \du
                       List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 pgsql     | Superuser, Create role, Create DB | {}
 test      | Superuser, Create role, Create DB | {}

Советую по возможности избегать раздачи таких высоких прав доступа. Как правило, нет смысла давать такие права для обычного пользователя. Вернём нашему пользователю test изначальные права:

template1=# alter user test nosuperuser nocreaterole nocreatedb;
ALTER ROLE
template1=# \du
                       List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 pgsql     | Superuser, Create role, Create DB | {}
 test      |                                   | {}

Ограничим доступ паролями:

template1=#\password test
Enter new password: 
Enter it again:

Процедура создания пароля стандартная — вас просят дважды ввести пароль для пользователя. Аналогичным образом защитите суперпользователя (чтобы иметь возможность управлять сервером).

Теперь можем включить проверку пароля при подключении к нашему серверу. За это отвечает файл /usr/local/pgsql/data/pg_hba.conf:

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

Как видите, имеется 3 записи для локальных подключений. Все записи указывают на отсутствие проверки пароля - “trust”. Заменим это значение на “md5”:

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

Перезапустим наш сервер, чтобы применить настройки:

service postgresql restart

Пробуем подключиться к интерактивной оболочке. Как видите, теперь нам предлагают ввести пароль для нашего пользователя:

$ psql -U pgsql template1
Password: 
psql (9.0.0)
Type "help" for help.
template1=#

Создадим базу для нашего пользователя test и сделаем его владельцем базы:

template1=# create database test;
CREATE DATABASE
template1=# alter database test owner to test;
ALTER DATABASE

То же самое можно сделать и с помощью одной команды:

template1=# create database test owner=test;
CREATE DATABASE

Просмотрим имеющиеся у нас базы данных:

template1=# \l
                             List of databases
   Name    | Owner | Encoding | Collation |    Ctype    | Access privileges 
-----------+-------+----------+-----------+-------------+-------------------
 postgres  | pgsql | UTF8     | C         | ru_RU.UTF-8 | 
 template0 | pgsql | UTF8     | C         | ru_RU.UTF-8 | =c/pgsql         +
           |       |          |           |             | pgsql=CTc/pgsql
 template1 | pgsql | UTF8     | C         | ru_RU.UTF-8 | =c/pgsql         +
           |       |          |           |             | pgsql=CTc/pgsql
 test      | test  | UTF8     | C         | ru_RU.UTF-8 | 
(4 rows)

Думаю, принцип понятен. В дальнейшем руководствуемся документацией, которую можно получить с помощью команд “\h” и “\?”. Узнать подробности об определённом запросе можно следующим образом (для примера возьмём “drop user”):

template1=# \h drop user
Command:     DROP USER
Description: remove a database role
Syntax:
DROP USER [ IF EXISTS ] name [, ...]

Графические средства для управления PostgreSQL

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


Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.