Post

Guia de Instalação e Configuração do PostgreSQL no Oracle Linux 9

Guia para instalação do PostgreSQL no Oracle Linux 9, incluindo configuração de infraestrutura, otimizações de performance e instalação do TimescaleDB.

Guia de Instalação e Configuração do PostgreSQL no Oracle Linux 9

1. Introdução

Este guia detalha o processo de instalação do PostgreSQL no Oracle Linux 9 utilizando o repositório oficial do PostgreSQL. Esta abordagem é a mais recomendada para a maioria dos usuários, pois simplifica a instalação, o gerenciamento de dependências e as atualizações futuras, garantindo a estabilidade e a segurança do ambiente. O guia abrange desde a preparação inicial da infraestrutura até a configuração do banco de dados e a instalação opcional da extensão TimescaleDB, fornecendo um roteiro completo para administradores de sistemas e desenvolvedores que buscam uma solução robusta e de fácil manutenção.

Seguir este guia permitirá uma implantação eficiente do PostgreSQL, otimizada para o ambiente Oracle Linux 9, com foco na performance e na integração com as ferramentas de gerenciamento de pacotes do sistema.

2. Preparação da Infraestrutura

A preparação da infraestrutura é um passo fundamental para garantir uma instalação bem-sucedida e um ambiente de banco de dados robusto. Esta seção aborda a configuração inicial da máquina virtual, incluindo um exemplo de como provisionar a infraestrutura usando Terraform, a desativação de serviços de inicialização automática como o cloud-init, a configuração do hostname e a adição de um disco dedicado para os dados do PostgreSQL.

2.1. Configuração de Infraestrutura com Terraform (Exemplo Ilustrativo)

Para ambientes que utilizam Infraestrutura como Código (IaC), como o Terraform, é possível provisionar a máquina virtual do PostgreSQL de forma automatizada e replicável. O exemplo abaixo demonstra uma configuração básica para uma VM destinada ao PostgreSQL, especificando recursos de CPU, memória e configurações de rede. Este bloco de código serve como um ponto de partida e deve ser adaptado às necessidades específicas do seu ambiente e provedor de nuvem ou virtualização.

1
2
3
4
5
6
7
8
  psql = {
    vcpus  = 2, # Número de vCPUs alocadas para a VM. Ajustar conforme a carga de trabalho esperada.
    memory = "4096", # Memória RAM em MB. 4GB é o mínimo recomendado para testes; para produção, considere 8GB ou mais.
    os     = "oracle9", # Imagem do sistema operacional a ser utilizada, neste caso, Oracle Linux 9.
    networks = [
      { name = "dmz", ipv4 = "10.32.16.18", ipv4_prefix = 24, ipv6 = "fd00:32:16::18", ipv6_prefix = 64, if_name = "ens3", is_default_gateway = true },
    ] # Configurações de rede, incluindo endereços IPv4 e IPv6, e o nome da interface.
  },

2.2. Desativação do cloud-init (Opcional, mas Recomendado para Ambientes Estáveis)

O cloud-init é uma ferramenta amplamente utilizada em ambientes de nuvem para automatizar a configuração inicial de instâncias de máquinas virtuais, como a configuração de rede, hostname e injeção de chaves SSH. Embora seja extremamente útil para o provisionamento inicial, em servidores que terão uma configuração estática e gerenciada manualmente, o cloud-init pode se tornar redundante e até mesmo causar conflitos com configurações personalizadas. Desativá-lo pode melhorar o tempo de boot e evitar comportamentos inesperados.

Existem duas abordagens para desativar o cloud-init:

Opção 1: Desativação Simples (Recomendado para a maioria dos casos)

Esta opção cria um arquivo de sinalização que impede o cloud-init de ser executado na próxima inicialização e remove o pacote do sistema. Isso é suficiente para a maioria dos cenários onde o cloud-init não é mais necessário.

1
2
sudo touch /etc/cloud/cloud-init.disabled # Cria um arquivo vazio que sinaliza ao cloud-init para desativar.
sudo dnf remove cloud-init # Remove o pacote cloud-init do sistema.

Opção 2: Configuração Manual de Rede (Alternativa ao cloud-init para rede)

Se o cloud-init foi responsável pela configuração de rede e você o desativar, será necessário configurar a rede manualmente para garantir a conectividade. Você pode usar a ferramenta nmtui (NetworkManager Text User Interface) para uma configuração interativa ou nmcli (NetworkManager Command Line Interface) para uma configuração via linha de comando.

Usando nmtui (Interface Gráfica em Texto):

1
sudo nmtui # Inicia a interface gráfica em texto para configuração de rede.

Navegue pela interface para configurar suas interfaces de rede, endereços IP, gateway e servidores DNS. Esta é uma opção amigável para quem prefere uma interface visual.

Usando nmcli (Linha de Comando):

Para uma configuração mais automatizada ou para inclusão em scripts, o nmcli oferece controle granular sobre as configurações de rede. O exemplo abaixo configura uma interface ens3 com endereços IPv4 e IPv6, gateway e DNS.

