Como instalar o PostgreSQL no Linux Debian e derivados

Se você procura mais facilidade e simplicidade no processo de instalação do PostgreSQL em seu Debian, com maior abertura para escolha de diferentes versões, a instalação via pacotes é a opção ideal. Nela, temos a possibilidade de trabalhar tanto com pacotes nativos quanto com o repositório PGDG (PostgreSQL Global Development Group).

Ao longo deste texto, vamos abordar diferentes cenários dessa instalação, utilizando sempre a linha de comando. E já fica a primeira lição: em um servidor de banco de dados em produção, jamais se utiliza a interface gráfica! O motivo é simples: você só instala, em um servidor dedicado, estritamente aquilo que vai utilizar. Assim você economiza recursos do servidor (espaço em disco, processamento, memória) e diminui suas brechas de segurança. Então, se deseja aproveitar o melhor desse banco de dados, ajeite-se na cadeira e vamos lá! 

Neste artigo, serão abordados os tópicos:

  • Instalação com pacotes nativos da distribuição;
  • Instalação com pacotes do repositório PGDG (PostgreSQL Global Development Group);
  • Remoção da instalação;
  • 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

Por padrão, os repositórios nativos do Debian já vêm com uma versão disponível do PostgreSQL para instalação, geralmente a última versão estável na época de lançamento da versão do Debian em utilização. Então, podemos dizer que cada versão de Debian vem com uma versão de PostgreSQL. 

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 como desfazer esse processo 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:

apt update
apt upgrade

Para instalação com os pacotes nativos, vamos rodar o seguinte comando via shell (com acesso pelo superusuário/root ou utilizando o comando sudo): 

apt install postgresql

Após rodar esse comando, será possível ver uma barra de carregamento; então é só aguardar a instalação ser concluída.

Você pode conferir os pacotes do PostgreSQL instalados (sem contar outras dependências) com o comando dpkg -l | grep postgresql
Debian shell: consultando pacotes “postgresql”
# dpkg -l | grep postgresql
ii  postgresql                                 15+248                       all         object-relational SQL database (supported version)
ii  postgresql-15                           15.5-0+deb12u1     amd64     The World's Most Advanced Open Source Relational Database
ii  postgresql-client-15            15.5-0+deb12u1     amd64      front-end programs for PostgreSQL 15
ii  postgresql-client-common    248                            all          manager for multiple PostgreSQL client versions
ii  postgresql-common                   248                            all          PostgreSQL database-cluster manager

Estamos utilizando Debian na versão 12, e o PostgreSQL instalado dessa maneira veio na versão 15.5. Se, por algum motivo, for necessária outra versão do PostgreSQL, veremos no próximo tópico a instalação com pacotes do repositório PGDG, que nos possibilita escolher a versão desejada.

Após instalado, para acessar o shell do PostgreSQL, é só usar esse comando logado com o usuário ‘postgres’:

su - postgres
psql

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

Você também pode escolher instalar por pacotes separados, ou seja, ao invés de baixar pacote, servidor e cliente juntos, com o comando mostrado anteriormente, é possível instalá-los separadamente, escolhendo apenas um se for o caso. Além disso, também há mais tipos de pacotes disponíveis, como extensões para o PostgreSQL, parecidos com os que temos no Stack Builder para instalações Windows. Alguns desses pacotes são:

  • libpq5: bibliotecas utilizadas para que as aplicações se comuniquem com o PostgreSQL. Toda aplicação que for acessar o PostgreSQL tem essa dependência;
  • postgresql, postgresql-client, postgresql-doc: metapacotes, que funcionam como apelidos para a última versão do PostgreSQL, disponíveis; neste caso a versão 15;
  • postgresql-15: servidor PostgreSQL;
  • postgresql-client-15: aplicações cliente, como psql, pg_dump, pg_restore etc. Ideal para instalar em máquinas que vão acessar apenas um servidor PostgreSQL;
  • postgresql-doc-15: documentação no formato man;
  • postgresql-server-dev-15: pacote para desenvolvimento de aplicações que interagem com servidor PostgreSQL. É necessário se você for compilar algum código que tenha o PostgreSQL como dependência;
  • postgresql-common: fornece arquivos e scripts para gerenciamento de clusters com os comandos pg_ctlcuster, pg_createcluster, pg_dropcluter, pg_lscluster etc.;
  • postgresql-plpython3-15: extensão que permite o uso da linguagem de programação pl/Python;
  • postgresql-plperl-15: extensão que permite o uso da linguagem pl/Perl;
  • postgresql-pltcl-15: extensão que permite o uso da linguagem pl/Tcl.

