Установка PostgreSQL на CentOS 7

Автор: Admin | 20.11.2014

Хаутушка по установке PostgreSQL, PgAgent и расширений на CentOS 7

Установка PostgreSQL

В первую очередь надо исключить Postgre из стандартных репов, вставив в файл /etc/yum.repos.d/CentOS-Base.repo в секции [base] и [updates] строку:

exclude=postgresql*

Затем подключить реп от разработчиков постгре и установить его менеджером пакетов:

yum localinstall http://yum.postgresql.org/9.3/redhat/rhel-7-x86_64/pgdg-centos93-9.3-1.noarch.rpm
yum install postgresql93-server

Инициализировать базу:

/usr/pgsql-9.3/bin/postgresql93-setup initdb

Включить автозапуск демона при старте системы и запустить его:

systemctl enable postgresql-9.3.service
systemctl start postgresql-9.3.service

Подключиться к базе, сменить пароль пользователя postgres и выйти:

sudo -u postgres psql
alter user postgres password 'NEWPASS';
\q

PostgreSQL установлен, но доступен только локальным приложениям. Для включения коннекта по сети необходимо раскомментировать строку и изменить значение параметра listen_addresses в файле /var/lib/pgsql/9.3/data/postgresql.conf с 'localhost' на '*'. И в файле /var/lib/pgsql/9.3/data/pg_hba.conf изменить параметр IPv4 local connections:

nano /var/lib/pgsql/9.3/data/postgresql.conf
listen_addresses = '*'
nano /var/lib/pgsql/9.3/data/pg_hba.conf
host all all 0.0.0.0/0 md5

Обязательно указать md5, иначе будет отклонять сетевые соединения, в том числе и локалхоста.

Перезапустить демон:

systemctl restart postgresql-9.3.service

Убедиться, что Postgre слушает все доступные адреса:

netstat -plan | grep 5432
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      28632/postgres      
tcp6       0      0 :::5432                 :::*                    LISTEN      28632/postgres      
unix  2      [ ACC ]     STREAM     LISTENING     53534    28632/postgres       /tmp/.s.PGSQL.5432

Теперь Postgre слушает все интерфейсы, но подключиться все-равно невозможно из-за политик фаервола. Требуется добавить правило, разрешающее подключение по указанному порту. Перед закрытием тега zone вставить строку:

nano /etc/firewalld/zones/public.xml
  <service name="postgresql"/>

И перезапустить фаервол:

systemctl restart firewalld.service

PostgreSQL установлен, работает и доступен для подключений по сети.


Установка pgAgent (тут все гораздо веселее:)

Установить и разрешить pgAgent:

yum install pgagent_93
systemctl enable pgagent_93.service

Запустить sql скрипт создания таблиц и других объектов в схеме для pgagent и запустить демон:

sudo -u postgres psql -f /usr/share/pgagent_93-3.4.0/pgagent.sql postgres
systemctl start pgagent_93.service
Job for pgagent_93.service failed. See 'systemctl status pgagent_93.service' and 'journalctl -xn' for details.

Фэйлед значит, последуем совету и посмотрим что там:

systemctl status pgagent_93.service
pgagent_93.service - PgAgent for PostgreSQL 9.3
   Loaded: loaded (/usr/lib/systemd/system/pgagent_93.service; enabled)
   Active: failed (Result: exit-code) since Сб 2014-11-22 01:28:30 NOVT; 1min 52s ago
  Process: 29664 ExecStart=/usr/bin/pgagent_93 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=217/USER)

systemd[1]: pgagent_93.service: control process exited, code=exited status=217
systemd[1]: Failed to start PgAgent for PostgreSQL 9.3.
systemd[1]: Unit pgagent_93.service entered failed state.

Смотрим service файл пгагента /etc/systemd/system/multi-user.target.wants/pgagent_93.service и видим, что демон должен стартовать от пользователя pgagent, которого в системе не оказалось. Добавить нужного пользователя и попытаться снова запустить сервис:

useradd -s /bin/false -r -M pgagent
systemctl start pgagent_93.service
systemctl status pgagent_93.service

pgagent_93.service - PgAgent for PostgreSQL 9.3
   Loaded: loaded (/usr/lib/systemd/system/pgagent_93.service; enabled)
   Active: active (running) since Сб 2014-11-22 01:45:48 NOVT; 1min 10s ago
  Process: 23629 ExecStart=/usr/bin/pgagent_93 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
 Main PID: 23630 (pgagent_93)
   CGroup: /system.slice/pgagent_93.service
           └─23630 /usr/bin/pgagent_93 -s /var/log/pgagent_93.log hostaddr=127.0.0.1 dbname=postgres user=postgres port=5432