1
2
3
4
sudo nmcli con add con-name ens3 ifname ens3 type ethernet \ # Adiciona uma nova conexão Ethernet chamada ens3.
  ip4 10.32.16.18/24 gw4 10.32.16.1 \ # Configura o endereço IPv4 e o gateway.
  ip6 fd00:32:16::18/64 gw6 fd00:32:16::1 \ # Configura o endereço IPv6 e o gateway.
  ipv4.dns "10.32.16.3" ipv6.dns "fd00:32:16::3" # Configura os servidores DNS para IPv4 e IPv6.

Escolha a opção que melhor se adapta ao seu fluxo de trabalho e às suas necessidades de gerenciamento de rede. A desativação do cloud-init é uma etapa importante para manter a consistência e o controle sobre a configuração do servidor.

2.3. Configuração do Hostname do Servidor

Definir um hostname claro e descritivo para o servidor é essencial para a identificação na rede, gerenciamento de logs e configuração de serviços. O hostname deve seguir um padrão que facilite a compreensão da função do servidor e sua localização na infraestrutura. Além de definir o hostname, é importante configurar o arquivo /etc/hosts para garantir a resolução de nomes localmente, o que pode ser crucial para a comunicação interna de serviços e para evitar problemas de DNS.

1
sudo hostnamectl set-hostname psql.lab.test # Define o hostname completo do servidor. Exemplo: psql.lab.test

Verifique a configuração do hostname para confirmar que as alterações foram aplicadas corretamente. Os comandos hostname -f, hostname -d, hostname -s e hostname -I fornecem diferentes aspectos do hostname e endereços IP do servidor.

1
2
3
4
hostname -f # Exibe o FQDN (Fully Qualified Domain Name), por exemplo: psql.lab.test
hostname -d # Exibe o nome de domínio DNS, por exemplo: lab.test
hostname -s # Exibe o nome curto do host, por exemplo: psql
hostname -I # Exibe todos os endereços IP do host, por exemplo: 10.32.16.18 fd00:32:16::18

Adicione as entradas correspondentes no arquivo /etc/hosts. Isso garante que o servidor possa resolver seu próprio nome e o FQDN sem depender de um servidor DNS externo, o que é útil em ambientes de teste ou em caso de problemas de rede. Existem duas formas de fazer isso:

Opção 1: Adição Dinâmica (Recomendado)

Esta abordagem utiliza comandos para capturar o hostname e os endereços IP do sistema e adicioná-los automaticamente ao /etc/hosts. Isso é útil para automação e para garantir que as entradas estejam sempre atualizadas com a configuração de rede atual.

1
2
3
# Adiciona as entradas IPv4 e IPv6 do hostname no /etc/hosts de forma dinâmica.
echo -e "$(hostname -I | cut -f1 -d' ')\t$(hostname -f)\t$(hostname -s)" | sudo tee -a /etc/hosts
echo -e "$(hostname -I | cut -f2 -d' ')\t$(hostname -f)\t$(hostname -s)" | sudo tee -a /etc/hosts

Opção 2: Adição Manual (Para casos específicos ou ambientes controlados)

Alternativamente, você pode adicionar as entradas manualmente, substituindo os IPs e nomes pelos valores do seu ambiente. Esta opção é mais estática e requer que você insira os valores corretos.

1
2
echo -e "10.32.16.18\tpsql.lab.test\tpsql" | sudo tee -a /etc/hosts
echo -e "fd00:32:16::18\tpsql.lab.test\tpsql" | sudo tee -a /etc/hosts

Ambas as opções garantem que o servidor possa resolver seu próprio nome e FQDN, o que é fundamental para a comunicação interna de serviços e para evitar problemas de DNS, especialmente em ambientes onde a resolução de nomes é crítica.

2.4. Gerenciamento de Snapshots da Máquina Virtual (Altamente Recomendado)

Antes de realizar qualquer alteração significativa no sistema, como a instalação de um banco de dados, é uma prática de segurança fundamental criar um snapshot da máquina virtual. Um snapshot atua como um ponto de restauração, permitindo que o sistema seja revertido rapidamente para um estado anterior em caso de falhas inesperadas, erros de configuração ou problemas durante a instalação. Isso minimiza o tempo de inatividade e a perda de dados.

Os comandos a seguir demonstram como criar, listar, reverter e excluir snapshots utilizando qemu-img e virsh em um ambiente de virtualização KVM/QEMU. Adapte os comandos conforme seu hypervisor (e.g., VMware, VirtualBox, Proxmox).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Criando o snapshot: Primeiro, desligue a VM para garantir a consistência do snapshot.
sudo virsh shutdown --domain psql
# Em seguida, crie o snapshot do disco da VM. Substitua \'psql.qcow2\' pelo caminho do seu disco.
sudo qemu-img snapshot -c snapshot-psql /datastore/images/psql.qcow2

# Listar snapshots existentes para verificar se o snapshot foi criado com sucesso.
sudo qemu-img snapshot -l /datastore/images/psql.qcow2

# Para reverter a VM para um snapshot específico: Desligue a VM e use o comando \'snapshot -a\'.
sudo virsh shutdown psql
sudo qemu-img snapshot -a snapshot-psql /datastore/images/psql.qcow2
# Após a reversão, inicie a VM novamente.
sudo virsh start psql

# Excluir um snapshot: Remova snapshots antigos para liberar espaço em disco e melhorar a performance.
sudo qemu-img snapshot -d snapshot-psql /datastore/images/psql.qcow2

2.5. Adição de Disco Dedicado para Dados do PostgreSQL (/var/lib/pgsql/) (Recomendado para Performance)

Para otimizar a performance de I/O e facilitar o gerenciamento do armazenamento, é altamente recomendado utilizar um disco separado para os dados do PostgreSQL (/var/lib/pgsql/). Esta prática isola as operações de leitura/escrita do banco de dados do sistema operacional, reduzindo a contenção de recursos e permitindo a utilização de sistemas de arquivos otimizados para cargas de trabalho de banco de dados, como o XFS. Além disso, facilita a expansão do armazenamento e a realização de backups e snapshots específicos para os dados.

No Hypervisor (Exemplo com virsh para KVM/QEMU):

Primeiro, crie um novo volume de disco no seu hypervisor. O tamanho do disco deve ser dimensionado de acordo com a projeção de crescimento dos seus dados.

1
2
3
4
5
6
7
8
# Criar um volume de disco de 32GB com formato \'raw\' no pool de armazenamento \'images\'.
sudo virsh vol-create-as --pool images --name psql-vdb.img --capacity 32G --format raw

# Anexar o disco recém-criado à máquina virtual \'psql\'. O disco será visível como \'/dev/vdb\' dentro da VM.
sudo virsh attach-disk psql /datastore/images/psql-vdb.img vdb --targetbus virtio --persistent

# Verificar os discos anexados à VM para confirmar que o novo disco foi adicionado corretamente.
sudo virsh domblklist psql

No Servidor PostgreSQL (Configuração do Disco):

Após anexar o disco no hypervisor, ele precisará ser configurado dentro do sistema operacional da VM. Isso envolve a criação de partições (opcional, mas recomendado para LVM), volumes lógicos, formatação do sistema de arquivos e montagem.

Verifique se o novo disco (/dev/vdb no exemplo) foi reconhecido pelo sistema:

1
sudo fdisk -l | grep vdb -A3

Defina variáveis de ambiente para facilitar a execução dos comandos. Adapte os valores conforme sua necessidade.

1
2
3
4
MOUNT_POINT=/var/lib/pgsql # Ponto de montagem para os dados do PostgreSQL.
DISK_DEVICE=/dev/vdb # Dispositivo do novo disco.
VG_NAME=vg-pgsql # Nome do Volume Group (Grupo de Volumes) LVM.
LV_NAME=lv-pgsql # Nome do Logical Volume (Volume Lógico) LVM.

Crie o volume físico (PV), grupo de volume (VG) e volume lógico (LV) usando LVM (Logical Volume Manager). O LVM oferece flexibilidade para redimensionar volumes no futuro.

1
2
3
sudo pvcreate ${DISK_DEVICE} # Inicializa o disco como um volume físico LVM.
sudo vgcreate ${VG_NAME} ${DISK_DEVICE} # Cria um grupo de volumes com o PV.
sudo lvcreate -l 100%FREE -n ${LV_NAME} ${VG_NAME} # Cria um volume lógico usando todo o espaço livre do VG.

Verifique a criação do Volume Group e Logical Volume:

1
2
sudo vgs | grep pgsql # Exibe informações sobre os Volume Groups, filtrando por vg-pgsql.
sudo lvs | grep pgsql # Exibe informações sobre os Logical Volumes, filtrando por lv-pgsql.

Formate o volume lógico com um sistema de arquivos adequado para banco de dados. O XFS é amplamente recomendado para PostgreSQL devido ao seu bom desempenho com grandes arquivos e cargas de trabalho intensivas em I/O.

1
sudo mkfs.xfs /dev/mapper/vg--pgsql-lv--pgsql # Formata o LV com XFS.

Crie o ponto de montagem e configure o /etc/fstab para que o disco seja montado automaticamente na inicialização do sistema. A opção noatime melhora a performance ao evitar atualizações de timestamp de acesso a arquivos.

1
sudo mkdir ${MOUNT_POINT} # Cria o diretório que servirá como ponto de montagem.

Faça um backup do seu fstab original antes de modificá-lo:

1
sudo cp -p /etc/fstab{,.dist} # Cria uma cópia de segurança do arquivo fstab.

Adicione a entrada no /etc/fstab para montagem automática do volume lógico:

1
echo "/dev/mapper/vg--pgsql-lv--pgsql  ${MOUNT_POINT}    xfs    rw,noatime,attr2,inode64,noquota 0 0" | sudo tee -a /etc/fstab

Recarregue os daemons do systemd e monte o disco. O systemctl daemon-reload é necessário após modificações no fstab para que o systemd reconheça as novas entradas.

1
2
sudo systemctl daemon-reload
sudo mount -a # Monta todos os sistemas de arquivos listados em /etc/fstab que ainda não foram montados.

Verifique se o disco foi montado corretamente no ponto de montagem desejado:

1
df -hT | grep pgsql # Exibe informações sobre sistemas de arquivos montados, filtrando pelo ponto de montagem do PostgreSQL.

3. Instalação do PostgreSQL via Repositório Oficial

A instalação do PostgreSQL via repositório oficial é a maneira mais prática e recomendada para a maioria dos ambientes de produção, pois simplifica o gerenciamento de dependências, atualizações de segurança e manutenção geral. Esta seção detalha como desativar os módulos PostgreSQL padrão do Oracle Linux e adicionar o repositório oficial do PostgreSQL para instalar a versão mais recente e estável.

3.1. Desativando Módulos PostgreSQL Nativos do Sistema Operacional

O Oracle Linux 9, assim como outras distribuições baseadas em RHEL, pode incluir módulos PostgreSQL em seus repositórios padrão. Para evitar conflitos e garantir que a instalação seja feita a partir do repositório oficial do PostgreSQL, é crucial desativar esses módulos antes de prosseguir.

Primeiro, liste os módulos PostgreSQL disponíveis para verificar quais versões estão presentes:

1
dnf module list postgresql # Lista os módulos PostgreSQL disponíveis no repositório do sistema.

Você verá uma saída similar a esta, indicando as versões disponíveis (e.g., 15 e 16):

1
2
3
4
5
6
7
Last metadata expiration check: 0:00:35 ago on Tue Aug 12 11:25:32 2025.
Oracle Linux 9 Application Stream Packages (x86_64)
Name                                 Stream                          Profiles                                    Summary                                                     
postgresql                           15                              client, server [d]                          PostgreSQL server and client module                         
postgresql                           16                              client, server [d]                          PostgreSQL server and client module                         

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Nota: Para garantir uma instalação limpa e evitar conflitos, desativaremos todos os módulos PostgreSQL fornecidos pelo sistema operacional e instalaremos diretamente do repositório oficial do PostgreSQL.

Desative os módulos PostgreSQL existentes. O comando dnf -qy module disable postgresql desativa silenciosamente (-q) e sem confirmação (-y) todos os fluxos do módulo postgresql.

1
sudo dnf -qy module disable postgresql # Desativa todos os módulos PostgreSQL.

Verifique novamente a lista de módulos para confirmar que eles foram desativados. A coluna Stream agora mostrará [x] ao lado das versões, indicando que estão desativadas:

1
dnf module list postgresql

Saída esperada:

1
2
3
4
5
6
7
Last metadata expiration check: 0:04:44 ago on Tue Aug 12 11:25:32 2025.
Oracle Linux 9 Application Stream Packages (x86_64)
Name                                 Stream                          Profiles                                    Summary                                                     
postgresql                           15 [x]                          client, server [d]                          PostgreSQL server and client module                         
postgresql                           16 [x]                          client, server [d]                          PostgreSQL server and client module                         

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

3.2. Adicionando o Repositório Oficial do PostgreSQL (PGDG)

O repositório PostgreSQL Global Development Group (PGDG) fornece os pacotes mais recentes e estáveis do PostgreSQL para diversas distribuições Linux. Adicionar este repositório ao seu sistema permitirá que você instale a versão desejada do PostgreSQL e receba atualizações diretamente da fonte oficial.

1
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Explicação do Comando:

  • rpm -E %{rhel}: Este comando expande para a versão principal do Red Hat Enterprise Linux (RHEL) compatível com o seu Oracle Linux. Isso garante que o pacote do repositório correto seja baixado para a sua versão do sistema operacional.
  • pgdg-redhat-repo-latest.noarch.rpm: Este é o pacote RPM que configura o repositório PGDG no seu sistema.

Após a instalação do pacote do repositório, você pode verificar se os novos repositórios do PostgreSQL foram adicionados e estão ativos:

1
dnf repolist # Lista todos os repositórios configurados no sistema.

Você deverá ver entradas para pgdg-common, pgdg13, pgdg14, pgdg15, pgdg16, pgdg17 (e outras versões, dependendo do que está disponível no momento) na lista de repositórios:

1
2
3
4
5
6
7
8
9
10
repo id                                                         repo name
ol9_UEKR7                                                       Oracle Linux 9 UEK Release 7 (x86_64)
ol9_appstream                                                   Oracle Linux 9 Application Stream Packages (x86_64)
ol9_baseos_latest                                               Oracle Linux 9 BaseOS Latest (x86_64)
pgdg-common                                                     PostgreSQL common RPMs for RHEL / Rocky / AlmaLinux 9 - x86_64
pgdg13                                                          PostgreSQL 13 for RHEL / Rocky / AlmaLinux 9 - x86_64
pgdg14                                                          PostgreSQL 14 for RHEL / Rocky / AlmaLinux 9 - x86_64
pgdg15                                                          PostgreSQL 15 for RHEL / Rocky / AlmaLinux 9 - x86_64
pgdg16                                                          PostgreSQL 16 for RHEL / Rocky / AlmaLinux 9 - x86_64
pgdg17                                                          PostgreSQL 17 for RHEL / Rocky / AlmaLinux 9 - x86_64

3.3. Instalação do Servidor PostgreSQL

Com o repositório PGDG configurado, você pode agora instalar o pacote do servidor PostgreSQL. Para este guia, usaremos a versão 17, que é a mais recente no momento da escrita. O pacote postgresql17-server inclui o servidor PostgreSQL, os utilitários de cliente e as bibliotecas necessárias.

1
sudo dnf install postgresql17-server # Instala o pacote do servidor PostgreSQL 17.

3.4. Inicialização do Cluster de Banco de Dados

Após a instalação do pacote, é necessário inicializar o cluster de banco de dados. Este processo cria a estrutura de diretórios de dados (PGDATA), os arquivos de configuração iniciais e as tabelas de catálogo do sistema. O script postgresql-17-setup initdb é fornecido pelo pacote PGDG para automatizar essa tarefa.

1
sudo postgresql-17-setup initdb # Inicializa o cluster de banco de dados PostgreSQL 17.

3.5. Habilitar e Iniciar o Serviço PostgreSQL

Para que o PostgreSQL seja iniciado automaticamente durante o boot do sistema e para colocá-lo em funcionamento imediatamente, você precisa habilitar e iniciar o serviço Systemd correspondente. O nome do serviço segue o padrão postgresql-<VERSAO_MAJOR>-server.

1
sudo systemctl enable --now postgresql-17 # Habilita e inicia o serviço PostgreSQL 17.

Verifique o status do serviço para confirmar que o PostgreSQL está em execução e operando sem erros:

1
sudo systemctl status postgresql-17 # Verifica o status do serviço PostgreSQL 17.

Uma saída bem-sucedida indicará que o serviço está active (running), similar a:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
● postgresql-17.service - PostgreSQL 17 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-17.service; enabled; preset: disabled)
     Active: active (running) since Tue 2025-08-12 11:45:05 -03; 30s ago
       Docs: https://www.postgresql.org/docs/17/static/
    Process: 2156 ExecStartPre=/usr/pgsql-17/bin/postgresql-17-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 2161 (postgres)
      Tasks: 7 (limit: 21927)
     Memory: 17.6M
        CPU: 68ms
     CGroup: /system.slice/postgresql-17.service
             ├─2161 /usr/pgsql-17/bin/postgres -D /var/lib/pgsql/17/data/
             ├─2162 "postgres: logger "
             ├─2163 "postgres: checkpointer "
             ├─2164 "postgres: background writer "
             ├─2166 "postgres: walwriter "
             ├─2167 "postgres: autovacuum launcher "
             └─2168 "postgres: logical replication launcher "

Aug 12 11:45:04 psql.lab.test systemd[1]: Starting PostgreSQL 17 database server...
Aug 12 11:45:05 psql.lab.test postgres[2161]: 2025-08-12 11:45:05.033 -03 [2161] LOG:  redirecting log output to logging collector process
Aug 12 11:45:05 psql.lab.test postgres[2161]: 2025-08-12 11:45:05.033 -03 [2161] HINT:  Future log output will appear in directory "log".
Aug 12 11:45:05 psql.lab.test systemd[1]: Started PostgreSQL 17 database server.

Se o serviço não iniciar ou apresentar erros, verifique os logs do Systemd usando journalctl -u postgresql-17 para obter mais detalhes sobre a causa do problema. Com o serviço ativo e em execução, o PostgreSQL está agora operacional e pronto para receber conexões.

4. Instalação da Extensão TimescaleDB (Opcional)

O TimescaleDB é uma extensão de código aberto para PostgreSQL que transforma o banco de dados em uma poderosa solução de série temporal. Ele permite que o PostgreSQL lide eficientemente com grandes volumes de dados de séries temporais, oferecendo funcionalidades avançadas para ingestão, consulta e análise desses dados. Se sua aplicação lida com dados de sensores, logs, métricas financeiras ou qualquer outro tipo de dado temporal, a instalação do TimescaleDB pode ser extremamente benéfica.

4.1. Adicionando o Repositório TimescaleDB

Para instalar o TimescaleDB via dnf, é necessário adicionar o repositório oficial do Timescale. Este repositório fornecerá os pacotes pré-compilados da extensão, simplificando a instalação e as atualizações.

1
2
3
4
5
6
7
8
9
10
11
12
sudo tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL

Explicação do Comando:

Este comando cria um novo arquivo de repositório (timescale_timescaledb.repo) no diretório /etc/yum.repos.d/. As variáveis $(rpm -E %{rhel}) e \$basearch garantem que o baseurl aponte para o repositório correto para a sua versão do Oracle Linux e arquitetura.

4.2. Instalação do Pacote TimescaleDB

Com o repositório configurado, você pode instalar o pacote TimescaleDB específico para a sua versão do PostgreSQL. Para a versão 17 do PostgreSQL, o pacote correspondente é timescaledb-2-postgresql-17.

1
sudo dnf install timescaledb-2-postgresql-17 # Instala o pacote TimescaleDB para PostgreSQL 17.

4.3. Otimização da Configuração do PostgreSQL com timescaledb-tune

O TimescaleDB fornece uma ferramenta de ajuste (timescaledb-tune) que otimiza automaticamente as configurações do postgresql.conf para melhorar o desempenho da extensão. Esta ferramenta ajusta parâmetros como shared_preload_libraries, shared_buffers, effective_cache_size, e configurações de paralelismo e WAL, com base nos recursos do seu sistema.

1
sudo timescaledb-tune --pg-config=/usr/pgsql-17/bin/pg_config # Executa a ferramenta de ajuste.

Durante a execução, a ferramenta fará uma série de perguntas interativas. Responda y (yes) para aceitar as recomendações. A saída será similar a:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Using postgresql.conf at this path:
/var/lib/pgsql/17/data/postgresql.conf

