Como instalar o PostgreSQL no Linux Red Hat e derivados

O Linux Red Hat tem forte presença no mercado corporativo, sendo uma ótima opção para aplicações dos mais variados tipos: ambientes físicos e virtuais, nuvens privadas e públicas. É uma opção muito comum para pessoas que querem um suporte direto do fornecedor da distribuição. Entre as distribuições derivadas temos o CentOS, o qual escolhemos utilizar neste tutorial. Lembrando que todos os procedimentos serão feitos via shell.

Então, neste artigo vamos ver:

  • Instalação com pacotes nativos da distribuição;
  • Remoção da instalação;
  • Instalação com pacotes do repositório PGDG;
  • Destino de arquivos;
  • Serviços e processos;
  • Gerenciamento do cluster;
  • Instalação de mais de uma versão ao mesmo tempo;
  • Instalação em diretório/partição alternativa.

Instalação com pacotes nativos

Nesta primeira abordagem, faremos a instalação com pacotes disponibilizados pela própria distribuição, ou seja, uma versão PostgreSQL estável que foi escolhida para ser nativa desse sistema de acordo com a data de lançamento da versão do Red Hat (ou derivado) em uso. Como dito anteriormente, estamos usando CentOS na versão 9, já que é um sistema derivado do Red Hat. Para essa versão, o PostgreSQL nativo disponível na data em que este artigo foi escrito era o da versão 13. Optamos por instalá-lo com acesso de superusuário/root, mas também é possível rodar os comandos citados complementando com sudo no início.

Este não é o método predileto de instalação do PostgreSQL, mas vamos demonstrar a sua execução brevemente, apenas como referência, principalmente sobre como desfazer isso para fazer do jeito ideal, utilizando o repositório do PGDG.

Como boa prática, podemos começar qualquer instalação atualizando todos os pacotes do sistema, para termos acesso às versões mais recentes deles:

dnf update.

Agora, vamos de fato iniciar a instalação com o comando abaixo:

dnf install postgresql-server
Red Hat shell: instalação do pacote “postgresql”
# dnf install postgresql-server
Last metadata expiration check: 0:00:53 ago on Fri 16 Feb 2024 03:19:59 PM UTC.
Dependencies resolved.
=====================================================================================
 Package                   Architecture    Version         Repository        Size
=====================================================================================
Installing:
 postgresql-server          x86_64         13.11-1.el9     appstream         5.7 M
Installing dependencies:
 postgresql                 x86_64         13.11-1.el9     appstream         1.6 M
 postgresql-private-libs    x86_64         13.11-1.el9     appstream         135 k

Transaction Summary
=====================================================================================
Install  3 Packages

Total download size: 7.5 M
Installed size: 29 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): postgresql-private-libs-13.11-1.el9.x86_64.rpm    900 kB/s | 135 kB     00:00
(2/3): postgresql-13.11-1.el9.x86_64.rpm                 7.7 MB/s | 1.6 MB     00:00
(3/3): postgresql-server-13.11-1.el9.x86_64.rpm           19 MB/s | 5.7 MB     00:00
-----------------------------------------------------------------------------------------
Total                                                     12 MB/s | 7.5 MB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                 1/1
  Installing       : postgresql-private-libs-13.11-1.el9.x86_64                      1/3
  Installing       : postgresql-13.11-1.el9.x86_64                                   2/3
  Running scriptlet: postgresql-server-13.11-1.el9.x86_64                            3/3
  Installing       : postgresql-server-13.11-1.el9.x86_64                            3/3
  Running scriptlet: postgresql-server-13.11-1.el9.x86_64                            3/3
  Verifying        : postgresql-13.11-1.el9.x86_64                                   1/3
  Verifying        : postgresql-private-libs-13.11-1.el9.x86_64                      2/3
  Verifying        : postgresql-server-13.11-1.el9.x86_64                            3/3

Installed:
  postgresql-13.11-1.el9.x86_64            postgresql-private-libs-13.11-1.el9.x86_64
  postgresql-server-13.11-1.el9.x86_64
Complete!

Depois de rodar o comando, você precisará confirmar a instalação com “y” (yes) e então já será possível observar os downloads e suas barras de carregamento, e com isso serão instalados os pacotes “postrgesql”, “postegresql-server” e “postgresql-private-libs”, que contêm respectivamente o cliente, o servidor e bibliotecas de uso interno do PostgreSQL. Como são divididos em pacotes, é possível instalar apenas o cliente se o uso for só para acessar um outro servidor, mas como vimos, na instalação do pacote do servidor, já vem tudo junto. Para instalar diferentes versões, utilizaremos o repositório PGDG, do qual falaremos mais adiante.

Para conferir os três pacotes que foram instalados, é só utilizar o seguinte comando:

rpm -qa | grep postgresql
Red Hat shell: pacotes “postgresql”
# rpm -qa | grep postgresql
postgresql-private-libs-13.11-1.el9.x86_64
postgresql-13.11-1.el9.x86_64
postgresql-server-13.11-1.el9.x86_64

Após a instalação, vamos habilitar a inicialização automática junto com a inicialização do sistema, desta forma:

systemctl enable postgresql-<versão>
Red Hat shell: habilitando inicialização automática
# systemctl enable postgresql-16
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-16.service → /usr/lib/systemd/system/postgresql-16.service.

No Red Hat e derivados, é necessário iniciar o serviço do PostgreSQL manualmente, que, por padrão, também usa a porta 5432, e isso pode ser feito com o seguinte comando:

systemctl start postgresql-16
Red Hat shell: iniciando serviço postgresql
# service postgresql start
Redirecting to /bin/systemctl start postgresql-16.service

Agora que já instalamos e inicializamos o serviço, podemos acessar o shell do PostgreSQL (psql):

Red Hat shell: test connection
su - postgres
psql

Pronto! Você já pode criar sua base, tabelas etc. e gerenciar seu banco de dados. 

Remoção da instalação

Para remover a instalação, podemos usar este comando, que seria equivalente ao purge do Debian, já que, além de remover a instalação, também limpa arquivos e dados relacionados ao pacote:

dnf remove postgresql
Red Hat shell: remoção completa do PostgreSQL
# dnf remove postgresql
Dependencies resolved.
=========================================================================================
 Package                        Architecture    Version         Repository        Size
=========================================================================================
Removing:
 postgresql                     x86_64          13.11-1.el9     @appstream       5.7 M
Removing dependent packages:
 postgresql-server              x86_64          13.11-1.el9     @appstream        23 M
Removing unused dependencies:
 postgresql-private-libs        x86_64          13.11-1.el9     @appstream       327 k
Transaction Summary
=========================================================================================
Remove  3 Packages

Freed space: 29 M
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                 1/1
  Running scriptlet: postgresql-server-13.11-1.el9.x86_64                            1/3
  Erasing          : postgresql-server-13.11-1.el9.x86_64                            1/3
  Running scriptlet: postgresql-server-13.11-1.el9.x86_64                            1/3
  Erasing          : postgresql-13.11-1.el9.x86_64                                   2/3
  Erasing          : postgresql-private-libs-13.11-1.el9.x86_64                      3/3
  Running scriptlet: postgresql-private-libs-13.11-1.el9.x86_64                      3/3
  Verifying        : postgresql-13.11-1.el9.x86_64                                   1/3
  Verifying        : postgresql-private-libs-13.11-1.el9.x86_64                      2/3
  Verifying        : postgresql-server-13.11-1.el9.x86_64                            3/3

Removed:
  postgresql-13.11-1.el9.x86_64            postgresql-private-libs-13.11-1.el9.x86_64
  postgresql-server-13.11-1.el9.x86_64

Complete!

Após remover, se consultarmos os pacotes com o comando mostrado anteriormente, veremos que não há necessidade de especificar pacote por pacote, pois todos eles serão desinstalados, uma vez que há ausência de saída. Para evitar isso, caso deseje desinstalar apenas um pacote (o de servidor, por exemplo), você deve fazer da seguinte maneira:

dnf remove postgresql-server --setopt=clean_requirements_on_remove=false
Red Hat shell: remoção parcial do PostgreSQL, apenas pacote do servidor
# dnf remove postgresql-server --setopt=clean_requirements_on_remove=false
Dependencies resolved.
=========================================================================================
 Package                 Architecture     Version          Repository          Size
=========================================================================================
Removing:
 postgresql-server       x86_64           13.11-1.el9      @appstream          23 M

Transaction Summary
=========================================================================================
Remove  1 Package

Freed space: 23 M
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                 1/1
  Running scriptlet: postgresql-server-13.11-1.el9.x86_64                            1/1
  Erasing          : postgresql-server-13.11-1.el9.x86_64                            1/1
  Running scriptlet: postgresql-server-13.11-1.el9.x86_64                            1/1
  Verifying        : postgresql-server-13.11-1.el9.x86_64                            1/1

Removed:
  postgresql-server-13.11-1.el9.x86_64
Complete!

Consultando, conseguimos ver os pacotes restantes:

Red Hat shell: pacotes “postgresql”
# rpm -qa | grep postgresql
postgresql-private-libs-13.11-1.el9.x86_64
postgresql-13.11-1.el9.x86_64

Instalação com pacotes do repositório PGDG

Esta é a maneira mais apropriada de instalar o PostgreSQL no seu Red Hat e derivados, pois oferece mais liberdade quanto à escolha de uma versão específica, já que vamos utilizar o repositório oficial da comunidade PostgreSQL (conhecida como PGDG, ou PostgreSQL Global Development Group). Antes de fazer a instalação utilizando o repositório do PGDG, você deve remover completamente qualquer pacote do PostgreSQL nativo da sua distribuição, como mostramos anteriormente, para só depois iniciar a instalação a seguir.

Para fazer isso, podemos começar acessando a página oficial de download do PostgreSQL para Red Hat e derivados, de onde iremos consultar o endereço desse repositório e o passo a passo de como instalá-lo para posteriormente instalar o PostgreSQL.

Segue trecho da página onde encontramos essas informações, após selecionar a versão desejada (escolhemos a mais recente: 16),  a plataforma (estamos usando CentOS) e a arquitetura do sistema operacional:

postgresql.org: tutorial de download Red Hat e derivados
# Install the repository RPM:
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Disable the built-in PostgreSQL module:
sudo dnf -qy module disable postgresql
# Install PostgreSQL:
sudo dnf install -y postgresql16-server
# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16

É importante sempre consultar o script no site oficial do PostgreSQL para pegar a versão atualizada do script. Aqui, vamos realizar cada etapa passo a passo para entender melhor o processo e observar cada comando sendo executado individualmente. Para facilitar, vamos continuar rodando todos os comandos logados com o usuário root. 

O primeiro passo é adicionar os sistema o repositório PGDG, que vamos usar para instalar o PostgreSQL:

dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Red Hat shell: instalação do repositório PGDG
# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Last metadata expiration check: 0:00:06 ago on Mon 19 Feb 2024 12:59:40 PM UTC.
pgdg-redhat-repo-latest.noarch.rp  15 kB/s |  11 kB     00:00
Dependencies resolved.
================================================================== 
Package             Arch      Version         Repository      Size
==================================================================
Installing:
 pgdg-redhat-repo   noarch    42.0-38PGDG     @commandline    11 k

Transaction Summary
==================================================================
Install  1 Package

Total size: 11 k
Installed size: 15 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                          1/1
  Installing       : pgdg-redhat-repo-42.0-38PGDG.noarch      1/1
  Verifying        : pgdg-redhat-repo-42.0-38PGDG.noarch      1/1

Installed:
  pgdg-redhat-repo-42.0-38PGDG.noarch

Complete!

Após isso, no segundo passo, vamos desativar o uso dos pacotes do PostgreSQL nativos da distribuição para evitar conflitos durante a instalação, utilizando o seguinte comando:

dnf -qy module disable postgresql
Red Hat shell: desativação do módulo PostgreSQL
# dnf -qy module disable postgresql
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL

Após isso, podemos instalar o PostgreSQL já na versão desejada (escolhemos a mais recente, versão 16):

dnf install -y postgresql16-server
Red Hat shell: instalação do PostgreSQL na versão 16
# dnf install -y postgresql16-server
DigitalOcean Droplet Agent         47 kB/s | 3.3 kB     00:00
Dependencies resolved.
===================================================================
 Package                 Arch     Version            Repo      Size
===================================================================
Installing:
 postgresql16-server     x86_64   16.2-1PGDG.rhel9   pgdg16   6.8 M
Installing dependencies:
 lz4                     x86_64   1.9.3-5.el9        baseos    59 k
 postgresql16            x86_64   16.2-1PGDG.rhel9   pgdg16   1.7 M
 postgresql16-libs       x86_64   16.2-1PGDG.rhel9   pgdg16   331 k

Transaction Summary
==================================================================
Install  4 Packages
Total download size: 8.9 M
Installed size: 39 M
Downloading Packages:
(1/4): lz4-1.9.3-5.el9.x86_64.rpm  185 kB/s |  59 kB     00:00
(2/4): postgresql16-libs-16.2-1PG  275 kB/s | 331 kB     00:01
(3/4): postgresql16-16.2-1PGDG.rh  1.1 MB/s | 1.7 MB     00:01
(4/4): postgresql16-server-16.2-1  3.1 MB/s | 6.8 MB     00:02
------------------------------------------------------------------
Total                              3.2 MB/s | 8.9 MB     00:02
PostgreSQL 16 for RHEL / Rocky /   2.4 MB/s | 2.4 kB     00:00
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                          1/1
  Installing       : postgresql16-libs-16.2-1PGDG.rhel9.x86   1/4
  Running scriptlet: postgresql16-libs-16.2-1PGDG.rhel9.x86   1/4
  Installing       : lz4-1.9.3-5.el9.x86_64                   2/4
  Installing       : postgresql16-16.2-1PGDG.rhel9.x86_64     3/4
  Running scriptlet: postgresql16-16.2-1PGDG.rhel9.x86_64     3/4
  Running scriptlet: postgresql16-server-16.2-1PGDG.rhel9.x   4/4
  Installing       : postgresql16-server-16.2-1PGDG.rhel9.x   4/4
  Running scriptlet: postgresql16-server-16.2-1PGDG.rhel9.x   4/4
  Verifying        : lz4-1.9.3-5.el9.x86_64                   1/4
  Verifying        : postgresql16-16.2-1PGDG.rhel9.x86_64     2/4
  Verifying        : postgresql16-libs-16.2-1PGDG.rhel9.x86   3/4
  Verifying        : postgresql16-server-16.2-1PGDG.rhel9.x   4/4

Installed:
  lz4-1.9.3-5.el9.x86_64
  postgresql16-16.2-1PGDG.rhel9.x86_64
  postgresql16-libs-16.2-1PGDG.rhel9.x86_64
  postgresql16-server-16.2-1PGDG.rhel9.x86_64

Complete!

Nessa saída, podemos ver que foram instalados os seguintes pacotes:

  • lz4-1.9.3-5.el9.x86_64: dependência do PostgreSQL;
  • postgresql16-16.2-1PGDG.rhel9.x86_64: cliente do PostgreSQL;
  • postgresql16-libs-16.2-1PGDG.rhel9.x86_64: bibliotecas de uso interno que já vimos na instalação anterior;
  • postgresql16-server-16.2-1PGDG.rhel9.x86_64: servidor do PostgreSQL.

A partir daqui, já temos a instalação feita e os próximos passos são referentes à sua inicialização. O primeiro comando inicializa o banco com as configurações padrão, ou seja, cria o cluster:

/usr/pgsql-16/bin/postgresql-16-setup initdb
Red Hat shell: inicialização do banco de dados
# /usr/pgsql-16/bin/postgresql-16-setup initdb
Initializing database ... OK

O segundo comando serve para habilitar a inicialização automática do PostgreSQL com o sistema:

systemctl enable postgresql-16
Red Hat shell: definição da inicialização automática do PostgreSQL
# systemctl enable postgresql-16
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-16.service → /usr/lib/systemd/system/postgresql-16.service.

E, por fim, vamos inicializar também o serviço do PostgreSQL, que é um comando sem saída, mas veremos como checar o serviço nos próximos tópicos:

systemctl start postgresql-16

Pronto! Sua versão de preferência do PostgreSQL está instalada e pronta para uso, com o mesmo comando mostrado anteriormente:

Red Hat shell: teste de conexão
su - postgres
psql

Destino de arquivos

Ao instalar o PostgreSQL, a estrutura de pastas geralmente segue um padrão comum para sistemas baseados em Linux, sendo ela:

  • Diretório principal do cluster que foi criado nas etapas de instalação, sendo o local onde os dados serão armazenados, incluindo bancos de dados, tabelas etc.:
    /var/lib/pgsql/<versão>/data/
  • Binários e executáveis específicos de cada versão ficam em:
    /usr/pgsql/<versão>/bin/
  • Configurações do PostgreSQL, incluindo o principal arquivo de configuração postgresql.conf e o  pg_hba.conf, referente à configuração de autenticação do cliente, arquivos de log e outros relacionados podem ser encontrados em:
    /var/lib/pgsql/<versão>/data/
  • Bibliotecas compartilhadas:
    /usr/pgsql/<versão>/lib/
  • Scripts de inicialização e configuração:
    /usr/pgsql/<versão>/share/
  • Documentação oficial incluindo manuais e guias:
    /usr/pgsql/<versão>/doc/

Serviços

O serviço postgresql-<versão>.service é responsável por inicializar e parar o servidor PostgreSQL. Para verificar o status desse serviço, bem como algumas informações sobre ele (estado atual, data da última inicialização, informações sobre o processo etc.), você pode utilizar algum destes comandos: 

  • systemctl status postgresql-<versão>
  • pg_ctl status: só roda no usuário postgres e talvez seja necessário digitar todo o caminho até o executável ou adicioná-lo ao path antes com o comando:
    export PATH=$PATH:/usr/lib/postgresql/<versao>/bin