Todos esses pacotes são oficiais do PostgreSQL. É possível concluir isso pela fonte no topo da página (“[ Source: postgresql-15  ]”). Existem muitos outros pacotes que não são desenvolvidos diretamente pelo time do “core PostgreSQL”, mas que também estão disponíveis para instalação.

Bom saber que, assim como no Windows, a porta padrão também é a 5432, e no caso de mais de uma instalação, conforme veremos adiante, portas diferentes são usadas para cada uma.

Remoção dos binários do PostgreSQL

Para remover uma instalação, existem dois caminhos: remover apenas o pacote do sistema e manter as configurações (o que permite uma reinstalação sem perda de dados) ou remover completamente o PostgreSQL, incluindo dados e configurações.

Os principais comandos são estes:

  • Remove o pacote e mantém dados e configurações:
    apt remove postgresql
  • Remove completamente o PostgreSQL:
    apt purge postgresql

Você vai notar que, após rodar este comando, todos os outros pacotes ainda estarão lá, pois o pacote com o nome “postgresql” é, na verdade, um metapacote, um atalho para a versão disponível do PostgreSQL. O pacote real é o “postgresql-15”:

Debian shell: removendo e depois consultando pacotes “postgresql”
# apt remove postgresql
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  postgresql
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 15.4 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 34253 files and directories currently installed.)
Removing postgresql (15+248) ...

# dpkg -l | grep postgresql
ii  postgresql-15                          15.5-0+deb12u1     amd64     The World's Most Advanced Open Source Relational Database
ii  postgresql-client-15           15.5-0+deb12u1     amd64     front-end programs for PostgreSQL 15
ii  postgresql-client-common   248                            all          manager for multiple PostgreSQL client versions
ii  postgresql-common                  248                            all          PostgreSQL database-cluster manager

Uma forma de resolver isso seria remover todos os pacotes listados:

Debian shell: removendo todos os pacotes do PostgreSQL
# apt remove postgresql postgresql-15  postgresql-client-15 postgresql-client-common postgresql-common libpq5
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libcommon-sense-perl libjson-perl libjson-xs-perl libllvm14 libsensors-config libsensors5 libtypes-serialiser-perl libxslt1.1 libz3-4 ssl-cert sysstat
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  libpq5 postgresql postgresql-15 postgresql-client-15 postgresql-client-common postgresql-common
0 upgraded, 0 newly installed, 6 to remove and 0 not upgraded.
After this operation, 63.7 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 34253 files and directories currently installed.)
Removing postgresql (15+248) ...
Removing postgresql-15 (15.5-0+deb12u1) ...
Removing postgresql-client-15 (15.5-0+deb12u1) ...
Removing libpq5:amd64 (15.5-0+deb12u1) ...
Removing postgresql-common (248) ...
Removing 'diversion of /usr/bin/pg_config to /usr/bin/pg_config.libpq-dev by postgresql-common'
Removing postgresql-client-common (248) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u4) ...

Se você quer remover tudo, inclusive o cluster criado e os arquivos de configuração, a melhor opção é o comando purge, conforme citado anteriormente:

