Заметка написана для тех, кто первый раз встречается с 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 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 ранее.
Изначально сервер сконфигурирован так, что любые подключения возможны с локальной машины без пароля. Конечно, это не очень безопасно, поэтому первое, что сделаем, ограничим доступ к серверу без пароля.
Есть 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
Несмотря на всю мощь командной строки для тех, кто постоянно не занимается базами данных учить кучу команд просто нецелесообразно. В таких случаях могут помочь графические программы. Вот несколько из них:
phpPgAdmin – как видно из названия, написана на PHP, т.е. удобна в тех случаях, когда с базой работает веб-приложение. Для работы требуется любой веб-сервер с поддержкой PHP.
pgAdmin – кроссплатформенное приложение, написанное на C++. Поддерживает множество платформ: FreeBSD, Linux, Mac OS, Windows. Пользователи FreeBSD могут установить приложение из портов: /usr/ports/databases/pgadmin3/.