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