Debian shell: removendo todos os pacotes do PostgreSQL, dos dados e das configurações com o comando “purge”
# apt purge  postgresql postgresql-15  postgresql-client-15 postgresql-client-common postgresql-common libpq5
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libcommon-sense-perl libjson-perl libjson-xs-perl libllvm14 libsensors-config libsensors5 libtypes-serialiser-perl libxslt1.1 libz3-4 ssl-cert sysstat
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  libpq5* postgresql* postgresql-15* postgresql-client-15* postgresql-client-common* postgresql-common*
0 upgraded, 0 newly installed, 6 to remove and 0 not upgraded.
After this operation, 63.7 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 34253 files and directories currently installed.)
Removing postgresql (15+248) ...
Removing postgresql-15 (15.5-0+deb12u1) ...
Removing postgresql-client-15 (15.5-0+deb12u1) ...
Removing libpq5:amd64 (15.5-0+deb12u1) ...
Removing postgresql-common (248) ...
Removing 'diversion of /usr/bin/pg_config to /usr/bin/pg_config.libpq-dev by postgresql-common'
Removing postgresql-client-common (248) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u4) ...
(Reading database ... 32107 files and directories currently installed.)
Purging configuration files for postgresql-client-common (248) ...
dpkg: warning: while removing postgresql-client-common, directory '/etc/postgresql-common' not empty so not removed
Purging configuration files for postgresql-common (248) ...
dpkg: warning: while removing postgresql-common, directory '/var/log/postgresql' not empty so not removed
dpkg: warning: while removing postgresql-common, directory '/var/lib/postgresql' not empty so not removed
dpkg: warning: while removing postgresql-common, directory '/etc/postgresql' not empty so not removed
Purging configuration files for postgresql-15 (15.5-0+deb12u1) ...
Dropping cluster main...

Durante a execução do comando purge, é exibida a seguinte tela perguntando se você deseja remover o cluster atual:

Tela de confirmação do comando purge

Após desinstalá-lo por alguma dessas opções, você também pode pesquisar se restou algo relacionado ao PostgreSQL. Para isso, basta rodar:

dpkg -l | grep postgresql

Instalação com pacotes do repositório PGDG

Esta é a segunda e melhor opção de instalação, na qual podemos escolher uma versão específica diferente da existente nos pacotes nativos. Importante: caso siga esta opção, é recomendado remover antes a instalação com pacotes nativos para evitar conflitos.

A grande diferença aqui é que vamos usar como fonte de download o próprio repositório da comunidade PostgreSQL (conhecida como PGDG). Com isso, teremos várias versões disponíveis para instalar. 

O primeiro passo é acessar a página oficial de download do PostgreSQL para Linux/Debian, de onde vamos pegar o endereço do repositório e alguns comandos para instalação. 

Página oficial de download do PostgreSQL

Abaixo está o trecho da página com comandos úteis que iremos copiar e utilizar no processo:

postgresql.org: tutorial de download Linux/Debian
# Import the repository signing key:
sudo apt install curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc

# Create the repository configuration file:
sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

# Update the package lists:
sudo apt update

# Install the latest version of PostgreSQL:
# If you want a specific version, use 'postgresql-16' or similar instead of 'postgresql'
sudo apt -y install postgresql

É 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 rodar todos os comandos logados com o usuário root. 

Primeiro, vamos começar importando a chave de assinatura do repositório do PostgreSQL, e para isso, vamos instalar os pacotes curl e ca-certificates, criar um diretório para armazenar essa chave e baixá-la com os seguintes comandos:

Debian shell: instalando pacotes e baixando a chave de assinatura
apt install curl ca-certificates
install -d /usr/share/postgresql-common/pgdg
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc

Agora, vamos criar um arquivo de lista de repositório específico para o PGDG. Esse arquivo será utilizado para adicionar o repositório PGDG ao sistema, para que possamos consumir sua instalação. Então, para criar o arquivo e inserir o endereço do repositório PGDG, basta utilizar o comando:

Debian shell: criando arquivo de repositório para o PGDG
sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Por último precisamos atualizar o sistema para que sejam visíveis os pacotes disponíveis nesse repositório. Para isso, vamos usar:

apt update

Pronto! Repositório configurado! A partir daqui, seguimos com a instalação do servidor PostgreSQL.

Para instalarmos, vamos usar o mesmo comando de antes, mas agora com a liberdade de especificar a versão desejada, sendo escolhida por nós a mais recente (16). Se você não especificar a versão do PostgreSQL, ele vai sempre instalar a última versão estável disponível. Então o comando fica assim:

apt -y install postgresql-16

Aí é só aguardar. Durante o processo, fica visível o nosso repositório configurado no arquivo anterior como fonte de download dos pacotes necessários, conforme trecho abaixo:

Debian shell: instalando o PostgreSQL 16 via repositório PGDG
# apt install postgresql-16
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libcommon-sense-perl libjson-perl libjson-xs-perl libllvm16 libpq5 libsensors-config libsensors5 libtypes-serialiser-perl libxslt1.1 libz3-4 postgresql-client-16 postgresql-client-common postgresql-common ssl-cert sysstat
Suggested packages:
  lm-sensors isag
The following NEW packages will be installed:
  libcommon-sense-perl libjson-perl libjson-xs-perl libllvm16 libpq5 libsensors-config libsensors5 libtypes-serialiser-perl libxslt1.1 libz3-4 postgresql-16 postgresql-client-16 postgresql-client-common postgresql-common ssl-cert
  sysstat
0 upgraded, 16 newly installed, 0 to remove and 0 not upgraded.
Need to get 51.4 MB of archives.
After this operation, 220 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [39 B]
Get:2 http://mirrors.digitalocean.com/debian bookworm/main amd64 libjson-perl all 4.10000-1 [87.5 kB]
Get:3 http://mirrors.digitalocean.com/debian bookworm/main amd64 ssl-cert all 1.1.2 [21.1 kB]
...
selecionando fuso horário padrão ... Etc/UTC
criando arquivos de configuração ... ok
executando script de inicialização ... ok
executando pós-inicialização ... ok
sincronizando dados no disco ... ok
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u4) ...

No exemplo acima, vemos a instalação do PostgreSQL 16 com algumas etapas em destaque:

  • São selecionadas várias dependências, entre elas alguns pacotes do próprio PostgreSQL listados abaixo. Claro que a lista pode mudar de acordo com a versão da sua distribuição e com os pacotes que você já tenha instalado anteriormente:
    • postgresql-client-16 
    • postgresql-client-common 
    • postgresql-common
    • libpq5
  • Download de todos os pacotes selecionados para a instalação, deixando por último os pacotes do PostgreSQL destacados acima;
  • Descompactação de todos os pacotes baixados;
  • Configuração de alguns pacotes que foram instalados, com destaque para:
    • Configurações do pacote postgresql-common, incluindo a inicialização automática no systemd e a criação de arquivos de configuração em /etc/postgresql-common;
    • Criação do usuário ‘postgres’ no SO. Esse usuário será o dono de todos os arquivos do cluster, e todos os processos serão executados também com este usuário, em vez do root;
    • Criação do cluster com nome padrão “main” com o usuário ‘postgres’;
    • Subir o cluster “main” criado por padrão com o usuário ‘postgres’.

Destino de arquivos

Após a instalação do PostgreSQL, o software cria uma estrutura de pastas para armazenar seus arquivos e dados no Debian, sendo:

  • Principal diretório (cluster padrão vem com nome “main”), que é o local onde os dados serão armazenados, incluindo bancos de dados, tabelas etc.:
    /var/lib/postgresql/<sua_versão>/<seu_cluster>
  • Arquivos de configuração genéricos que independem da versão do PostgreSQL:
    /etc/postgresql-common
  • Arquivos de configuração do servidor:
    /etc/postgresql/<versão>/<cluster>
    Com destaque para os arquivos:
    • postgresql.conf: principal arquivo de configuração; 
    • pg_hba.conf: arquivo de configuração de autenticação do cliente.
  • Logs do PostgreSQL por padrão ficam em:
    /var/log/postgresql
  • Portas e sockets para comunicação:
    /var/run/postgresql
  • Binários executáveis genéricos que independem da versão do PostgreSQL:
    /usr/share/postgresql-common
  • Binários executáveis, como psql, pg_ctl etc.:
    /usr/lib/postgresql/<sua_versão>/bin
  • Bibliotecas:
    /usr/lib/postgresql/<sua_versão>/lib
  • Binários adicionais como documentação, extensões, dicionários, exemplos de arquivos de configuração etc.:
    /usr/share/postgresql/<sua versão>
  • Documentação em html:
    /usr/share/doc/postgresql-doc-<sua versão>

Importante notar que <versão> representa a versão utilizada do PostgreSQL, sendo a nossa pós-instalação via repositório PGDG ‒ versão 16 ‒, e <cluster> representa o nome do cluster em questão (sendo o padrão com nome “main”).

Serviços e processos

Serviços

O serviço “postgresql” é responsável por iniciar 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 desses comandos: 

  • pg_ctl status
    Só roda com o 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/<sua_versao>/bin
  • pg_ctlcluster <sua_versao> <nome_cluster> status
  • systemctl status postgresql 
  • pg_lsclusters
Debian shell: verificando status do serviço “postgresql”
$ /usr/lib/postgresql/16/bin/pg_ctl status -D /var/lib/postgresql/16/main
pg_ctl: server is running (PID: 25340)
/usr/lib/postgresql/16/bin/postgres "-D" "/var/lib/postgresql/16/main" "-c" "config_file=/etc/postgresql/16/main/postgresql.conf"

pg_ctlcluster 16 main status
pg_ctl: server is running (PID: 25340)
/usr/lib/postgresql/16/bin/postgres "-D" "/var/lib/postgresql/16/main" "-c" "config_file=/etc/postgresql/16/main/postgresql.conf"

systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; p>     Active: active (exited) since Mon 2024-02-05 02:35:07 UTC; 15h ago
   Main PID: 69309 (code=exited, status=0/SUCCESS)
        CPU: 2ms

pg_lsclusters
Ver  Cluster  Port  Status  Owner          Data directory                                Log file
16    main        5432   online   postgres  /var/lib/postgresql/16/main  /var/log/postgresql/postgresql-16-main.log

Habilitando a inicialização automática do PostgreSQL no servidor

O Linux possui um subsistema chamado systemd que gerencia os serviços no servidor em geral. Uma das operações importantes do systemd é o de subir, na ordem certa, todos os serviços do Linux quando o servidor é ligado e descê-los quando o servidor é desligado. Subir o PostgreSQL automaticamente é bastante conveniente, caso seja necessário reiniciar ou desligar completamente o servidor. Mas, mais importante que isso, é se lembrar de baixar o serviço do PostgreSQL antes de desligar o servidor. Se o PostgreSQL estiver no ar a pleno vapor, desligá-lo abruptamente pode ocasionar problemas, como perda de dados ou mesmo corrupção do cluster. Na dúvida, é melhor sempre desligar automaticamente.

Para isso, utilizamos dois comandos adicionais do systemctl:

  • Habilitar a inicialização automática do PostgreSQL no servidor:
    systemctl enable postgresql
  • Desabilitar a inicialização automática do PostgreSQL no servidor:
    systemctl disable postgresql

Processos

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

Debian shell: consultando processos do PostgreSQL
# ps faux | grep postgres
USER       PID     %CPU %MEM VSZ   RSS  TTY STAT START   TIME COMMAND
postgres   154416  0.0  3.0 217600 30368 ?  Ss   14:01   0:00 /usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main -c config_file=/etc/postgresql/16/main/postgresql.conf
postgres   154417  0.0  0.8 217736  8636 ?  Ss   14:01   0:00  \_ postgres: 16/main: checkpointer
postgres   154418  0.0  0.6 217752  6024 ?  Ss   14:01   0:00  \_ postgres: 16/main: background writer
postgres   154420  0.0  1.0 217600 10172 ?  Ss   14:01   0:00  \_ postgres: 16/main: walwriter
postgres   154421  0.0  0.8 219204  8728 ?  Ss   14:01   0:00  \_ postgres: 16/main: autovacuum launcher
postgres   154422  0.0  0.7 219176  7136 ?  Ss   14:01   0:00  \_ postgres: 16/main: logical replication launcher

Gerenciamento 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 Debian, por padrão foi criado um cluster chamado “main”. Esse cluster pode conter um ou mais bancos de dados e é gerenciado por uma única instância do servidor PostgreSQL (do usuário ‘postgres’, conforme vimos em processos). 

Criar clusters 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. No Debian e derivados, utilizamos o comando pg_createcluster, fornecido pelo pacote postgresql-common que, internamente, requer o comando nativo do PostgreSQL initdb. Recomendamos não utilizar o initdb no Debian. Use apenas o pg_createcluster, caso contrário, você quebrará toda a organização do Debian (e sua vida vai virar uma bagunça, acredite!).

Para criar e iniciar o cluster:

pg_createcluster 16 meucluster --start

Para remover o cluster:

pg_dropcluster <versão> <cluster>

Exemplo

Debian shell: criando novo cluster
# pg_createcluster 16 meucluster --start
Creating new PostgreSQL cluster 16/meucluster ...
/usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16/meucluster --auth-local peer --auth-host scram-sha-256 --no-instructions
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 "C.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.

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