Is this correct? [(y)es/(n)o]: y
Writing backup to:
/tmp/timescaledb_tune.backup202508121152

shared_preload_libraries needs to be updated
Current:
#shared_preload_libraries = ''
Recommended:
shared_preload_libraries = 'timescaledb'
Is this okay? [(y)es/(n)o]: y
success: shared_preload_libraries will be updated

Tune memory/parallelism/WAL and other settings? [(y)es/(n)o]: y
Recommendations based on 3.39 GB of available memory and 2 CPUs for PostgreSQL 17

Memory settings recommendations
Current:
shared_buffers = 128MB
#effective_cache_size = 4GB
#maintenance_work_mem = 64MB
#work_mem = 4MB
Recommended:
shared_buffers = 887743kB
effective_cache_size = 2600MB
maintenance_work_mem = 443871kB
work_mem = 8877kB
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: memory settings will be updated

Parallelism settings recommendations
Current:
missing: timescaledb.max_background_workers
#max_worker_processes = 8
#max_parallel_workers_per_gather = 2
#max_parallel_workers = 8
Recommended:
timescaledb.max_background_workers = 16
max_worker_processes = 21
max_parallel_workers_per_gather = 1
max_parallel_workers = 2
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: parallelism settings will be updated

WAL settings recommendations
Current:
#wal_buffers = -1
min_wal_size = 80MB
Recommended:
wal_buffers = 16MB
min_wal_size = 512MB
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: WAL settings will be updated

Background writer settings recommendations
success: background writer settings are already tuned

Miscellaneous settings recommendations
Current:
#default_statistics_target = 100
#random_page_cost = 4.0
#checkpoint_completion_target = 0.9
max_connections = 100
#max_locks_per_transaction = 64
#autovacuum_max_workers = 3
#autovacuum_naptime = 1min
#default_toast_compression = 'pglz'
#jit = on
#effective_io_concurrency = 1
Recommended:
default_statistics_target = 100
random_page_cost = 1.1
checkpoint_completion_target = 0.9
max_connections = 50
max_locks_per_transaction = 128
autovacuum_max_workers = 10
autovacuum_naptime = 10
default_toast_compression = lz4
jit = off
effective_io_concurrency = 256
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: miscellaneous settings will be updated
Saving changes to: /var/lib/pgsql/17/data/postgresql.conf

4.4. Reiniciando o Serviço PostgreSQL

Após as alterações de configuração feitas pelo timescaledb-tune, é necessário reiniciar o serviço do PostgreSQL para que as novas configurações sejam aplicadas.

1
2
sudo systemctl restart postgresql-17 # Reinicia o serviço PostgreSQL 17.
sudo systemctl status postgresql-17 # Verifica o status do serviço para confirmar que foi reiniciado com sucesso.

4.5. Verificação da Instalação do TimescaleDB

Para confirmar que o TimescaleDB foi instalado e configurado corretamente, você pode se conectar ao PostgreSQL e verificar se a extensão está disponível e pode ser criada em um banco de dados. Primeiramente, alterne para o usuário postgres e acesse o console psql.

1
2
sudo su - postgres # Alterna para o usuário postgres.
psql # Conecta-se ao console psql.

Dentro do console psql, execute os seguintes comandos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- Verifica se a extensão TimescaleDB está disponível.
SELECT * FROM pg_available_extensions WHERE name = 'timescaledb';

-- Cria a extensão TimescaleDB em um banco de dados (ex: no banco de dados 'postgres').
-- Você deve criar a extensão em cada banco de dados onde deseja usar as funcionalidades do TimescaleDB.
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

-- Verifica a versão da extensão TimescaleDB instalada.
SELECT extversion FROM pg_extension WHERE extname = 'timescaledb';

-- Verifica se o TimescaleDB está ativo e funcionando corretamente.
SELECT * FROM timescaledb_information.timescaledb_config;

\q # Sai do console psql.

Se os comandos acima forem executados sem erros e retornarem as informações esperadas, significa que o TimescaleDB foi instalado e configurado com sucesso em seu ambiente PostgreSQL. Você está agora pronto para começar a criar hypertables e aproveitar os recursos de série temporal do TimescaleDB.

5. Configurações Pós-Instalação e Segurança

Após a instalação básica do PostgreSQL e, opcionalmente, do TimescaleDB, é fundamental realizar algumas configurações adicionais para garantir a segurança, a acessibilidade e o desempenho do seu banco de dados. Esta seção aborda a criação de um usuário administrativo, a permissão de acesso remoto, a configuração de um firewall restritivo e a otimização de diretórios temporários.

5.1. Criação de Usuário com Privilégios Administrativos

Por padrão, o PostgreSQL é instalado com um superusuário postgres. No entanto, é uma boa prática de segurança criar um usuário dedicado para administração, evitando o uso direto do usuário postgres para tarefas rotineiras. Este novo usuário terá privilégios de superusuário e poderá gerenciar o banco de dados de forma segura.

Primeiro, alterne para o usuário postgres para acessar o console psql:

1
sudo su - postgres # Alterna para o usuário postgres.

Dentro do console psql, crie o novo usuário e defina uma senha. Substitua suporte pelo nome de usuário desejado e SUPERUSER pelos privilégios apropriados, se necessário.

1
2
3
4
5
postgres=# CREATE USER suporte WITH SUPERUSER LOGIN; # Cria um novo usuário chamado "suporte" com privilégios de superusuário e permissão de login.
CREATE ROLE
postgres=# \password suporte # Define a senha para o usuário "suporte".
Enter new password for user "suporte": 
Enter it again: 

Após definir a senha, você pode sair do console psql digitando \q.

5.2. Permitindo Acesso Remoto ao PostgreSQL

Por padrão, o PostgreSQL é configurado para aceitar conexões apenas do localhost (127.0.0.1), o que impede o acesso de outras máquinas na rede. Para permitir que clientes remotos se conectem ao seu servidor PostgreSQL, você precisa modificar o arquivo postgresql.conf para que ele escute em todas as interfaces de rede ou em endereços IP específicos.

Edite o arquivo postgresql.conf:

1
sudo vi /var/lib/pgsql/17/data/postgresql.conf # Abre o arquivo de configuração principal do PostgreSQL.

Localize a linha que contém listen_addresses e altere-a para listen_addresses = '*. Isso fará com que o PostgreSQL escute em todas as interfaces de rede disponíveis. Para maior segurança em ambientes de produção, considere especificar endereços IP específicos ou sub-redes em vez de *.

1
2
3
[...] # Conteúdo anterior do arquivo
listen_addresses = '*'                  # what IP address(es) to listen on;
[...] # Conteúdo posterior do arquivo

Após a alteração, salve e feche o arquivo. Em seguida, reinicie o serviço PostgreSQL para que as mudanças entrem em vigor:

1
sudo systemctl restart postgresql-17 # Reinicia o serviço PostgreSQL 17.

5.3. Configuração de Firewall Restritivo para PostgreSQL

Mesmo permitindo o acesso remoto no postgresql.conf, é crucial configurar o firewall do sistema operacional para controlar quais endereços IP podem se conectar à porta do PostgreSQL (padrão: 5432). Isso adiciona uma camada extra de segurança, permitindo apenas conexões de redes ou hosts confiáveis. Utilizaremos o firewalld para configurar regras restritivas.

Primeiro, crie ipsets para definir as redes confiáveis para IPv4 e IPv6. Substitua 10.32.16.0/24 e fd00:32:16::/64 pelas suas redes confiáveis.

1
2
3
4
5
6
7
# IPv4: Cria um novo ipset chamado trusted-nets-v4 para redes IPv4.
sudo firewall-cmd --permanent --new-ipset=trusted-nets-v4 --type=hash:net --option=family=inet
sudo firewall-cmd --permanent --ipset=trusted-nets-v4 --add-entry=10.32.16.0/24 # Adiciona sua rede confiável IPv4.

# IPv6: Cria um novo ipset chamado trusted-nets-v6 para redes IPv6.
sudo firewall-cmd --permanent --new-ipset=trusted-nets-v6 --type=hash:net --option=family=inet6
sudo firewall-cmd --permanent --ipset=trusted-nets-v6 --add-entry=fd00:32:16::/64 # Adiciona sua rede confiável IPv6.

Em seguida, adicione regras ricas ao firewall para permitir o tráfego PostgreSQL (porta 5432) apenas das redes definidas nos ipsets.

1
2
3
4
5
6
7
8
9
10
11
12
13
# IPv4: Permite acesso ao serviço postgresql (porta 5432) apenas de redes no ipset trusted-nets-v4.
sudo firewall-cmd --permanent --add-rich-rule=\
  'rule family="ipv4"\
  source ipset="trusted-nets-v4"\
  service name="postgresql"\
  accept'
  
# IPv6: Permite acesso ao serviço postgresql (porta 5432) apenas de redes no ipset trusted-nets-v6.
sudo firewall-cmd --permanent --add-rich-rule=\
  'rule family="ipv6"\
  source ipset="trusted-nets-v6"\
  service name="postgresql"\
  accept'

Recarregue o firewall para aplicar as novas regras:

1
sudo firewall-cmd --reload # Recarrega as configurações do firewalld.

Verifique as regras do firewall para confirmar que as novas regras foram adicionadas corretamente:

1
sudo firewall-cmd --list-all # Lista todas as configurações ativas do firewalld.

Você deverá ver as regras ricas para o serviço postgresql permitindo acesso apenas das redes configuradas nos ipsets.

Finalmente, configure o pg_hba.conf para usar autenticação scram-sha-256 para as redes permitidas. Isso garante que, mesmo que o firewall seja comprometido, as conexões ainda exijam autenticação forte.

Edite o arquivo pg_hba.conf:

1
sudo vi /var/lib/pgsql/17/data/pg_hba.conf # Abre o arquivo de configuração de autenticação do PostgreSQL.

Adicione as seguintes linhas, substituindo os endereços IP pelas suas redes confiáveis.

1
2
3
4
5
[...] # Conteúdo anterior do arquivo
# IPv4
host    postgres             suporte             10.32.16.0/24           scram-sha-256
# IPv6
host    postgres             suporte             fd00:32:16::/64         scram-sha-256

Salve e feche o arquivo. Reinicie o serviço PostgreSQL para que as alterações no pg_hba.conf entrem em vigor:

1
sudo systemctl restart postgresql-17 # Reinicia o serviço PostgreSQL 17.

5.4. Testando o Acesso Remoto ao PostgreSQL

Após configurar o acesso remoto no postgresql.conf e as regras de firewall, é fundamental testar a conectividade de um cliente remoto. Você pode usar o cliente psql de outra máquina na rede para verificar se a conexão é bem-sucedida e se a autenticação está funcionando corretamente.

Em uma máquina cliente (por exemplo, kube-ctrl no seu exemplo), execute o seguinte comando, substituindo pgsql.lab.test pelo hostname ou IP do seu servidor PostgreSQL e suporte pelo nome do usuário que você criou:

1
psql -h pgsql.lab.test -U suporte postgres # Tenta conectar ao banco de dados "postgres" no servidor "pgsql.lab.test" como o usuário "suporte".

Você será solicitado a inserir a senha para o usuário suporte. Se a conexão for bem-sucedida, você verá o prompt do psql:

1
2
3
4
5
6
7
Password for user suporte: 
psql (15.13 (Debian 15.13-0+deb12u1), server 17.5)
WARNING: psql major version 15, server major version 17.
         Some psql features might not work.
Type "help" for help.

postgres=# 

Nota: O aviso sobre a diferença de versão do psql (cliente) e do servidor é comum e geralmente não impede a funcionalidade básica, mas pode indicar que algumas funcionalidades mais recentes do servidor podem não ser totalmente suportadas pelo cliente mais antigo. Para evitar este aviso, use um cliente psql da mesma versão do servidor ou mais recente.

Para sair do console psql, digite \q.

5.5. Otimização de Performance: Montagem de pg_stat_tmp em Memória RAM (tmpfs)

Para maximizar o desempenho do PostgreSQL, especialmente em ambientes com alta carga de trabalho, é altamente recomendável montar o diretório pg_stat_tmp em um sistema de arquivos temporário baseado em memória RAM (tmpfs). Este diretório armazena dados temporários de estatísticas de execução de consultas, que são frequentemente acessados e modificados pelo servidor PostgreSQL. Ao movê-lo para a RAM, reduz-se drasticamente a latência de I/O associada à escrita e leitura em disco, resultando em uma coleta de estatísticas mais rápida e um otimizador de consultas mais eficiente.

1
echo -e "\ntmpfs /var/lib/pgsql/17/data/pg_stat_tmp tmpfs size=32M,uid=postgres,gid=postgres,nosuid,nodev 0 0" | sudo tee -a /etc/fstab

Explicação da Configuração:

  • tmpfs: Especifica o tipo de sistema de arquivos como tmpfs, que é um sistema de arquivos virtual baseado em memória RAM.
  • /var/lib/pgsql/17/data/pg_stat_tmp: O ponto de montagem para este sistema de arquivos, que é o diretório pg_stat_tmp do PostgreSQL.
  • tmpfs: Repete o tipo de sistema de arquivos.
  • size=32M: Define o tamanho máximo que este sistema de arquivos temporário pode ocupar na memória RAM. O valor de 32M (32 Megabytes) é um ponto de partida razoável para a maioria dos ambientes, mas pode ser ajustado conforme a necessidade e a carga de trabalho do seu banco de dados. Um tamanho muito pequeno pode levar a erros de esgotamento de espaço, enquanto um tamanho muito grande pode consumir memória desnecessariamente.
  • uid=postgres,gid=postgres: Define o proprietário do sistema de arquivos montado como o usuário postgres e o grupo postgres. Isso garante que o processo do PostgreSQL tenha as permissões corretas para acessar e manipular os arquivos neste diretório.
  • nosuid,nodev: Opções de segurança que impedem a execução de binários setuid e a interpretação de dispositivos especiais no sistema de arquivos montado.
  • 0 0: As duas últimas opções são para dump e pass (verificação do sistema de arquivos), respectivamente. 0 0 significa que o sistema de arquivos não será incluído em backups automáticos (dump) e não será verificado pelo fsck durante a inicialização.

Esta linha será adicionada ao arquivo /etc/fstab, garantindo que o pg_stat_tmp seja montado em RAM automaticamente a cada inicialização do sistema. Essa otimização é uma das maneiras mais eficazes de melhorar a responsividade do PostgreSQL em cenários de alta demanda por estatísticas.

Recarregue os daemons do sistema e monte o disco. O systemctl daemon-reload é necessário após modificações no fstab para que o systemd reconheça as novas entradas.

1
2
sudo systemctl daemon-reload # Recarrega a configuração do Systemd.
sudo mount -a # Monta todos os sistemas de arquivos listados em /etc/fstab que ainda não foram montados.

Verifique se o disco foi montado corretamente no ponto de montagem desejado:

1
mount | grep pg_stat_tmp # Exibe informações sobre sistemas de arquivos montados, filtrando pelo ponto de montagem do pg_stat_tmp.

Você deverá ver uma saída similar a:

1
tmpfs on /var/lib/pgsql/17/data/pg_stat_tmp type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=32768k,uid=26,gid=26,inode64)

Com isso, seu ambiente PostgreSQL no Oracle Linux 9 está completamente configurado, otimizado e seguro, pronto para ser utilizado em produção ou desenvolvimento.

This post is licensed under CC BY 4.0 by the author.