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
# 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”:
# 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:
# 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:
# 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:
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.
Abaixo está o trecho da página com comandos úteis que iremos copiar e utilizar no processo:
# 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:
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:
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:
# 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
$ /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:
# 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
# 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:
# 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:
# 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.
# 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:
$ 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:
# 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 =):
# 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”:
# 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í.