Nesse comando, criamos o cluster para a versão 16 do PostgreSQL (que é a que estamos usando no momento, portanto, deve ser substituída caso seja diferente da sua), nomeando esse cluster como “meucluster” (sendo também substituível por qualquer outro nome que deseje), incluindo o argumento “--start” para indicar que, após a criação, o serviço deve ser iniciado.

Para conferir o cluster criado e verificar os existentes, podemos usar o comando pg_lsclusters:

Debian shell: listando clusters
# pg_lsclusters
Ver Cluster       Port  Status Owner         Data directory                                           Log file
14  main              5435   online postgres  /var/lib/postgresql/14/main              /var/log/postgresql/postgresql-14-main.log
15  main              5434  online postgres  /var/lib/postgresql/15/main              /var/log/postgresql/postgresql-15-main.log
16  main              5432   online postgres   /var/lib/postgresql/16/main             /var/log/postgresql/postgresql-16-main.log
16  meucluster 5433  online postgres  /var/lib/postgresql/16/meucluster /var/log/postgresql/postgresql-16-meucluster.log

O comando pg_createcluster ainda tem uma série de outras opções. Não vamos nos estender no assunto para não prolongar demais aqui. No entanto, destacamos as opções para definir a porta e a codificação de caracteres (que deve ser suportada antes pelo seu SO). Para ver todas as opções disponíveis, você pode consultar a documentação do pg_createcluster com o comando man pg_createcluster.

Outros processos de gerenciamento do cluster

Existem alguns comandos para gerenciar o estado de um cluster, vamos aqui citar três opções:

  • pg_ctl e outros comandos nativos do PostgreSQL, que não são preferência para serem utilizados em distribuições Debian e derivadas, pois podem impactar na inicialização automática dos serviços;
  • pg_ctlcluster, que é um dos comandos criados pelo pacote postgresql-common e que simplifica um pouco as tarefas de administração em geral. Na verdade, por baixo do capô, ele utiliza o pg_ctl nativo do PostgreSQL, mas ele faz alguns truques que facilitam a vida e ajudam principalmente quem trabalha com mais de uma versão do PostgreSQL instalada no mesmo servidor. Mesmo assim, você também não deveria utilizar o pg_ctlcluster no dia a dia, mas, sim, a última opção abaixo, o systemctl, para não bagunçar a vida da inicialização automática dos serviços no Linux. Pode ser útil utilizar o pg_ctlcluster em alguns casos específicos, como em testes e situações de emergência, mas você tem que estar ciente das consequências depois;
  • systemctl, que é 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 das opções anteriores, como já foi descrito. E, sim, ele utiliza o pg_ctlcluster.

Comandos utilizando o systemctl com o PostgreSQL:

  • Iniciar o serviço do cluster:
    systemctl start postgresql@<versao>-<cluster>.service
  • Parar o serviço do cluster:
    systemctl stop postgresql@<versao>-<cluster>.service  
  • Reiniciar o serviço do cluster:
    systemctl restart postgresql@<versao>-<cluster>.service
  • Recarregar a configuração sem interromper conexões ativas: systemctl reload postgresql@<versao>-<cluster>.service
  • Exibir o status atual de um cluster:
    systemctl status postgresql@<versao>-<cluster>.service

Note que a versão e o nome do cluster são opcionais. Se você não colocá-los explicitamente, você irá realizar essas ações em todos os clusters instalados no servidor ao mesmo tempo. Se houver apenas um cluster no servidor, então não fará diferença.

Exemplos:

  • Inicializa todos os clusters do servidor:
    systemctl start postgresql
  • Para o cluster “main” com a versão 16:
    systemctl stop postgresql@16-main

Comandos utilizando o pg_ctlcluster:

  • Iniciar um cluster:
    pg_ctlcluster <versão> <cluster> start
  • Parar um cluster (como informado, parar dessa maneira pode acarretar impacto nas inicializações automáticas):
    pg_ctlcluster <versão> <cluster> stop
  • Reiniciar um cluster:
    pg_ctlcluster <versão> <cluster> restart
  • Recarregar a configuração sem interromper conexões ativas:
    pg_ctlcluster <versão> <cluster> reload 
  • Exibir o status atual de um cluster:
    pg_ctlcluster <versão> <cluster> status
  • Promover um servidor standby (réplica) a master:
    pg_ctlcluster <versão> <cluster> promote