pgagent_93[23629]: Can not open the logfile!01:46:58: Error: can't open file '/var/log/pgagent_93.log' (error 13: Permission denied)

Вроде запустилось, только нет прав писать в лог, дать возможность это делать:

chown pgagent:pgagent /var/log/pgagent_93.log
systemctl restart pgagent_93.service
systemctl status pgagent_93.service

pgagent_93.service - PgAgent for PostgreSQL 9.3
   Loaded: loaded (/usr/lib/systemd/system/pgagent_93.service; enabled)
   Active: active (running) since Сб 2014-11-22 01:50:13 NOVT; 1s ago
  Process: 23727 ExecStop=/usr/bin/kill -TERM /usr/bin/pgagent_93 (code=exited, status=1/FAILURE)
  Process: 23736 ExecStart=/usr/bin/pgagent_93 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
 Main PID: 23737 (pgagent_93)
   CGroup: /system.slice/pgagent_93.service
           └─23737 /usr/bin/pgagent_93 -s /var/log/pgagent_93.log hostaddr=127.0.0.1 dbname=postgres user=postgres port=5432

systemd[1]: Starting PgAgent for PostgreSQL 9.3...
systemd[1]: Started PgAgent for PostgreSQL 9.3.

Кажется работает, но через минуту падает и можно видеть это:

systemctl status pgagent_93.service

pgagent_93.service - PgAgent for PostgreSQL 9.3
   Loaded: loaded (/usr/lib/systemd/system/pgagent_93.service; enabled)
   Active: failed (Result: exit-code) since Сб 2014-11-22 01:50:59 NOVT; 20s ago
  Process: 23750 ExecStop=/usr/bin/kill -TERM /usr/bin/pgagent_93 (code=exited, status=1/FAILURE)
  Process: 23736 ExecStart=/usr/bin/pgagent_93 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
 Main PID: 23737 (code=exited, status=1/FAILURE)

systemd[1]: Starting PgAgent for PostgreSQL 9.3...
systemd[1]: Started PgAgent for PostgreSQL 9.3.
systemd[1]: pgagent_93.service: main process exited, code=exited, status=1/FAILURE
kill[23750]: kill: cannot find process "/usr/bin/pgagent_93"
systemd[1]: pgagent_93.service: control process exited, code=exited status=1
systemd[1]: Unit pgagent_93.service entered failed state.

Т.е. лог говорит, что PgAgent упал со статусом FAILURE, а kill после этого не может найти процесс /usr/bin/pgagent_93. Чё это вообще за нафиг?!?!
Иду посмотреть записи событий самого пгагент:

cat /var/log/pgagent_93.log

WARNING: Couldn't create the primary connection (attempt 1): Ð.Ð.Ð.Ð.Ð.:  полÑ.зоваÑ.елÑ. "postgres" не пÑ.оÑ.Ñ.л пÑ.овеÑ.кÑ. подлинноÑ.Ñ.и (Ident)
...
ERROR: Stopping pgAgent: Couldn't establish the primary connection with the database server.

Нда…Эти каракули значат «Пользователь postgres не прошел проверку подлинности» и в следствии этого пгагент не может приконнектиться к базе. В английской локализации системы ошибка выглядит так:

FATAL:  Ident authentication failed for user "postgres"

Проверяю запуск PgAgent из консоли с рекомендованным коннекшн стрингом и максимальным уровнем логирования:

/usr/bin/pgagent_93 -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres port=5432 
DEBUG: Creating primary connection
[root@localhost ~]# DEBUG: Connection Information:
DEBUG:      user         : postgres
DEBUG:      port         : 5432
DEBUG:      host         : 127.0.0.1
DEBUG:      dbname       : postgres
DEBUG:      password     : 
DEBUG:      conn timeout : 0
DEBUG: Connection Information:
DEBUG:      user         : postgres
DEBUG:      port         : 5432
DEBUG:      host         : 127.0.0.1
DEBUG:      dbname       : postgres
DEBUG:      password     : 
DEBUG:      conn timeout : 0
DEBUG: Creating DB connection: user=postgres port=5432 hostaddr=127.0.0.1 dbname=postgres
WARNING: Couldn't create the primary connection (attempt 1): fe_sendauth: no password supplied
DEBUG: Clearing all connections
DEBUG: Connection stats: total - 1, free - 0, deleted - 1

Поле пароля пустое, поэтому не пускает, попробовать с паролем:

/usr/bin/pgagent_93 -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres port=5432 password=NEWPASS
DEBUG: Creating primary connection
DEBUG: Connection Information:
DEBUG:      user         : postgres
DEBUG:      port         : 5432
DEBUG:      host         : 127.0.0.1
DEBUG:      dbname       : postgres
DEBUG:      password     : NEWPASS
DEBUG:      conn timeout : 0
DEBUG: Connection Information:
DEBUG:      user         : postgres
DEBUG:      port         : 5432
DEBUG:      host         : 127.0.0.1
DEBUG:      dbname       : postgres
DEBUG:      password     : NEWPASS
DEBUG:      conn timeout : 0
DEBUG: Creating DB connection: user=postgres port=5432 hostaddr=127.0.0.1 password=NEWPASS dbname=postgres
DEBUG: Database sanity check
DEBUG: Clearing zombies
DEBUG: Checking for jobs to run
DEBUG: Sleeping...

Есть контакт, отлично. Теперь надо сервису pgagent указать пароль для авторизации путем правки service файла:

nano /etc/systemd/system/multi-user.target.wants/pgagent_93.service 
...
# Location of database directory
Environment=DBNAME=postgres
Environment=DBUSER=postgres
Environment=DBHOST=127.0.0.1
Environment=DBPORT=5432
Environment=PASS=NEWPASS
Environment=LOGFILE=/var/log/pgagent_93.log
...
ExecStart=/usr/bin/pgagent_93 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} password=${PASS}
ExecStop=/usr/bin/kill -TERM /usr/bin/pgagent_93
...

Перечитать конфиг service файла и перезапустить демон:

systemctl daemon-reload
systemctl restart pgagent_93.service
systemctl status pgagent_93.service

pgagent_93.service - PgAgent for PostgreSQL 9.3
   Loaded: loaded (/usr/lib/systemd/system/pgagent_93.service; enabled)
   Active: active (running) since Пт 2014-11-21 20:12:12 EST; 1min 38s ago
  Process: 19550 ExecStop=/usr/bin/kill -TERM /usr/bin/pgagent_93 (code=exited, status=1/FAILURE)
  Process: 19571 ExecStart=/usr/bin/pgagent_93 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} password=${PASS} (code=exited, status=0/SUCCESS)
 Main PID: 19572 (pgagent_93)
   CGroup: /system.slice/pgagent_93.service
           └─19572 /usr/bin/pgagent_93 -s /var/log/pgagent_93.log hostaddr=127.0.0.1 dbname=postgres user=postgres port=5432 password=NEWPASS

ноя 21 20:12:12 localhost.localdomain systemd[1]: Starting PgAgent for PostgreSQL 9.3...
ноя 21 20:12:12 localhost.localdomain systemd[1]: Started PgAgent for PostgreSQL 9.3.

Запустился и приконнектился к базе, но смущает этот FAILURE от ExecStop. После удаления этой записи все заработало как надо.
Если все-таки не стартует — посмотреть есть ли значение md5 в /var/lib/pgsql/9.3/data/pg_hba.conf


Подключение экстеншенсов

При подключении расширения возникает такая ошибка:

sudo -u postgres psql
CREATE EXTENSION postgres_fdw;
ОШИБКА: не удалось открыть управляющий файл расширения "/usr/pgsql-9.3/share/extension/postgres_fdw.control": Нет такого файла или каталога

Возникает из-за того, что экстеншенсы не установлены и надо просто сделать это:

yum install postgresql-contrib

Повторная установка проходит нормально:

sudo -u postgres psql
CREATE EXTENSION postgres_fdw;
CREATE EXTENSION

На этом установка окончена.

Комментарии к посту “Установка PostgreSQL на CentOS 7

    1. admin

      С официального сайта:
      «pgAgent is a job scheduler for PostgreSQL which may be managed using pgAdmin»

      Если по-русски, то pgAgent нужен для выполнения заданий по расписанию, которые назначаются и администрируются из pgAdmin’а.

  1. ss ss

    «Теперь Postgre слушает все интерфейсы, но подключиться все-равно невозможно из-за политик фаервола. Добавить правило, разрешающее подключение по указанному порту. Перед закрытием тега zone вставить строку (удалить нижние подчерки, пришлось вставить из-за обработки вордпрессом строки как части кода):» — ?
    Так и не понял что надо добавить в фаервол

    1. admin

      Приветствую!
      Там была строка для добавления. Вордпресс таки съел ее. Поправил.

  2. gh

    !Автор — спасибо огромное! Второй день пытался сделать доступным по сети постгрю, грешил на selinux, оказывается, надо было изменения в firewalld внести.

  3. Marat

    Добрый день! Хочу заранее сказать что возможно вопрос не совсем по теме данного поста но возникла проблема и возможно тут я смогу найти решение. Сделал все как здесь описано, появилась схема pgadmin но вкладки с job`ами нет , что нужно сделать что бы она появилась (версия pgadmin 5.1 )

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *