Como instalar o PostgreSQL no Linux (Debian) compilado

Introdução

Agora que já vimos como instalar o PostgreSQL no Windows, chegou a hora de elevar o nível da brincadeira com a instalação no Linux. Elevar porque, apesar de esse sistema operacional ser menos utilizado em comparação ao outro e também intimidar mais as pessoas sem o uso da interface gráfica, existem estudos que demonstram melhor performance do PostgreSQL em sistemas de base Linux (estamos trabalhando em testes e em breve teremos artigos sobre isso!), muito por ele ter nascido para rodar em ambientes Unix e derivados, conforme citado no artigo anterior. 

Quando o assunto é instalar o PostgreSQL, considerar a opção de compilar o código-fonte abre portas para uma experiência de banco de dados única. Essa abordagem permite uma personalização total, ajustando o PostgreSQL para necessidades mais específicas. Antes, essa era a única opção de instalação do PostgreSQL disponível, depois vieram os pacotes nativos das distribuições (que não permitem a você escolher qual versão vai instalar) e, finalmente, o repositório oficial da comunidade PostgreSQL, conhecida como PGDG (PostgreSQL Global Development Group). Assim, instalar o PostgreSQL via compilação tornou-se um processo um tanto obsoleto, e vamos entender se você quiser pular para o próximo capítulo. Sério! Sem dramas aqui. No entanto, se você quiser aprender um pouco mais sobre o processo e se tornar mais íntimo com o que acontece por baixo do capô, recomendamos que você siga esse tutorial pelo menos uma vez na vida. 

Pode acontecer também de um dia você se deparar com um Unix, como um Solaris, HP-UX, AIX, FreeBSD ou outra distribuição Linux não suportada pelo PGDG, e realmente precisar compilar o PostgreSQL na mão. Honestamente, esperamos que você não precise. Existe ainda a lenda de que o PostgreSQL compilado é mais rápido que o PostgreSQL instalado por pacotes. Será? Vamos realizar alguns testes mais a frente e veremos o que vamos descobrir.

Agora, vamos mergulhar juntos nesta jornada e ver como essa escolha pode transformar sua experiência com o PostgreSQL no Linux Debian. Usaremos como referência o guia de instalação a partir do código-fonte do site oficial PostgreSQL.

Neste artigo, veremos:

  • Prerrequisitos
  • Download do código-fonte
  • Compilação
  • Destino de arquivos
  • Criação de usuário
  • Criação do cluster
  • Serviço
  • Processos em execução
  • Inicialização automática

Prerrequisitos

Como boa prática, o primeiro passo de qualquer instalação é atualizar a lista de pacotes disponíveis nos repositórios configurados no sistema, como também atualizar esses pacotes para suas versões mais recentes. 

Aqui estamos utilizando acesso de superusuário/root, caso esteja com outro acesso basta acrescentar “sudo” na frente de todos os comandos. Faremos as atualizações citadas com os dois comandos abaixo:

ShellSession
apt-get update

apt-get upgrade

Agora, para começar, será necessário instalar algumas dependências essenciais para que o processo de compilação ocorra com sucesso. É possível ter mais informações sobre cada uma delas na página oficial do site do PostgreSQL. Pode ser necessário confirmar a instalação de algumas dependências com “y”.

Abaixo está o comando necessário referente às respectivas dependências: Make, GCC, ICU, GNU Readline, Zlib e Pkg-config:

ShellSession
apt-get install make build-essential libicu-dev libreadline-dev zlib1g-dev pkg-config

Download do código-fonte

Vamos pegar o código-fonte do PostgreSQL direto da página oficial de download, onde são disponibilizadas duas opções de arquivo:

  • postgresql-version.tar.gz: usa algoritmo de compressão gzip, sendo mais eficiente em termos de velocidade e menos em relação ao espaço em disco;
  • postgresql-version.tar.bz2: usa algoritmo de compressão bzip2, sendo mais eficiente em compressão e economia de espaço em disco e menos em velocidade.

Optamos por baixar a última versão disponível na data de criação deste artigo, sendo ela a versão 16.2, no arquivo tipo tar.gz:

ShellSession
wget https://ftp.postgresql.org/pub/source/v16.2/postgresql-16.2.tar.gz
Debian shell: download do código-fonte do PostgreSQL, versão 16.2
# wget https://ftp.postgresql.org/pub/source/v16.2/postgresql-16.2.tar.gz
--2024-03-06 18:21:51--  https://ftp.postgresql.org/pub/source/v16.2/postgresql-16.2.tar.gz
Resolving ftp.postgresql.org (ftp.postgresql.org)... 72.32.157.246, 87.238.57.227, 147.75.85.69, ...
Connecting to ftp.postgresql.org (ftp.postgresql.org)|72.32.157.246|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 32558575 (31M) [application/octet-stream]
Saving to: ‘postgresql-16.2.tar.gz’
postgresql-16.2.ta 100%[===============>]  31.05M  38.1MB/s    in 0.8s
2024-03-06 18:21:52 (38.1 MB/s) - ‘postgresql-16.2.tar.gz’ saved [32558575/32558575]

Após feito o download, é hora de descompactar o arquivo baixado: 

ShellSession
tar xvf postgresql-16.2.tar.gz

Compilação

Agora que temos nosso código em mãos, precisamos fazer a compilação dele. Para isso, você deve entrar na pasta gerada após a descompactação (postgresql-<versão>) e rodar um comando para configuração do ambiente antes da compilação:

ShellSession
./configure

Esse comando nos permite ainda utilizar algumas opções para personalização da instalação, como definição de diretório, porta e inclusão de extensões e ferramentas. Mais informações podem ser encontradas nesta página do site PostgreSQL.

Agora, é preciso rodar dois comandos para realizar a compilação, sendo o primeiro para compilar e reconstruir partes fundamentais do sistema operacional, e o segundo, para instalar os binários resultantes e outros arquivos no sistema (essa etapa pode demorar um pouquinho):

ShellSession
make world
make install

Feita a compilação, você deve entrar no diretório contrib, dentro da pasta na qual já está (~/postgresql-16.2/contrib) e rodar novamente comandos do utilitário make. Isso serve para garantir a disponibilização das extensões do PostgreSQL, que podem vir a ser úteis no futuro (elas não ficarão disponíveis automaticamente nos seus bancos de dados, mas você terá a possibilidade de utilizá-las depois através do comando CREATE EXTENSION):

ShellSession
make all
make install

Se houver algum erro ao executar algum dos comandos com make, antes de tentar novamente é importante rodar make clean para remover os arquivos gerados na tentativa de compilação e iniciar uma nova do zero.Feita a compilação, diferente da instalação via pacotes, é necessário criar manualmente o diretório onde serão armazenados os dados das bases criadas (comando sem saída):

ShellSession
mkdir -p /var/lib/pgsql/data

Destino de arquivos

Após a instalação do PostgreSQL, temos uma estrutura de pastas para armazenamento dos arquivos e dados:

  • Principal diretório, local onde são armazenados os executáveis, arquivos de cabeçalho, bibliotecas e outros:

/usr/local/pgsql/

  • Diretório dos executáveis do PostgreSQL:

/usr/local/pgsql/bin/

  • Diretório que contém os arquivos de cabeçalho necessários para compilar programas que interagem com PostgreSQL:

/usr/local/pgsql/include/

  • Diretório de bibliotecas compartilhadas:

/usr/local/pgsql/lib/

  • Diretório criado manualmente, sendo responsável por armazenar dados de tabelas, logs etc.:

/var/lib/pgsql/data/

Criação de usuário

Além da criação manual da pasta data, também é necessário criar o usuário postgres (que mais uma vez, na instalação via pacotes, é criado automaticamente), sendo importante para segurança e isolamento de serviços:

adduser postgres

Debian shell: inclusão do usuário “postgres”
# adduser postgres
Adding user `postgres' ...
Adding new group `postgres' (1001) ...
Adding new user `postgres' (1001) with group `postgres (1001)' ...
Creating home directory `/home/postgres' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for postgres
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y
Adding new user `postgres' to supplemental / extra groups `users' ...
Adding user `postgres' to group `users' ...

E então, para garantir as permissões necessárias do diretório principal do banco ao usuário postgres, rodaremos este comando (sem saída):

ShellSession
chmod 700 /var/lib/pgsql/data
chown postgres: /var/lib/pgsql/data

Criação do cluster

Para criarmos nosso cluster do banco de dados, o primeiro passo é mudar para o usuário que acabamos de criar:

ShellSession
su - postgres

Depois, rodar este comando para inicializar e criar o cluster:

ShellSession
/usr/local/pgsql/bin/initdb -D /var/lib/pgsql/data
Debian shell: criação do cluster do banco de dados
$ /usr/local/pgsql/bin/initdb -D /var/lib/pgsql/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 "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/pgsql/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 ... Etc/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/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start

Seguindo a própria saída anterior, vamos iniciar o servidor de banco de dados:

ShellSession
/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start
Debian shell: inicialização do servidor PostgreSQL
$ /usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start
waiting for server to start.... done
server started

Então, podemos criar nosso primeiro banco de dados, neste caso, conforme tutorial oficial, nomeado de ‘test’ (comando sem saída):

ShellSession
/usr/local/pgsql/bin/createdb test

Para acessar o psql e administrar o banco, podemos usar:

ShellSession
/usr/local/pgsql/bin/psql test
Debian shell: psql do banco de dados “test”
$ /usr/local/pgsql/bin/psql test
psql (16.2)
Type "help" for help.
test=#

Serviços e processos

Serviços

Para gerenciar o serviço do PostgreSQL, podemos contar com os comandos pg_ctl, que devem ser rodados pelo usuário postgres:

  • Iniciar o serviço:

/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data start

  • Parar o serviço:

/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data stop

  • Reiniciar o serviço:

/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data restart

  • Recarregar o serviço (não impacta a disponibilidade do serviço):

/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data reload

  • Conferir o status do serviço:

/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data status

  • Promover um servidor standby a master:

/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data promote

Além disso, também podemos contar com o executável postgres para iniciar o servidor no modo interativo, ou seja, permanecendo a execução e exibindo logs enquanto estiver ativo (é possível interromper com “Ctrl + C”, parando o serviço):

/usr/local/pgsql/bin/postgres -D /var/lib/pgsql/data/

Outra opção de recarregar as configurações do serviço é pelo envio do sinal HUP ao processo do PostgreSQL, necessitando da informação do ID do processo (é possível ter acesso pelo comando de checar status exibido anteriormente):

kill -HUP <ID_processo>

Processos

Para checar os processos do PostgreSQL, podemos usar:

ShellSession
ps aux | grep postgres
Debian shell: processos postgresql
# ps aux | grep postgres
root       26930  0.0  0.3   6104  3352 pts/0    S    14:23   0:00 su - postgres
postgres   26931  0.0  0.4   5536  4784 pts/0    S+   14:23   0:00 -bash
postgres   27044  0.0  2.0 197300 20572 ?        Ss   14:47   0:00 /usr/local/pgsql/bin/postgres -D /var/lib/pgsql/novo_cluster -p 5434
postgres   27045  0.0  1.8 197572 18180 ?        Ss   14:47   0:00 postgres: checkpointer
postgres   27046  0.0  0.4 197432  4432 ?        Ss   14:47   0:00 postgres: background writer
postgres   27048  0.0  0.8 197432  8256 ?        Ss   14:47   0:00 postgres: walwriter
postgres   27049  0.0  0.5 198908  5540 ?        Ss   14:47   0:00 postgres: autovacuum launcher
postgres   27050  0.0  0.5 198888  5556 ?        Ss   14:47   0:00 postgres: logical replication launcher
postgres   27430  0.0  2.0 197300 20576 ?        Ss   15:29   0:00 /usr/local/pgsql/bin/postgres -D /var/lib/pgsql/data
postgres   27431  0.0  0.4 197440  4400 ?        Ss   15:29   0:00 postgres: checkpointer
postgres   27432  0.0  0.6 197432  5948 ?        Ss   15:29   0:00 postgres: background writer
postgres   27434  0.0  0.9 197432  9636 ?        Ss   15:29   0:00 postgres: walwriter
postgres   27435  0.0  0.7 198908  7372 ?        Ss   15:29   0:00 postgres: autovacuum launcher
postgres   27436  0.0  0.7 198888  6956 ?        Ss   15:29   0:00 postgres: logical replication launcher

Inicialização automática

Habilitar a inicialização automática do nosso servidor PostgreSQL com uma instalação via código compilado pede alguns passos a mais em comparação com a instalação por pacotes (que necessita de apenas um comando), como a criação de um arquivo de unidade, seguido do carregamento de configurações do systemctl para finalizarmos com a habilitação no boot. Então, para começar:

  • Vamos criar um arquivo de texto (que vai ser nosso arquivo de unidade do systemd):

nano /etc/systemd/system/postgresql.service

  • Deve-se adicionar nesse arquivo o seguinte conteúdo (para sair basta apertar “Ctrl + X” e “y” para salvar a inserção de texto, seguido de Enter para confirmar tudo):

Conteúdo do arquivo de unidade

ShellSession
[Unit]
Description=PostgreSQL Database Server
Documentation=https://www.postgresql.org/docs/current/static/
[Service]
ExecStart=/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data start
ExecStop=/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data stop
ExecReload=/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data reload
TimeoutSec=300
User=postgres
Group=postgres
[Install]
WantedBy=default.target
  • Agora que temos o arquivo criado, precisamos recarregar as configurações do systemd para que ele seja reconhecido:
ShellSession
systemctl daemon-reload
  • E, por fim, basta habilitar o serviço postgresql para iniciar no boot:
    systemctl enable postgresql.service

Pronto! Seu servidor PostgreSQL será iniciado automaticamente ao ligar a máquina. Caso queira conferir, basta utilizar o comando abaixo, que verifica se um serviço está habilitado para iniciar no boot:

ShellSession
systemctl is-enabled postgresql.service

Debian shell: inicialização no boot habilitada

ShellSession
# systemctl is-enabled postgresql.service
enabled

Conclusão

Por mais que essa maneira de instalar o PostgreSQL demore um pouco mais e tenha alguns passos manuais que são automatizados na instalação via pacotes, ao escolher instalar através da compilação do código-fonte, você começa a entender melhor como as coisas funcionam internamente. Este conhecimento é fundamental para aqueles que desejam se aprofundar no conhecimento sobre os mecanismos internos do PostgreSQL. É só a ponta do iceberg, mas é um bom começo. Veremos nos próximos artigos, formas mais simples e eficientes de instalar e manter o PostgreSQL em servidores Linux.

Compartilhe

Você pode gostar

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

Utilização de SQL básico

Introdução Já percorremos um bom caminho até aqui. Instalamos o PostgreSQL em diferentes cenários, vimos algumas ferramentas para utilização no dia a dia, mas você

plugins premium WordPress