Ao utilizar os comandos de clusters, é importante sempre apontar para qual cluster será direcionado o comando, para evitar impacto em todos.

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

Se for necessário instalar mais de uma versão do PostgreSQL (serve para casos de upgrade de versão ou desenvolvimento e/ou homologação do PostgreSQL em mais de uma versão), podemos instalá-la com o mesmo comando utilizado para instalação via repositório PGDG e apontar a versão desejada. Aqui, escolhemos adicionar a 15, então ficou:

apt install postgresql-15

Para checar as versões instaladas, é só utilizar o mesmo comando que mostramos anteriormente:

dpkg -l | grep postgresql

Após instalar sua segunda versão, se você consultar o serviço, verá que não há mudanças, porém, nos processos, devem ser acrescentadas etapas referentes à nova versão instalada, conforme imagem abaixo:

Debian shell: consultando processos com duas versões do PostgreSQL instaladas
# ps faux | grep postgres
root      155209  0.0  0.1   3876  1796 pts/0    S+   14:56   0:00          \_ grep postgres
postgres   79108  0.0  3.0 217112 30136 ?        Ss   Feb05   0:09 /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -c config_file=/etc/postgresql/15/main/postgresql.conf
postgres   79109  0.0  0.7 217240  7164 ?        Ss   Feb05   0:00  \_ postgres: 15/main: checkpointer
postgres   79110  0.0  0.6 217256  6068 ?        Ss   Feb05   0:03  \_ postgres: 15/main: background writer
postgres   79112  0.0  1.0 217112 10196 ?        Ss   Feb05   0:02  \_ postgres: 15/main: walwriter
postgres   79113  0.0  0.9 218700  9084 ?        Ss   Feb05   0:02  \_ postgres: 15/main: autovacuum launcher
postgres   79114  0.0  0.7 218680  7148 ?        Ss   Feb05   0:00  \_ postgres: 15/main: logical replication launcher
postgres  154416  0.0  3.0 217600 30368 ?        Ss   14:01   0:00 /usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main -c config_file=/etc/postgresql/16/main/postgresql.conf
postgres  154417  0.0  0.8 217736  8636 ?        Ss   14:01   0:00  \_ postgres: 16/main: checkpointer
postgres  154418  0.0  0.6 217752  6024 ?        Ss   14:01   0:00  \_ postgres: 16/main: background writer
postgres  154420  0.0  1.0 217600 10172 ?        Ss   14:01   0:00  \_ postgres: 16/main: walwriter
postgres  154421  0.0  0.8 219204  8728 ?        Ss   14:01   0:00  \_ postgres: 16/main: autovacuum launcher
postgres  154422  0.0  0.7 219176  7136 ?        Ss   14:01   0:00  \_ postgres: 16/main: logical replication launcher

Em relação às portas utilizadas, é possível conferi-las dentro do arquivo postgresql.conf, em /etc/postgresql/<versão>/<cluster>/, conforme citado anteriormente, sendo o comando grep uma forma simples de fazer isso:

cat postgresql.conf | grep port

Como podemos ver na imagem abaixo, a primeira instalação (versão 16) foi para a porta 5432, e a segunda (versão 15) ficou com outra porta disponível, a 5434.

Debian shell: consultando portas associadas ao PostgreSQL
# cat /etc/postgresql/16/main/postgresql.conf | grep port
port = 5432                             # (change requires restart)

# cat /etc/postgresql/15/main/postgresql.conf | grep port
port = 5434                             # (change requires restart)

Agora com duas versões instaladas, o acesso ao shell do PostgreSQL muda um pouco: se usarmos o comando que já foi mostrado (psql), acessaremos apenas a versão que foi instalada primeiro, isso por conta da porta padrão (5432) ter sido vinculada à primeira instalação; portanto, se omitirmos a porta, o psql vai sempre se conectar nessa. Para acessarmos o shell de versões posteriores, precisamos apontar a porta que a versão em questão utiliza, e como já sabemos como consultar isso, o novo comando vai incluir o parâmetro -p referente à porta, ficando desta forma: 