Red Hat shell: comandos para verificar o serviço do PostgreSQL
# systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.servic>
     Active: active (running) since Mon 2024-02-19 13:29:50 UTC; >
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 15193 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-c>
   Main PID: 15198 (postgres)
      Tasks: 7 (limit: 4348)
     Memory: 20.7M
        CPU: 676ms
     CGroup: /system.slice/postgresql-16.service
             ├─15198 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql>
             ├─15199 "postgres: logger "
             ├─15200 "postgres: checkpointer "
             ├─15201 "postgres: background writer "
             ├─15203 "postgres: walwriter "
             ├─15204 "postgres: autovacuum launcher "
             └─15205 "postgres: logical replication launcher "
             
Feb 19 13:29:50 centos-lud-teste systemd[1]: Starting PostgreSQL >
Feb 19 13:29:50 centos-lud-teste postgres[15198]: 2024-02-19 13:2>
Feb 19 13:29:50 centos-lud-teste postgres[15198]: 2024-02-19 13:2>
Feb 19 13:29:50 centos-lud-teste systemd[1]: Started PostgreSQL 1>
lines 1-22/22 (END)

$ /usr/pgsql-16/bin/pg_ctl status -D /var/lib/pgsql/16/data
pg_ctl: server is running (PID: 15198)
/usr/pgsql-16/bin/postgres "-D" "/var/lib/pgsql/16/data/"

Processos

Aqui estão alguns dos processos do PostgreSQL no CentOS, sendo revelados pelo comando ps

Red Hat shell: comandos para verificar o serviço do PostgreSQL
# ps faux | grep postgres
postgres   15198  0.0  3.4 212168 27548 ?        Ss   13:29   0:00 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
postgres   15199  0.0  0.7  66096  5780 ?        Ss   13:29   0:00  \_ postgres: logger
postgres   15200  0.0  1.0 212308  8164 ?        Ss   13:29   0:00  \_ postgres: checkpointer
postgres   15201  0.0  0.7 212300  6184 ?        Ss   13:29   0:00  \_ postgres: background writer
postgres   15203  0.0  1.3 212300 10664 ?        Ss   13:29   0:00  \_ postgres: walwriter
postgres   15204  0.0  1.0 213772  8672 ?        Ss   13:29   0:00  \_ postgres: autovacuum launcher
postgres   15205  0.0  1.1 213756  8820 ?        Ss   13:29   0:00  \_ postgres: logical replication launcher

Gerenciamento do serviço do cluster

Criação e remoção

No contexto do PostgreSQL, um cluster se refere aos arquivos que compõem um conjunto de bancos de dados gerenciados por uma única instância, rodando em uma única porta. Cada cluster tem sua própria instância, conjunto de configurações, diretórios de dados, arquivos de log e processos associados.

Assim que instalamos o PostgreSQL no Red Hat, conforme mencionado anteriormente, tivemos uma etapa de criação de cluster. Criar um cluster nos permite ter várias instâncias do PostgreSQL em execução no mesmo sistema, cada uma com suas próprias configurações, portas e conjuntos de dados separados, sendo útil quando você precisa hospedar várias aplicações ou projetos, e cada um deles requer configurações independentes e/ou versões diferentes. O padrão desse sistema é que cada instalação tenha apenas um cluster, que não tem nome específico, mas se encontra na pasta data, neste endereço: /var/lib/pgsql/<versão>/data/

Caso haja necessidade de remover e recriar o cluster, podemos fazer isso com alguns comandos:

Remoção:

Para removermos um cluster, o primeiro passo é desconectá-lo e garantir que não há nenhum processo do PostgreSQL utilizando-o. Para isso, vamos rodar:

systemctl stop postgresql-<versão>

Então podemos removê-lo apagando seu diretório (etapa que remove permanentemente os dados do cluster) com este comando que não imprime saída:

rm -r /var/lib/pgsql/<versão>/data

Criação:

Para criar um cluster no Red Hat, a primeira orientação é mudar para o usuário “postgres” com o comando su – postgres, pois existem operações que não conseguiremos fazer como root. Então basta rodar este comando para criar o novo cluster:

/usr/pgsql-<versão>/bin/initdb -D /var/lib/pgsql/<versão>/data
Red Hat shell: iniciando o cluster
$ /usr/pgsql-16/bin/initdb -D /var/lib/pgsql/16/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /var/lib/pgsql/16/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -l logfile start

Desse modo, podemos iniciar o servidor da base com o comando sugerido pela própria saída acima:

/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -l logfile start

Red Hat shell: iniciando o servidor da base
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -l logfile start
waiting for server to start.... done
server started

Embora esse comando funcione normalmente, recomendamos não subir o servidor dessa forma, pois você irá confundir o systemd que gerencia a inicialização automática do PostgreSQL. Por isso, utilize no lugar do “pg_ctl” o “sytemctl”, como veremos a seguir.

Outros processos de gerenciamento do cluster

