Учебно-методические материалы для студентов кафедры АСОИУ

Установка и базовая настройка PostgreSQL

PostgreSQL — свободная (лицензия BSD) система управления базами данных. По своим возможностям сопоставима с проприетарными СУБД корпоративного уровня. Поддерживает БД практически неограниченного размера, представляет надёжные механизмы транзакций и репликации и расширяемую систему встроенных языков программирования.

PostgreSQL

PostgreSQL реализована для множества платформ, включая AIX, различные BSD-системы, HP-UX, IRIX, Linux, Mac OS X, Solaris/OpenSolaris, Tru64, QNX, а также для Microsoft Windows. В различных реализациях PostgreSQL есть некоторые особенности, связанные с установкой и настройкой. Я столкнулся с ними в OpenSuSE Linux версий 11.3 и 12.2, когда ставил Postgres, чтобы ознакомиться с возможностями этой СУБД.

Установка PostgreSQL

Поскольку речь идет об OpenSuSE, то процедура установки PostgreSQL — типовая для rpm-based дистрибутивов Linux (в примере использованы OpenSuSE 12.2 и PostgreSQL 9.2, на OpenSuSE 11.3 и PGSQL 8.4 тоже работает). Я предпочитаю zypper:

aag@stilo:~> sudo zypper in postgresql postgresql-server

Если установка прошла успешно, то ставим pgsql-сервер в автозагрузку на 3 и 5 уровнях:

aag@stilo:~> sudo /sbin/chkconfig postgresql -s 35 

Стартуем сервер:

aag@stilo:~> sudo /sbin/service postgresql start 

Подключение к серверу

Попробуем подключиться к серверу PostgreSQL с помощью консольного клиента (psql --help или man psql):

aag@stilo:~> psql
psql: ВАЖНО: роль "aag" не существует

Так, нахрапом не вышло, будем брать измором. Смотрим документацию:

...In order to bootstrap the database system, a freshly initialized system always contains one predefined role. This role is always a "superuser", and by default (unless altered when running initdb) it will have the same name as the operating system user that initialized the database cluster. Customarily, this role will be named postgres. In order to create more roles you first have to connect as this initial role..

ОК. Пробуем подключиться как пользователь postgres (системный пользователь от имени которого запускается pgsql-сервер, сразу после установки это единственный пользователь СУБД, без пароля, но с правами администратора БД).

aag@stilo:~> psql -U postgres -w
psql: ВАЖНО: пользователь "postgres" не прошёл проверку подлинности (Peer)

Снова неудача... Пробуем сформировать окружение для postgres:

aag@stilo:~> su -l postgres
Пароль: жмем Enter — пароля ведь нет...
su: неправильный пароль

Еще несколько попыток запустить psql от имени postgres в различных комбинациях su и sudo, найденных на просторах Интернет, также не привели к успеху.

Размышляя о возможных причинах я пришел к выводу, что проблема в SELinux и настройках входа в систему (у меня установлен автоматический вход и выполнение административных задач через sudo). Чтобы не изменять системную конфигурацию, пробуем явно переключиться под root'а, потом зайти в сеанс postgres и запустить psql:

aag@stilo:~> su -l root
Пароль: пароль aag:~> # su -l postgres
postgres@stilo:~> psql
psql (9.2.3)
Введите "help", чтобы получить справку.
postgres=# 

«Ура-а-а-а!!! Заработало!!!»© Теперь, попав в консоль psql, можно выполнять необходимые действия (управление СУБД, отправку SQL-запросов).

postgres=# help
Вы используете psql — интерфейс командной строки к PostgreSQL.
Азы: \copyright — условия распространения
\h — справка по операторам SQL
\? — справка по командам psql
\g или ; в конце строки — выполнение запроса
\q — выход
postgres=# \q 

Еще немного подумав, делаем:

aag:~> # sudo passwd postgres

Обычно, чтобы сгенерировать пароль в linux я использую pwgen, но в данном случае стойкость пароля была не критичной. CrackLib поругался, но принял незатейливую алфавитно-цифровую комбинацию и теперь, задав пароль пользователю postgres, можно не лезть в сеанс root'а:

aag@stilo:~> su postgres -c psql
Пароль: Тот пароль, который задали psql (9.2.3)
Введите "help", чтобы получить справку.
postgres=# 

Снова читаем документацию в той части, которая относится к настройке аутентификации клиентов и находим там auth-method: trust. Он разрешает безоговорочное подключение к серверу PostgreSQL любому зарегистрированному пользователю. Это не есть хорошо для production-сервера, но у меня-то другая цель — ознакомительная. Поэтому открываем в текстовом редакторе файл /var/lib/pgsql/data/pg_hba.conf, находим таблицу с правилами (у меня такая):

# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
...

И изменяем значения peer и ident (md5, password, etc...) на trust:

# TYPE DATABASE USER 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
...

Рестартуем сервер и пробуем подключиться:

aag@stilo:~> sudo /sbin/service postgresql restart
aag@stilo:~> psql -U postgres
psql (9.2.3)
Введите "help", чтобы получить справку.
postgres=# 

«Можно оправиться и закурить»©... Дальше — проще. Задать пароль администратору можно из консоли psql:

aag@stilo:~> psql -U postgres
...
postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
...

В принципе, теперь нужно бы вернуть настройки метода авторизации в файле pg_hba.conf (заменить trust на ident или другой, попробуйте сами).

Создание нового пользователя (роли, в терминах PGSQL) из консоли psql:

postgres=# CREATE USER johndoe WITH password ‘strongpassword’;

Другой способ интерактивный, с помощью команды createuser:

aag@stilo:~> /usr/local/pgsql/bin/createuser johndoe
Shall the new role be a superuser? (y/n) n # Вот оно как!
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE

Создание базы данных:

postgres=# CREATE DATABASE jddb WITH OWNER johndoe;

или так:

aag@stilo:~> /usr/local/pgsql/bin/createdb jddb -O johndoe
CREATE DATABASE

Удаленный доступ к PostgreSQL

По умолчанию сервер PostgreSQL не принимает подключения с внешних хостов, это сделано по соображениям безопасности. Чтобы разрешить управление удаленным сервером, нужно, во-первых, добавить записи, которые управляют доступом из нужных сетей в файл pg_hba.conf:

...
# TYPE DATABASE USER 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
host all all 192.168.1.0/24 trust
...

Во-вторых, изменить сетевые настройки в файле /var/lib/pgsql/data/postgresql.conf. Ищем строку listen_addresses='localhost' и меняем ее на listen_addresses='*' (все сетевые интерфейсы, либо указываем ip-адрес конкретного). При необходимости можно сменить номер входящего порта в директиве port (по умолчанию — 5432).

Теперь пробуем перезапустить сервер и проверить его работу:

aag@stilo:~> sudo /sbin/service postgresql restart
aag@stilo:~> psql -h trashbox.local -U postgres
psql (9.2.3)
Введите "help", чтобы получить справку.
postgres=# ...

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

CC-BY-CA Анатольев А.Г., 25.11.2013