Debian shell: acessando o psql com parâmetro de porta
$ psql -p 5434
psql (16.2 (Debian 16.2-1.pgdg120+1), server 14.11 (Debian 14.11-1.pgdg120+1))
Type "help" for help.

postgres=#

Note que aqui estamos usando o client do psql na versão 16, mas o servidor está na versão 14.

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

Se você vai 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/postgresql. Numa instalação padrão do Linux, esse diretório fica na partição raiz.

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

Debian shell: consultando partições
# df -h -t ext4
Filesystem      Size  Used  Avail Use% Mounted on
/dev/vda1        35G    2.4G      31G   8% /
/dev/sda        100G      24K      95G   1% /mnt/postgres

Caso deseje alterar a estrutura das pastas pós-instalação e salvar seu banco em outro diretório, é possível fazer isso alterando o arquivo de configuração de clusters, mais especificamente o trecho onde é determinado o padrão de diretórios dos dados. Esse arquivo fica em /etc/postgresql-common/createcluster.conf. 

Este é o trecho onde podemos editar o caminho de registro de novos clusters (especificamente na frente de data_directory =):

Debian shell: editando o arquivo createcluster.conf
# Default data directory.
data_directory = '/mnt/postgresql/%v/%c'

Após edição, o novo caminho ficou assim: data_directory = '/mnt/postgresql/%v/%c'. Além de mudar seu diretório, não se esqueça de descomentar a linha do arquivo removendo o símbolo “#” no início dela, conforme exemplo.

Conforme trecho abaixo, é possível ver o novo local, definido como padrão, sendo utilizado para criar este novo cluster, que chamamos de “prod”:

Debian shell: criando e listando clusters
# pg_lsclusters
Ver Cluster        Port Status Owner    Data directory                        Log file
14  main           5435 online postgres /var/lib/postgresql/14/main           /var/log/postgresql/postgresql-14-main.log
15  main           5434 online postgres /var/lib/postgresql/15/main           /var/log/postgresql/postgresql-15-main.log
16  main           5432 online postgres /var/lib/postgresql/16/main           /var/log/postgresql/postgresql-16-main.log

# pg_createcluster 16 prod --start
Creating new PostgreSQL cluster 16/meunovocluster ...
/usr/lib/postgresql/16/bin/initdb -D /mnt/postgresql/16/prod --auth-local peer --auth-host scram-sha-256 --no-instructions
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 "C.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.

fixing permissions on existing directory /mnt/postgresql/16/prod ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
Ver Cluster        Port Status Owner    Data directory
       Log file

# pg_lsclusters
Ver Cluster  Port Status Owner    Data directory                                  Log file
14   main        5435 online postgres /var/lib/postgresql/14/main  /var/log/postgresql/postgresql-14-main.log
15   main        5434 online postgres /var/lib/postgresql/15/main  /var/log/postgresql/postgresql-15-main.log
16   main        5432 online postgres /var/lib/postgresql/16/main  /var/log/postgresql/postgresql-16-main.log
16  prod    5436 online postgres /mnt/postgresql/16/prod           /var/log/postgresql/postgresql-16-prod.log

Geralmente, removemos todos os clusters que ficam fora da partição escolhida e deixamos no diretório apenas os que realmente vamos utilizar.

Conclusão

Você pode fazer uma instalação padrão do PostgreSQL em menos de 5 minutos se souber o que está fazendo. O processo em si é simples e rápido. No entanto, existem várias opções para lidar com diferentes cenários. Além disso, a administração básica do servidor também tem suas peculiaridades no Debian e derivados. É importante testar a instalação e a administração em laboratório, até você se sentir confortável, antes de trabalhar com um ambiente crítico por aí.

Compartilhe

Você pode gostar

Tipos de cargas dos bancos de dados

Introdução Cargas de dados referem-se aos diferentes tipos de operações e transações que um banco de dados deve processar. Essas cargas variam conforme o tipo

Catálogo do sistema (pg_catalog)

Introdução O pg_catalog é um schema especial no PostgreSQL que guarda todos os segredos do seu banco de dados. Quer saber como suas tabelas são

Arquivos, diretórios e processos

Introdução No PostgreSQL, a organização de arquivos e diretórios, bem como a gestão de processos, são componentes fundamentais para entender o seu funcionamento. Este artigo

plugins premium WordPress