Instalar PostgreSQL 9.4.4 no CentOS 7

O PostgreSQL é o melhor gerenciador de bancos de dados open-source na atualidade, embora um pouco mais complexo do que sistemas alternativos como o MariaDB (que substituiu o MySQL como alternativa open-source após este ser adquirido pela Oracle).

O CentOS 7.1 traz a versão 9.2.13 por padrão mas a última versão disponível no site do PostgreSQL, na data da produção deste texto, é a 9.4.4. Se a versão 9.2 atende seus objetivos, basta instalar os pacotes através do yum. Mas, se você pretende ficar com a versão mais nova, deve fazer uma instalação personalizada.

Existem duas formas de fazer a instalação:

  • A primeira é utilizando o repositório YUM do próprio PostgreSQL, que contém os RPMs com as versões mais novas para várias distribuições Linux. É o jeito mais rápido e fácil, e o mais indicado para iniciante, mas tem como desvantagem não poder personalizar configurações individuais do PostgreSQL. Se optar por esta forma de instalação, siga as instruções em PostgreSQL YUM Installation. Esta forma de instalação não será mostrada neste texto.
  • A segunda é fazendo o download do código fonte e compilando o PostgreSQL especificamente para sua distribuição Linux. É o jeito mais flexível para configurar opções para o binário gerado e o método mais indicado para usuários avançados, mas tem como desvantagem a maior complexidade para fazer todos os componentes envolvidos (PostgreSQL e suas dependências) funcionaram corretamente para a compilação. É exatamente essa forma de instalação que será detalhada neste texto.

1) Compilação e instalação:

  1. Como usuário root, instale os pré-requisitos para a compilação do código fonte do PostgreSQL (muitos já estarão instalados por padrão e alguns não são obrigatórios; aqui mostro todos os pré-requisitos, exceto os necessários para compilar a documentação; se quiser instalar uma Tcl mais nova, siga as instruções deste post e não instale a tcl e a tcl-devel no comando abaixo):
    yum install make gcc tar gzip bzip2 readline readline-devel zlib perl perl-libs perl-devel perl-ExtUtils-Embed python python-devel gettext gettext-common-devel gettext-devel gettext-libs openssl openssl-libs openssl-devel openldap openldap-devel pam pam-devel krb5-libs krb5-devel flex flex-devel bison bison-devel tcl tcl-devel libxml2 libxml2-devel libxslt libxslt-devel
  2. Como usuário normal, faça o download do código fonte do PostgreSQL 9.4.4 (ou outro mais recente que esteja em produção) diretamente em http://www.postgresql.org/ftp/source. Descompacte o arquivo.
    tar -jxvf postgresql-9.4.4.tar.bz2
  3. Como usuário normal, entre no diretório criado e execute o comando configure. Abaixo está um exemplo com todas as principais opções; se você não precisa de alguma feature, basta retirar do comando abaixo (obs.: no exemplo abaixo estou usando uma Tcl instalada que não é a padrão do CentOS):
    ./configure --prefix=/usr/local/pgsql --enable-nls --with-perl --with-python --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6.4/lib --with-openssl --with-pam --with-ldap --with-readline --with-libxml --with-libxslt
  4. Se o comando configure retornou algum erro você terá de descobrir como resolver consultando a documentação de instalação do PostgreSQL. Se tudo correu bem, execute o make world (como usuário normal) para compilar o PosrgreSQL, a documentação (HTML e man pages) e todos os módulos adicionais (contrib):
    make world
    (output da compilação omitido)
    PostgreSQL, contrib, and documentation successfully made. Ready to install.
  5. Se a mensagem final mostrada acima aparecer, você conseguiu compilar o PosrgreSQL, os módulos contrib e e documentação. Agora vamos testar a compilação executando, como usuário normal, o comando:
    make check
    (output dos testes omitido)
    =======================
     All 145 tests passed. 
    =======================
  6. Se você recebeu a mensagem de que toda a compilação passou nos testes, o PostgreSQL está pronto para ser instalado. Lembre-se que no comando configure (etapa 3) nós ajustamos o diretório de instalação do PostgreSQL para /usr/local/pgsql. Entretanto, eu não gosto de instalar diretamente nesse diretório por um motivo simles: para facilitar upgrades futuros de versões. Assim, nós vamos criar um diretório específico para a versão do PostgreSQL e vamos criar o /usr/local/pgsql como um link simbólico que aponta para o diretório específico. Agora, como usuário root, crie o diretório específico, o link simbólico e execute o make install:
    mkdir /usr/local/pgsql-9.4.4
    ln -s /usr/local/pgsql-9.4.4 /usr/local/pgsl
    make install-world
    (output da instalação omitido)
    PostgreSQL, contrib, and documentation installation complete.
  7. Agora o PostgreSQL está instalado no diretório /usr/local/pgsql-9.4.4, sendo acessado através do link simbólico /usr/local/pgsql, mas não está pronto para ser utilizado. Siga as tarefas pós-instalção agora.