Para gerenciar os serviços no servidor, temos dois grupos de comandos (demonstrados aqui com o usuário postgres):

  • pg_ctl: são os comandos nativos do PostgreSQL, que não recomendados para se utilizar em distribuições Red Hat e derivadas, pois podem impactar na inicialização automática dos serviços; 
  • systemctl: é o comando utilizado pelo systemd (sistema de inicialização de serviços do Linux) para subir e descer serviços. Ele só roda com poderes de administrador (com o usuário root ou com o sudo) e deve ser utilizado em favor da opção anterior.

Comandos utilizando pg_ctl:

Iniciar o serviço do cluster:

/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data start
Red Hat shell: iniciando serviço do cluster
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data start
waiting for server to start....2024-02-28 19:43:20.685 UTC [14703] LOG:  redirecting log output to logging collector process
2024-02-28 19:43:20.685 UTC [14703] HINT:  Future log output will appear in directory "log".
 done
server started

Parar o serviço do cluster:

/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data stop
Red Hat shell: parando serviço do cluster
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data stop
waiting for server to shut down.... done
server stopped

Reiniciar o serviço do cluster:

/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data restart
Red Hat shell: reiniciando serviço do cluster
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2024-02-28 19:45:22.255 UTC [14743] LOG:  redirecting log output to logging collector process
2024-02-28 19:45:22.255 UTC [14743] HINT:  Future log output will appear in directory "log".
 done
server started

Exibir o status atual do cluster:

/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data status
Red Hat shell: exibindo status do cluster
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data status
pg_ctl: server is running (PID: 14743)
/usr/pgsql-16/bin/postgres "-D" "/var/lib/pgsql/16/data"

Comandos utilizando systemctl:

  • Iniciar o serviço do cluster (comando sem saída):
    sudo systemctl start postgresql-<versão>
  • Parar o serviço do cluster (comando sem saída):
    sudo systemctl stop postgresql-<versão>
  • Reiniciar o serviço do cluster (comando sem saída):
    sudo systemctl restart postgresql-<versão>
  • Exibir o status atual do cluster:
    sudo systemctl status postgresql-<versão>
Red Hat shell: exibindo status do cluster
$ sudo systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
     Active: active (running) since Thu 2024-02-29 13:24:51 UTC; 1min 6s ago
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 34531 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 34537 (postgres)
      Tasks: 7 (limit: 4478)
     Memory: 18.2M
        CPU: 148ms
     CGroup: /system.slice/postgresql-16.service
             ├─34537 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
             ├─34538 "postgres: logger "
             ├─34539 "postgres: checkpointer "
             ├─34540 "postgres: background writer "
             ├─34542 "postgres: walwriter "
             ├─34543 "postgres: autovacuum launcher "
             └─34544 "postgres: logical replication launcher "

Feb 29 13:24:51 centos-ludmila-teste systemd[1]: Starting PostgreSQL 16 database server...
Feb 29 13:24:51 centos-ludmila-teste postgres[34537]: 2024-02-29 13:24:51.768 UTC [34537] LOG:  redirecting log output to logging collector process
Feb 29 13:24:51 centos-ludmila-teste postgres[34537]: 2024-02-29 13:24:51.768 UTC [34537] HINT:  Future log output will appear in directory "log".
Feb 29 13:24:51 centos-ludmila-teste systemd[1]: Started PostgreSQL 16 database server.
  • Habilitar inicialização automática do serviço postgresql (comando sem saída):
    sudo systemctl enable postgresql-<versão>
  • Desabilitar inicialização automática do serviço postgresql (comando sem saída):
    sudo systemctl disable postgresql-<versão>
  • Recarregar a configuração do serviço postgresql (comando sem saída):
    sudo systemctl reload postgresql-<versão>

Instalação de mais de uma versão ao mesmo tempo

Se for necessário instalar mais de uma versão do PostgreSQL (para casos de um upgrade de versão ou desenvolvimento e/ou homologação do PostgreSQL em mais de uma versão), podemos instalar rodando o comando diretamente, uma vez que já instalamos o repositório RPM no sistema. Desse modo, basta rodar:

dnf install -y postgresql<versão>-server

Aqui escolhemos a versão 15, e esta foi a nossa saída:

Red Hat shell: instalação do PostgreSQL versão 15
# dnf install -y postgresql15-server
DigitalOcean Droplet Agent          45 kB/s | 3.3 kB     00:00
Dependencies resolved.
====================================================================
 Package                 Arch     Version             Repo      Size
====================================================================
Installing:
 postgresql15-server     x86_64   15.6-1PGDG.rhel9    pgdg15   6.1 M
Installing dependencies:
 postgresql15            x86_64   15.6-1PGDG.rhel9    pgdg15   1.5 M
 postgresql15-libs       x86_64   15.6-1PGDG.rhel9    pgdg15   297 k