2) Tarefas pós-instalação:

  1. Crie um grupo de sistema, um usuário de sistema e uma senha para administrar o PostgreSQL:
    groupadd -r postgres
    
    useradd -d /usr/local/pgsql -g postgres -r -s /bin/bash postgres
    
    passwd postgres
  2. Agora vamos ajustar as permissões:
    chown postgres:postgres /usr/local/pgsql-9.4.4 -R
    
    chmod 755 /usr/local/pgsql-9.4.4
  3. Agora, como usuário postgres, vamos acertar alguns arquivos em nosso diretório home (/usr/local/pgsql). Primeiro crie o arquivo .bash_profile (não esqueça o ponto no começo do nome do arquivo) com o seguinte conteúdo:
    # .bash_profile
    
    # Funções e aliases básicos
    if [ -f ~/.bashrc ]; then
     . ~/.bashrc
    fi
    
    
    # Configuração do ambiente
    export PATH=/usr/local/pgsql/bin:$HOME/.local/bin:$HOME/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
    export MANPATH=/usr/local/pgsql/man:$MANPATH
  4. Agora crie o arquivo .bashrc (não esqueça o ponto no começo do nome do arquivo) com o seguinte conteúdo:
    # .bashrc
    
    # Ativa definições globais
    if [ -f /etc/bashrc ]; then
     . /etc/bashrc
    fi
  5. Agora você já tem um ambiente adequado para começar a usar o PostgreSQL mas, ainda, não tem um banco de dados criado. A primeira coisa a fazer é decidir em que diretório do sistema salvar o banco de dados. Eu gosto de colocar os dados sob /var/lib/pgsql. Como usuário root, faça o seguinte:
    mkdir /var/lib/pgsql
    
    chown postgres:postgres /var/lib/pgsql
    
    chmod 750 /var/lib/pgsql
  6. Agora, como usuário postgres, vamos criar um diretório para os dados, outro para os logs, e um arquivo de log para o servidor:
    cd /var/lib/pgsql
    
    mkdir data log
    
    chmod 700 data
    
    touch log/server.log
  7. Agora precisamos inicializar o cluster do banco de dados (Database Cluster) do PostgreSQL. Eu sempre inicializo os cluster com locale=C e encoding=utf8 para permitir qualquer character set nos bancos de dados. Faça o seguinte, como usuário postgres:
    initdb --locale=C --encoding=utf8 -D /var/lib/pgsql/data
    
    (output omitido)
    
    Success. You can now start the database server using:
    
     postgres -D /var/lib/pgsql/data
    or
     pg_ctl -D /var/lib/pgsql/data -l logfile start
  8. Agora sim podemos iniciar o PostgreSQL (o comando deve ser digitado em uma única linha!):
    pg_ctl start -s -w -p /usr/local/pgsql/bin/postmaster -D /var/lib/pgsql/data -l /var/lib/pgsql/log/server.log
    
    cat /var/lib/pgsql/log/server.log 
    LOG: database system was shut down at 2015-09-25 20:52:54 BRT
    LOG: MultiXact member wraparound protections are now enabled
    LOG: autovacuum launcher started
    LOG: database system is ready to accept connections
  9. Se o log mostrou que o sistema está pronto para aceitar conexões, meus parabéns! Você compilou, instalou, configurou e iniciou o PostgreSQL no CentOS 7. Mas lembre-se: você ainda NÃO TEM UM BANCO DE DADOS para uso próprio! O PostgreSQL foi iniciado e criado com 3 bancos de dados administrativos, do sistema do próprio PostgreSQL (o banco postgres, o banco template0 e o banco template1). Como ainda temos algumas coisas para configurar antes de podermos usar o PostgreSQL, vamos parar o banco de dados (o comando deve ser digitado em uma única linha):
    pg_ctl stop -s -w -m smart -p /usr/local/pgsql/bin/postmaster -D /var/lib/pgsql/data -l /var/lib/pgsql/log/server.log
    
    cat /var/lib/pgsql/log/server.log 
    LOG: database system was shut down at 2015-09-25 20:52:54 BRT
    LOG: MultiXact member wraparound protections are now enabled
    LOG: autovacuum launcher started
    LOG: database system is ready to accept connections
    LOG: received smart shutdown request
    LOG: autovacuum launcher shutting down
    LOG: shutting down
    LOG: database system is shut dow

3) Script para o systemd:

As distribuições linux mais novas (CentOS 7, Oracle Linux 7, Red Hat Enterprise Linux 7, SuSE Enterprise Linux 12 e outras) utilizam o systemd como substituto ao antigo método init de inicialização do linux, e como substituto dos scripts de inicialização e término de serviços em /etc/init.d. Assim, precisamos criar um arquivo de serviço do systemd para podermos iniciar e parar o banco, bem como configurar a inicialização automática do PostgreSQL durante o boot e o término automático durante o shutdown.

Como usuário root, vá para dentro do diretório /etc/systemd/system/multi-user.target.wants e crie o arquivo postgresql.service com o seguinte conteúdo (atenção, os comandos maiores devem ser digitados em uma única linha):

# Arquivo de controle do PostgreSQL personalizado

[Unit]
Description=PostgreSQL 9.4.4 (instalação personalizada)
After=network.target

[Service]
Type=forking

User=postgres
Group=postgres

Environment=PGPORT=5432

Environment=PGDATA=/var/lib/pgsql/data
Environment=PGLOGFILE=/var/lib/pgsql/log/server.log
Environment=PGRUNFILE=/usr/local/pgsql/bin/postmaster
Environment=LD_LIBRARY_PATH=/usr/local/lib/tcl8.6.4/lib:/usr/local/pgsql/lib:$LD_LIBRARY_PATH
Environment=PATH=/usr/local/lib/tcl8.6.4/bin:/usr/local/pgsql/bin:$PATH

# StandardOutput=syslog

# Desabilita OOM kill no postmaster
OOMScoreAdjust=-1000

ExecStart=/usr/local/pgsql/bin/pg_ctl start -s -w -p ${PGRUNFILE} -D ${PGDATA} -t 300 -l ${PGLOGFILE}
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -w -m smart -l ${PGLOGFILE}
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s

# Tempo de timeout para início/shutdown
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Agora vamos dar um reload do daemon do systemd para que o arquivo de controle acima seja lido. Ainda como root, execute o seguinte comando:

systemctl daemon-reload

E agora é a hora da verdade: vamos testar nosso novo serviço de inicialização e shutdown do PostgreSQL, como root:

systemctl start postgresql.service

tail /var/lib/pgsql/log/server.log
(output omitido)
LOG: shutting down
LOG: database system is shut down
LOG: database system was shut down at 2015-10-22 15:04:18 BRST
LOG: MultiXact member wraparound protections are now enabled
LOG: database system is ready to accept connections
LOG: autovacuum launcher started

systemctl stop postgresql.service

tail /var/lib/pgsql/log/server.log
(output omitido)
LOG: MultiXact member wraparound protections are now enabled
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
LOG: received smart shutdown request
LOG: autovacuum launcher shutting down
LOG: shutting down
LOG: database system is shut down

systemctl start postgresql.service

systemctl status postgresql.service
postgresql.service - PostgreSQL 9.4.4 (instalação personalizada)
 Loaded: loaded (/etc/systemd/system/multi-user.target.wants/postgresql.service)
 Active: active (running)
(... restante do output omitido ...)

Como visto acima o systemd já está controlando adequadamento o PostgreSQL e cuidando da inicialização/término automático durante o boot do sistema.

4) Instalando linguagens procedurais:

Para a criação de funções, procedures e triggers no PostgreSQL precisamos de instalar pelo menos uma linguagem procedural no banco de dados template1 (que é o template a partir do qual, normalmente, todos os bancos de dados dos usuários são criados). A linguagem padrão é a PL/pgSQL, mas existem outras, como a PL/Perl, a PL/Python e a PL/Tcl.

Inicialmente, vamos ver quais as linguagens procedurais instaladas. Como usuário postgres, dê o seguinte comando:

$ createlang -l template1
Procedural Languages
    Name | Trusted? 
---------+----------
 plpgsql | yes

Conforme ilustrado acima, somente a PL/pgSQL está instalada no banco de dados template1. Para instalar a PL/Perl e a PL/Tcl, faça o seguinte:

$ createlang plperl template1
$ createlang pltcl template1
$ createlang -l template1
Procedural Languages
    Name | Trusted? 
---------+----------
 plpgsql | yes
 plperl  | yes
 pltcl   | yes

Conforme ilustrado acima agora o template1 já tem as 3 linguagens procedurais mais importantes: PL/pgSQL, PL/Perl e PL/Tcl. Note que essas linguagens são marcadas como “Trusted”, o que significa que as funções, triggers e procedures criadas nessas linguagens não permitem o acesso às funções internas do PostgreSQL e/ou do sistema de arquivos, sendo consideradas seguras para uso por todos os usuários (não permitem que usuários acessem dados ou ojetos que de outra forma eles não teriam acesso). Qualquer usuário pode criar código usando essas linguagens.

Existem versões “Untrusted” da linguagem PL/Perl e PL/Tcl. Também existe uma versão “Untrusted” da PL/Python (não existe uma versão Trusted da PL/Python ainda). Essas linguagens “Untrusted” permitem que o usuário acesse mecanismos internos do banco de dados e/ou do sistema subjacente, não sendo consideradas de uso seguro por todos os usuários. Como são linguagens “Untrusted”, somente o usuário administrador do PostgreSQL pode criar código nessas linguagens.

Para instalar as versões “Untrusted” das linguagens procedurais, faça o seguinte:

$ createlang plperlu template1
$ createlang pltclu template1
$ createlang plpythonu template1
$ createlang -l template1
 Procedural Languages
    Name   | Trusted? 
-----------+----------
 plpgsql   | yes
 plperl    | yes
 pltcl     | yes
 plperlu   | no
 pltclu    | no
 plpythonu | no

Conforme ilustrado acima o banco template1 agora está com todas as principais linguagens procedurais instaladas, tando as “Trusted” quanto as “Untrusted”.

5) Aumentando a segurança:

Caso você não tenha notado o usuário postgres tem acesso garantido ao PostgreSQL e nem mesmo uma senha é solicitada (por isso você instalou as linguagens procedurais diretamente).

Isso ocorre pois o PostgreSQL aceita conexões locais pelo método de autenticação “trust”. Para aumentar a segurança, temos que criar uma senha para o usuário postgres e depois alterar a configuração de acesso do PostreSQL.

Primeiro vamos criar uma senha para o usuário postgres. Siga o exemplo abaixo:

[postgres@host ~]$ psql 
psql (9.4.4)
Type "help" for help.

postgres=# alter role postgres
postgres-# with encrypted password 'senha';
ALTER ROLE
postgres=# \q

[postgres@host ~]$

Agora tente entrar solicitando explicitamente a senha:

[postgres@host ~]$ psql -W
Password: senha
psql (9.4.4)
Type "help" for help.

postgres=# \q

[postgres@host ~]$

Pronto, agora que você já configurou uma senha para o usuário postgres, vamos alterar o mecanismo de acesso ao PostgreSQL. Edite o arquivo /var/lib/pgsql/data/pg_hba.conf e alterar as linhas de acesso para algo mais seguro, como por exemplo:

# TYPE   DATABASE   USER   ADDRESS        METHOD
local    all        all                   md5
host     all        all    127.0.0.1/32   md5
host     all        all    ::1/128        md5

O exemplo acima está permitindo conexões ao PostgreSQL via socket locais (type local) ou através dos endereços IPv4 e IPv6 de localhost (127.0.0.1/132 e ::1/128). Todas essas conexões exigem o uso do método de autenticação md5, que solicita uma senha criptografada. Note que a configuração acima não permite que o PostgreSQL aceite conexões de outros hosts: só aceita conexões originadas dentro do próprio host do PostgreSQL (localhost). Depois veremos como liberar conexões a partir de outros hosts, mas por enquanto, essa segurança está adequada.

Para fazer o PostgreSQL ler as novas configurações do arquivo pg_hba.conf, temos que dar um restart como usuário root:

[root@host ~]# systemctl restart postgresql.service

Agora, como usuário postgres, tente acessar o PostgreSQL: será solicitada uma senha como no exemplo abaixo:

[postgres@host data]$ psql
Password: senha
psql (9.4.4)
Type "help" for help.

postgres=#

6) Alterando configurações do PostgreSQL para o português:

O PostgreSQL até agora está configurado com os padrões da língua inglesa. Para alterar os principais parâmetros para o português, edite o arquivo /var/lib/pgsql/data/postgresql.conf e deixe os seguintes parâmetros conforme o exemplo abaixo:

log_timezone = 'Brazil/East'

datestyle = 'iso, dmy'

timezone = 'Brazil/East'

lc_monetary = 'pt_BR.UTF-8'

lc_numeric = 'pt_BR.UTF-8'

lc_time = 'pt_BR.UTF-8'

default_text_search_config = 'pg_catalog.portuguese'

Para que as alterações tenham efeito, será necessário reiniciar o PostgreSQL como usuário root:

[root@host ~]# systemctl restart postgresql.service

7) Em resumo

Até agora você configurou, compilou e instalou o código fonte para ficar com o PostgreSQL 9.4.4 em seu CentOS 7.

Além disso criou um usuário postgres e diretórios padronizados para a instalação.

Instalou linguagens procedurais no banco template1 e aumentou a segurança das conexões ao exigir somente conexões com senha criptografadas.

Você também criou um arquivo para o systemd iniciar e parar o PostgreSQL de forma automática, e via usuário root.

Também configurou os principais parâmetros de linguagem para o português.

Nesse momento você já tem uma instalação do PostgreSQL totalmente funcionante e pronta para uso!

O único porém é que a configuração atual de nosso PostgreSQL só aceita conexões de localhost. Se isso é tudo que você precisa, meus parabéns! Trabalho feito!

Por outro lado, se você precisa que seu PostgreSQL aceite conexões de outros hosts (da mesma rede ou até via internet, por exemplo), teremos que alterar as configurações, criar conexões SSL por segurança e alterar o firewall do CentOS. Isso será visto em outro post. Até lá!

Conexão PHP com o PostgreSQL (e o MySQL) no CentOS 7

Após a instalação do PHP, PostgreSQL e MySQL no CentOS 7, ao tentar fazer um simples teste de conexão do PHP com o PostgreSQL, estava recebendo a seguinte mensagem de erro:

Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Permission denied Is the server running on host “localhost” (127.0.0.1) and accepting TCP/IP connections on port 5432?

O código de teste foi o seguinte:

<?php

 $casa = "localhost";
 $banco = "nome_do_banco";
 $porta = 5432;
 $usuario = "nome_do_usuario";
 $senha = "senha_do_usuario";

 $conexao = pg_connect("host=$casa dbname=$banco port=$porta user=$usuario password=$senha");

 if (! $conexao ) {
 print "<h3>Não foi possível conectar ao PostgreSQL.</h3><br />";
 pg_errormessage();
 } else {
 pg_close($conexao);
 print "<h3>Conexão OK.</h3>";
 }

?>

Eu já tinha ajustado as configurações do pg_hba.conf e postgresql.conf e, mesmo assim, o PHP não conseguia estabelecer uma conexão com o PostgreSQL. Por segurança, chequei as regras do firewall e estavam todas corretas também.

Aí me lembrei: o SELinux! Será que o SELinux estaria bloqueando por padrão as conexões ao banco de dados? Bem, o comando abaixo (como root) retorna as configurações do SELinux para os servidores web:

# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_dbus_sssd --> off
httpd_dontaudit_search_dirs --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> on
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off

Pronto, identificamos o problema! A propriedade httpd_can_network_connect_db está em “off” (e a httpd_can_network_connect também) e o SELinux está impedindo a conexão do PHP com o PostgreSQL. Para permitir que o SELinux deixe o PHP se conectar ao PostgreSQL (e ao MySQL), faça o seguinte (como root):

setsebool -P httpd_can_network_connect_db on
setsebool -P httpd_can_network_connect on

Agora o Apache/PHP já consegue se conectar aos bancos de dados!

Instalação do PostgreSQL no CentOS 7

Antes de fazer qualquer coisa, tenha certeza de que o sistema está atualizado:

# yum check-update
# yum

Agora, para instalar o PostgreSQL no CentOS 7, siga os passos abaixo.

1) Instalação do PostgreSQL:

Depois que o sistema estiver atualizado, como root, instale o PostgreSQL:

# yum install postgresql-server postgresql-pltcl postgresql-plpython postgresql-plperl postgresql-contrib postgresql-devel postgresql-docs postgresql postgresql-libs postgresql-odbc postgresql-upgrade

O comando acima instalará o servidor do PostgreSQL, as languages PL/TCL, PL/Phyton e PL/Perl, os pacotes adicionais do repositório contrib, as bibliotecas devel, a documentação, bibliotecas adicionais e o cliente de linha de comando. Obviamente você NÃO PRECISA instalar tudo isso, instale somente o que você realmente precisa.

Se quiser que uma instalação Apache/PHP instalada no mesmo host acesse o PostgreSQL, instale também o seguinte pacote:

# yum install php-pgsql

O PostgreSQL será instalado em /var/lib/pgsql e o usuário postgres será criado.

2) Inicialização do cluster do PostgreSQL:

Segure o teclado e NÃO INICIE o PostgreSQL ainda pois não geramos nenhum cluster de banco de dados ainda. Se você tentar iniciar o banco de dados receberá uma bela mensagem de erro.

No CentOS 7 existe um script que deve ser rodado como root para inicializar o cluster do PostgreSQL: /usr/bin/postgresql-setup.

A documentação do CentOS é um pouco falha sobre este script, pois não informa se é possível personalizar a inicialização sem alterar o script. Por segurança eu faço uma cópia desse script e modifico a linha específica de inicialização do cluster para alterar o locale e o encoding do cluster. Faça isso:

Altere a linha original, disso:

# Initialize the database
 initdbcmd="$PGENGINE/initdb --pgdata='$PGDATA' --auth='ident'"

Para isso:

# Initialize the database
initdbcmd="$PGENGINE/initdb --locale=C --encoding=utf8 --pgdata='$PGDATA' --auth='ident'"

Agora basta rodar o script, como root:

# postgresql-setup initdb

Agora você tem um cluster de banco de dados em /var/lib/pgsql/data e já pode iniciar o PostgreSQL. Faça isso, como root:

# systemctl enable postgresql.service
# systemctl start postgresql.service

Com os comandos acima você informou ao CentOS que é para iniciar o PostgreSQL durante o boot do sistema e iniciou imediatamente o banco de dados.

3) Outros ajustes no PostgreSQL:

Eu gosto de instalar outras “languages” no template de banco de dados para permitir que desenvolvedores utilizem essas languages para programar procedures, funções, etc. Como usuário postgres, faça isso:

# su - postgres
$ createlang plpgsql template1
$ createlang pltcl template1
$ createlang plperl template1
$ createlang plpythonu template1
$ createlang -l template1

Agora vamos alterar algumas configurações padronizadas para uso no Brasil. Edite o arquivo /var/lib/pgsql/data/postgresql.conf e modifique as seguintes variáveis para:

listen_addresses = 'localhost, <IP do host, se necessário>'

log_timezone = 'Brazil/East'

datestyle = 'iso, dmy'

timezone = 'Brazil/East'

lc_monetary = 'pt_BR.UTF-8'

lc_numeric = 'pt_BR.UTF-8'

lc_time = 'pt_BR.UTF-8'

default_text_search_config = 'pg_catalog.portuguese'

Agora crie uma senha para o usuário postgres acessar o banco de dados. Como usuário postgres, entre na linha de comando do PostgreSQL e crie uma senha (em vermelho está o que você deve digitar na linha de comando do psql):

$ psql
psql (9.2.13)
Type "help" for help.

postgres=# ALTER ROLE postgres
postgres-# ENCRYPTED PASSWORD '<senha>';
ALTER ROLE
postgres=# \q

$

Agora você precisa editar o arquivo de permissões de acesso do PostgreSQL e exigir uma senha para a conexão dos usuários. Edite o arquivo /var/lib/pgsql/data/pg_hba.conf e deixe as configurações do seguinte modo:

# "local" is for Unix domain socket connections only
local     all     all                      md5
#local    all     all                      peer

# IPv4 local connections:
host      all     all     127.0.0.1/32     ident

# IPv6 local connections:
host     all     all     ::1/128          ident

# Allow replication connections from localhost, by a user with the
# replication privilege.
#local    replication     postgres               peer
#host     replication     postgres  127.0.0.1/32 ident
#host     replication     postgres  ::1/128      ident

Para aplicar todas as alterações, reinicie o PostgreSQL, como root:

# systemctl restart postgresql.service

Para acessar o PostgreSQL, como usuário postgres, agora será obrigatório a senha:

# psql -U postgres
Password for user postgres: <digite a senha aqui>
psql (9.2.13)
Type "help" for help.

postgres=#

Outros ajustes podem ser feitos posteriormente, de acordo com suas necessidades.