Transaction Summary
===================================================================
Install  3 Packages

Total download size: 7.9 M
Installed size: 35 M
Downloading Packages:
(1/3): postgresql15-libs-15.6-1PGD  291 kB/s | 297 kB     00:01
(2/3): postgresql15-15.6-1PGDG.rhe  1.0 MB/s | 1.5 MB     00:01
(3/3): postgresql15-server-15.6-1P  3.3 MB/s | 6.1 MB     00:01
-------------------------------------------------------------------
Total                               4.3 MB/s | 7.9 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                           1/1
  Installing       : postgresql15-libs-15.6-1PGDG.rhel9.x86_   1/3
  Running scriptlet: postgresql15-libs-15.6-1PGDG.rhel9.x86_   1/3
  Installing       : postgresql15-15.6-1PGDG.rhel9.x86_64      2/3
  Running scriptlet: postgresql15-15.6-1PGDG.rhel9.x86_64      2/3
  Running scriptlet: postgresql15-server-15.6-1PGDG.rhel9.x8   3/3
  Installing       : postgresql15-server-15.6-1PGDG.rhel9.x8   3/3
  Running scriptlet: postgresql15-server-15.6-1PGDG.rhel9.x8   3/3
  Verifying        : postgresql15-15.6-1PGDG.rhel9.x86_64      1/3
  Verifying        : postgresql15-libs-15.6-1PGDG.rhel9.x86_   2/3
  Verifying        : postgresql15-server-15.6-1PGDG.rhel9.x8   3/3

Installed:
  postgresql15-15.6-1PGDG.rhel9.x86_64
  postgresql15-libs-15.6-1PGDG.rhel9.x86_64
  postgresql15-server-15.6-1PGDG.rhel9.x86_64

Complete!

Na sequência, é necessário seguir os mesmos passos da instalação padrão aqui: iniciar o cluster, habilitar inicialização automática do serviço e iniciá-lo manualmente na primeira vez, sendo a única mudança a edição da porta no arquivo de configuração (postgresql.conf) para que não haja conflito com a versão já instalada. Sobre qual número usar de porta, considerando que a padrão é a 5432 atribuída à primeira instalação, podemos usar os números seguintes consecutivos até o limite de 65535.

  • Iniciar o banco:
    /usr/pgsql-15/bin/postgresql-15-setup initdb
  • Habilitar a inicialização automática com o sistema:
    systemctl enable postgresql-15
  • Editar o arquivo: /var/lib/pgsql/15/data/postgresql.conf sendo necessário alterar a seguinte informação (descomente a linha removendo o “#”):
    port = <número de porta disponível>
  • Iniciar o serviço:
    systemctl start postgresql-15
  • Podemos verificar as versões instaladas com o comando abaixo:
    rpm -qa | grep postgresql
Red Hat shell: versões do PostgreSQL instaladas
# rpm -qa | grep postgresql
postgresql16-libs-16.2-1PGDG.rhel9.x86_64
postgresql16-16.2-1PGDG.rhel9.x86_64
postgresql16-server-16.2-1PGDG.rhel9.x86_64
postgresql15-libs-15.6-1PGDG.rhel9.x86_64
postgresql15-15.6-1PGDG.rhel9.x86_64
postgresql15-server-15.6-1PGDG.rhel9.x86_64

Instalação em diretório ou partição alternativa

Se você for fazer uma instalação num ambiente de produção, é muito importante não deixar o cluster na mesma partição do resto do Linux. Por padrão, o PostgreSQL cria o cluster em /var/lib/pgsql. Numa instalação padrão do Red Hat, esse diretório fica na partição raiz.

Você pode verificar as partições existentes com o comando df:

Red Hat shell: lista de partições do sistema
# df -h | grep -v tmpfs
Filesystem      Size       Used     Avail     Use%       Mounted on
/dev/vda1        25G       1.8G       24G       7%       /
/dev/sda        100G       785M      100G       1%       /mnt/volume_sfo3_02

Caso deseje alterar a estrutura das pastas pós-instalação e salvar seu banco em outro diretório/partição, é possível fazer isso alterando o arquivo de configuração do serviço no systemd, mais especificamente o trecho onde é determinado o padrão de diretórios dos dados. Esse arquivo fica em /lib/systemd/system/postgresql-16.service.

Primeiro, é preciso dar acesso ao usuário postgres ao diretório escolhido para iniciar o PostgreSQL, pois é ele quem faz as operações aqui. Para isso, você pode usar o comando abaixo, inserindo no final o caminho, dentro de sua nova partição, onde deseja salvar os dados do banco:

chown postgres:postgres <caminho_partição>

No nosso caso, ficou assim:

chown postgres:postgres /mnt/volume_sfo3_02/pgsql/16/data

Após isso, vamos editar o arquivo no systemd /lib/systemd/system/postgresql-16.service

Segue o trecho onde deve-se alterar, descomentando ambas as linhas e alterando apenas o destino na última, de acordo com sua nova partição e diretório desejados:

Red Hat shell: arquivo postgresql-16.service
# [Service]
...
# Environment=PGDATA=/pgdata/16/data # também descomentar e alterar o caminho para o desejado

O nosso ficou:

Red Hat shell: arquivo postgresql-16.service
[Service]
...
Environment=PGDATA=/mnt/volume_sfo3_02/pgsql/16/data

É recomendável manter a estrutura padrão depois que decidir seu diretório de preferência (.../pgsql/16/data) para uma melhor navegação e identificação da versão em uso.

Agora, é necessário recarregar o systemdb, e você pode fazer isso com este comando:

systemctl daemon-reload

Assim, podemos rodar o initdb e, então, iniciar o banco:

/usr/pgsql-<versão>/bin/postgresql-<versão>-setup initdb

Também vamos precisar mudar o arquivo .bash_profile para redefinir uma variável de ambiente chamada PGDATA, inserindo o novo caminho do diretório de dados do banco (no caso do usuário postgres no Red Hat, seria o arquivo /var/lib/pgsql/.bash_profile)

O trecho abaixo, especificamente na frente de “=”, deve ser alterado com o caminho escolhido. O nosso ficou assim: 

PGDATA=/mnt/volume_sfo3_02/pgsql/16/data

Na sequência, vamos rodar os mesmos comandos de systemctl das instalações passadas para habilitar a inicialização automática e iniciar o serviço, sendo o último comando opcional para conferir se está tudo certo:

systemctl enable postgresql-16
systemctl start postgresql-16 
systemctl status postgresql-16 
Red Hat shell: status do serviço postgresql-16
#  systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-02-27 18:21:19 UTC; 2h 33min ago
     Docs: https://www.postgresql.org/docs/16/static/
     Process: 854 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
    Main PID: 872 (postgres)
    Tasks: 8 (limit: 4478)
    Memory: 34.3M
    CPU: 1.760s
    CGroup: /system.slice/postgresql-16.service
             ├─ 872 /usr/pgsql-16/bin/postgres -D /mnt/volume_sfo3_02/pgsql/16/data/
             ├─ 893 "postgres: logger "
             ├─ 897 "postgres: checkpointer "
             ├─ 898 "postgres: background writer "
             ├─ 902 "postgres: walwriter "
             ├─ 903 "postgres: autovacuum launcher "
             ├─ 904 "postgres: logical replication launcher "
             └─4674 "postgres: postgres postgres [local] idle"

Feb 27 18:21:18 centos-ludmila-teste systemd[1]: Starting PostgreSQL 16 database server...
Feb 27 18:21:19 centos-ludmila-teste postgres[872]: 2024-02-27 18:21:19.218 UTC [872] LOG:  redirecting log output to logging collector process
Feb 27 18:21:19 centos-ludmila-teste postgres[872]: 2024-02-27 18:21:19.218 UTC [872] HINT:  Future log output will appear in directory "log".
Feb 27 18:21:19 centos-ludmila-teste systemd[1]: Started PostgreSQL 16 database server.

Caso sua nova partição tenha sido montada no diretório padrão do PostgreSQL no Red Hat, é necessário realizar apenas o primeiro passo de conceder acesso ao usuário postgres no diretório da nova partição, pulando a necessidade de editar o arquivo systemd, para então seguir com os comandos systemctl e iniciar o serviço.

Conclusão

Ao compararmos a instalação via pacotes com a instalação compilada vista no artigo anterior, veremos que o processo todo é bem mais simples e rápido. Você consegue realizar uma instalação completa em poucos minutos e não terá dificuldades em manter esse ambiente depois. Ainda assim, alguns cuidados adicionais serão necessários para criar um servidor PostgreSQL em ambiente de produção, como por exemplo montar o banco de dados numa partição/disco diferente do resto do sistema operacional.

Compartilhe

Você pode gostar

pg_hba.conf

Introdução O arquivo pg_hba.conf (PostgreSQL Host-Based Authentication) é uma peça fundamental na configuração de segurança de qualquer instância PostgreSQL. Ele define as regras de autenticação

Tuning de SO (no Linux)

Introdução Tuning refere-se ao processo de ajustar e otimizar o desempenho de um sistema, software ou aplicação. A otimização do sistema operacional é uma etapa

plugins premium WordPress