O Linux Red Hat tem forte presença no mercado corporativo, sendo uma ótima opção para aplicações dos mais variados tipos: ambientes físicos e virtuais, nuvens privadas e públicas. É uma opção muito comum para pessoas que querem um suporte direto do fornecedor da distribuição. Entre as distribuições derivadas temos o CentOS, o qual escolhemos utilizar neste tutorial. Lembrando que todos os procedimentos serão feitos via shell.
Então, neste artigo vamos ver:
- Instalação com pacotes nativos da distribuição;
- Remoção da instalação;
- Instalação com pacotes do repositório PGDG;
- Destino de arquivos;
- Serviços e processos;
- Gerenciamento do cluster;
- Instalação de mais de uma versão ao mesmo tempo;
- Instalação em diretório/partição alternativa.
Instalação com pacotes nativos
Nesta primeira abordagem, faremos a instalação com pacotes disponibilizados pela própria distribuição, ou seja, uma versão PostgreSQL estável que foi escolhida para ser nativa desse sistema de acordo com a data de lançamento da versão do Red Hat (ou derivado) em uso. Como dito anteriormente, estamos usando CentOS na versão 9, já que é um sistema derivado do Red Hat. Para essa versão, o PostgreSQL nativo disponível na data em que este artigo foi escrito era o da versão 13. Optamos por instalá-lo com acesso de superusuário/root, mas também é possível rodar os comandos citados complementando com sudo no início.
Este não é o método predileto de instalação do PostgreSQL, mas vamos demonstrar a sua execução brevemente, apenas como referência, principalmente sobre como desfazer isso para fazer do jeito ideal, utilizando o repositório do PGDG.
Como boa prática, podemos começar qualquer instalação atualizando todos os pacotes do sistema, para termos acesso às versões mais recentes deles:
dnf update.
Agora, vamos de fato iniciar a instalação com o comando abaixo:
dnf install postgresql-server
# dnf install postgresql-server
Last metadata expiration check: 0:00:53 ago on Fri 16 Feb 2024 03:19:59 PM UTC.
Dependencies resolved.
=====================================================================================
Package Architecture Version Repository Size
=====================================================================================
Installing:
postgresql-server x86_64 13.11-1.el9 appstream 5.7 M
Installing dependencies:
postgresql x86_64 13.11-1.el9 appstream 1.6 M
postgresql-private-libs x86_64 13.11-1.el9 appstream 135 k
Transaction Summary
=====================================================================================
Install 3 Packages
Total download size: 7.5 M
Installed size: 29 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): postgresql-private-libs-13.11-1.el9.x86_64.rpm 900 kB/s | 135 kB 00:00
(2/3): postgresql-13.11-1.el9.x86_64.rpm 7.7 MB/s | 1.6 MB 00:00
(3/3): postgresql-server-13.11-1.el9.x86_64.rpm 19 MB/s | 5.7 MB 00:00
-----------------------------------------------------------------------------------------
Total 12 MB/s | 7.5 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : postgresql-private-libs-13.11-1.el9.x86_64 1/3
Installing : postgresql-13.11-1.el9.x86_64 2/3
Running scriptlet: postgresql-server-13.11-1.el9.x86_64 3/3
Installing : postgresql-server-13.11-1.el9.x86_64 3/3
Running scriptlet: postgresql-server-13.11-1.el9.x86_64 3/3
Verifying : postgresql-13.11-1.el9.x86_64 1/3
Verifying : postgresql-private-libs-13.11-1.el9.x86_64 2/3
Verifying : postgresql-server-13.11-1.el9.x86_64 3/3
Installed:
postgresql-13.11-1.el9.x86_64 postgresql-private-libs-13.11-1.el9.x86_64
postgresql-server-13.11-1.el9.x86_64
Complete!
Depois de rodar o comando, você precisará confirmar a instalação com “y” (yes) e então já será possível observar os downloads e suas barras de carregamento, e com isso serão instalados os pacotes “postrgesql”, “postegresql-server” e “postgresql-private-libs”, que contêm respectivamente o cliente, o servidor e bibliotecas de uso interno do PostgreSQL. Como são divididos em pacotes, é possível instalar apenas o cliente se o uso for só para acessar um outro servidor, mas como vimos, na instalação do pacote do servidor, já vem tudo junto. Para instalar diferentes versões, utilizaremos o repositório PGDG, do qual falaremos mais adiante.
Para conferir os três pacotes que foram instalados, é só utilizar o seguinte comando:
rpm -qa | grep postgresql
# rpm -qa | grep postgresql
postgresql-private-libs-13.11-1.el9.x86_64
postgresql-13.11-1.el9.x86_64
postgresql-server-13.11-1.el9.x86_64
Após a instalação, vamos habilitar a inicialização automática junto com a inicialização do sistema, desta forma:
systemctl enable postgresql-<versão>
# systemctl enable postgresql-16
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-16.service → /usr/lib/systemd/system/postgresql-16.service.
No Red Hat e derivados, é necessário iniciar o serviço do PostgreSQL manualmente, que, por padrão, também usa a porta 5432, e isso pode ser feito com o seguinte comando:
systemctl start postgresql-16
# service postgresql start
Redirecting to /bin/systemctl start postgresql-16.service
Agora que já instalamos e inicializamos o serviço, podemos acessar o shell do PostgreSQL (psql):
su - postgres
psql
Pronto! Você já pode criar sua base, tabelas etc. e gerenciar seu banco de dados.
Remoção da instalação
Para remover a instalação, podemos usar este comando, que seria equivalente ao purge do Debian, já que, além de remover a instalação, também limpa arquivos e dados relacionados ao pacote:
dnf remove postgresql
# dnf remove postgresql
Dependencies resolved.
=========================================================================================
Package Architecture Version Repository Size
=========================================================================================
Removing:
postgresql x86_64 13.11-1.el9 @appstream 5.7 M
Removing dependent packages:
postgresql-server x86_64 13.11-1.el9 @appstream 23 M
Removing unused dependencies:
postgresql-private-libs x86_64 13.11-1.el9 @appstream 327 k
Transaction Summary
=========================================================================================
Remove 3 Packages
Freed space: 29 M
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: postgresql-server-13.11-1.el9.x86_64 1/3
Erasing : postgresql-server-13.11-1.el9.x86_64 1/3
Running scriptlet: postgresql-server-13.11-1.el9.x86_64 1/3
Erasing : postgresql-13.11-1.el9.x86_64 2/3
Erasing : postgresql-private-libs-13.11-1.el9.x86_64 3/3
Running scriptlet: postgresql-private-libs-13.11-1.el9.x86_64 3/3
Verifying : postgresql-13.11-1.el9.x86_64 1/3
Verifying : postgresql-private-libs-13.11-1.el9.x86_64 2/3
Verifying : postgresql-server-13.11-1.el9.x86_64 3/3
Removed:
postgresql-13.11-1.el9.x86_64 postgresql-private-libs-13.11-1.el9.x86_64
postgresql-server-13.11-1.el9.x86_64
Complete!
Após remover, se consultarmos os pacotes com o comando mostrado anteriormente, veremos que não há necessidade de especificar pacote por pacote, pois todos eles serão desinstalados, uma vez que há ausência de saída. Para evitar isso, caso deseje desinstalar apenas um pacote (o de servidor, por exemplo), você deve fazer da seguinte maneira:
dnf remove postgresql-server --setopt=clean_requirements_on_remove=false
# dnf remove postgresql-server --setopt=clean_requirements_on_remove=false
Dependencies resolved.
=========================================================================================
Package Architecture Version Repository Size
=========================================================================================
Removing:
postgresql-server x86_64 13.11-1.el9 @appstream 23 M
Transaction Summary
=========================================================================================
Remove 1 Package
Freed space: 23 M
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: postgresql-server-13.11-1.el9.x86_64 1/1
Erasing : postgresql-server-13.11-1.el9.x86_64 1/1
Running scriptlet: postgresql-server-13.11-1.el9.x86_64 1/1
Verifying : postgresql-server-13.11-1.el9.x86_64 1/1
Removed:
postgresql-server-13.11-1.el9.x86_64
Complete!
Consultando, conseguimos ver os pacotes restantes:
# rpm -qa | grep postgresql
postgresql-private-libs-13.11-1.el9.x86_64
postgresql-13.11-1.el9.x86_64
Instalação com pacotes do repositório PGDG
Esta é a maneira mais apropriada de instalar o PostgreSQL no seu Red Hat e derivados, pois oferece mais liberdade quanto à escolha de uma versão específica, já que vamos utilizar o repositório oficial da comunidade PostgreSQL (conhecida como PGDG, ou PostgreSQL Global Development Group). Antes de fazer a instalação utilizando o repositório do PGDG, você deve remover completamente qualquer pacote do PostgreSQL nativo da sua distribuição, como mostramos anteriormente, para só depois iniciar a instalação a seguir.
Para fazer isso, podemos começar acessando a página oficial de download do PostgreSQL para Red Hat e derivados, de onde iremos consultar o endereço desse repositório e o passo a passo de como instalá-lo para posteriormente instalar o PostgreSQL.
Segue trecho da página onde encontramos essas informações, após selecionar a versão desejada (escolhemos a mais recente: 16), a plataforma (estamos usando CentOS) e a arquitetura do sistema operacional:
# Install the repository RPM:
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Disable the built-in PostgreSQL module:
sudo dnf -qy module disable postgresql
# Install PostgreSQL:
sudo dnf install -y postgresql16-server
# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16
É importante sempre consultar o script no site oficial do PostgreSQL para pegar a versão atualizada do script. Aqui, vamos realizar cada etapa passo a passo para entender melhor o processo e observar cada comando sendo executado individualmente. Para facilitar, vamos continuar rodando todos os comandos logados com o usuário root.
O primeiro passo é adicionar os sistema o repositório PGDG, que vamos usar para instalar o PostgreSQL:
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Last metadata expiration check: 0:00:06 ago on Mon 19 Feb 2024 12:59:40 PM UTC.
pgdg-redhat-repo-latest.noarch.rp 15 kB/s | 11 kB 00:00
Dependencies resolved.
==================================================================
Package Arch Version Repository Size
==================================================================
Installing:
pgdg-redhat-repo noarch 42.0-38PGDG @commandline 11 k
Transaction Summary
==================================================================
Install 1 Package
Total size: 11 k
Installed size: 15 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : pgdg-redhat-repo-42.0-38PGDG.noarch 1/1
Verifying : pgdg-redhat-repo-42.0-38PGDG.noarch 1/1
Installed:
pgdg-redhat-repo-42.0-38PGDG.noarch
Complete!
Após isso, no segundo passo, vamos desativar o uso dos pacotes do PostgreSQL nativos da distribuição para evitar conflitos durante a instalação, utilizando o seguinte comando:
dnf -qy module disable postgresql
# dnf -qy module disable postgresql
Importing GPG key 0x08B40D20:
Userid : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
From : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
Userid : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
From : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
Userid : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
From : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
Userid : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
From : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
Userid : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
From : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
Userid : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
From : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Após isso, podemos instalar o PostgreSQL já na versão desejada (escolhemos a mais recente, versão 16):
dnf install -y postgresql16-server
# dnf install -y postgresql16-server
DigitalOcean Droplet Agent 47 kB/s | 3.3 kB 00:00
Dependencies resolved.
===================================================================
Package Arch Version Repo Size
===================================================================
Installing:
postgresql16-server x86_64 16.2-1PGDG.rhel9 pgdg16 6.8 M
Installing dependencies:
lz4 x86_64 1.9.3-5.el9 baseos 59 k
postgresql16 x86_64 16.2-1PGDG.rhel9 pgdg16 1.7 M
postgresql16-libs x86_64 16.2-1PGDG.rhel9 pgdg16 331 k
Transaction Summary
==================================================================
Install 4 Packages
Total download size: 8.9 M
Installed size: 39 M
Downloading Packages:
(1/4): lz4-1.9.3-5.el9.x86_64.rpm 185 kB/s | 59 kB 00:00
(2/4): postgresql16-libs-16.2-1PG 275 kB/s | 331 kB 00:01
(3/4): postgresql16-16.2-1PGDG.rh 1.1 MB/s | 1.7 MB 00:01
(4/4): postgresql16-server-16.2-1 3.1 MB/s | 6.8 MB 00:02
------------------------------------------------------------------
Total 3.2 MB/s | 8.9 MB 00:02
PostgreSQL 16 for RHEL / Rocky / 2.4 MB/s | 2.4 kB 00:00
Importing GPG key 0x08B40D20:
Userid : "PostgreSQL RPM Repository <pgsql-pkg-yum@lists.postgresql.org>"
Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
From : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : postgresql16-libs-16.2-1PGDG.rhel9.x86 1/4
Running scriptlet: postgresql16-libs-16.2-1PGDG.rhel9.x86 1/4
Installing : lz4-1.9.3-5.el9.x86_64 2/4
Installing : postgresql16-16.2-1PGDG.rhel9.x86_64 3/4
Running scriptlet: postgresql16-16.2-1PGDG.rhel9.x86_64 3/4
Running scriptlet: postgresql16-server-16.2-1PGDG.rhel9.x 4/4
Installing : postgresql16-server-16.2-1PGDG.rhel9.x 4/4
Running scriptlet: postgresql16-server-16.2-1PGDG.rhel9.x 4/4
Verifying : lz4-1.9.3-5.el9.x86_64 1/4
Verifying : postgresql16-16.2-1PGDG.rhel9.x86_64 2/4
Verifying : postgresql16-libs-16.2-1PGDG.rhel9.x86 3/4
Verifying : postgresql16-server-16.2-1PGDG.rhel9.x 4/4
Installed:
lz4-1.9.3-5.el9.x86_64
postgresql16-16.2-1PGDG.rhel9.x86_64
postgresql16-libs-16.2-1PGDG.rhel9.x86_64
postgresql16-server-16.2-1PGDG.rhel9.x86_64
Complete!
Nessa saída, podemos ver que foram instalados os seguintes pacotes:
- lz4-1.9.3-5.el9.x86_64: dependência do PostgreSQL;
- postgresql16-16.2-1PGDG.rhel9.x86_64: cliente do PostgreSQL;
- postgresql16-libs-16.2-1PGDG.rhel9.x86_64: bibliotecas de uso interno que já vimos na instalação anterior;
- postgresql16-server-16.2-1PGDG.rhel9.x86_64: servidor do PostgreSQL.
A partir daqui, já temos a instalação feita e os próximos passos são referentes à sua inicialização. O primeiro comando inicializa o banco com as configurações padrão, ou seja, cria o cluster:
/usr/pgsql-16/bin/postgresql-16-setup initdb
# /usr/pgsql-16/bin/postgresql-16-setup initdb
Initializing database ... OK
O segundo comando serve para habilitar a inicialização automática do PostgreSQL com o sistema:
systemctl enable postgresql-16
# systemctl enable postgresql-16
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-16.service → /usr/lib/systemd/system/postgresql-16.service.
E, por fim, vamos inicializar também o serviço do PostgreSQL, que é um comando sem saída, mas veremos como checar o serviço nos próximos tópicos:
systemctl start postgresql-16
Pronto! Sua versão de preferência do PostgreSQL está instalada e pronta para uso, com o mesmo comando mostrado anteriormente:
su - postgres
psql
Destino de arquivos
Ao instalar o PostgreSQL, a estrutura de pastas geralmente segue um padrão comum para sistemas baseados em Linux, sendo ela:
- Diretório principal do cluster que foi criado nas etapas de instalação, sendo o local onde os dados serão armazenados, incluindo bancos de dados, tabelas etc.:
/var/lib/pgsql/<versão>/data/ - Binários e executáveis específicos de cada versão ficam em:
/usr/pgsql/<versão>/bin/ - Configurações do PostgreSQL, incluindo o principal arquivo de configuração postgresql.conf e o pg_hba.conf, referente à configuração de autenticação do cliente, arquivos de log e outros relacionados podem ser encontrados em:
/var/lib/pgsql/<versão>/data/ - Bibliotecas compartilhadas:
/usr/pgsql/<versão>/lib/ - Scripts de inicialização e configuração:
/usr/pgsql/<versão>/share/ - Documentação oficial incluindo manuais e guias:
/usr/pgsql/<versão>/doc/
Serviços
O serviço postgresql-<versão>.service é responsável por inicializar e parar o servidor PostgreSQL. Para verificar o status desse serviço, bem como algumas informações sobre ele (estado atual, data da última inicialização, informações sobre o processo etc.), você pode utilizar algum destes comandos:
- systemctl status postgresql-<versão>
- pg_ctl status: só roda no usuário postgres e talvez seja necessário digitar todo o caminho até o executável ou adicioná-lo ao path antes com o comando:
export PATH=$PATH:/usr/lib/postgresql/<versao>/bin
# systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.servic>
Active: active (running) since Mon 2024-02-19 13:29:50 UTC; >
Docs: https://www.postgresql.org/docs/16/static/
Process: 15193 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-c>
Main PID: 15198 (postgres)
Tasks: 7 (limit: 4348)
Memory: 20.7M
CPU: 676ms
CGroup: /system.slice/postgresql-16.service
├─15198 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql>
├─15199 "postgres: logger "
├─15200 "postgres: checkpointer "
├─15201 "postgres: background writer "
├─15203 "postgres: walwriter "
├─15204 "postgres: autovacuum launcher "
└─15205 "postgres: logical replication launcher "
Feb 19 13:29:50 centos-lud-teste systemd[1]: Starting PostgreSQL >
Feb 19 13:29:50 centos-lud-teste postgres[15198]: 2024-02-19 13:2>
Feb 19 13:29:50 centos-lud-teste postgres[15198]: 2024-02-19 13:2>
Feb 19 13:29:50 centos-lud-teste systemd[1]: Started PostgreSQL 1>
lines 1-22/22 (END)
$ /usr/pgsql-16/bin/pg_ctl status -D /var/lib/pgsql/16/data
pg_ctl: server is running (PID: 15198)
/usr/pgsql-16/bin/postgres "-D" "/var/lib/pgsql/16/data/"
Processos
Aqui estão alguns dos processos do PostgreSQL no CentOS, sendo revelados pelo comando ps:
# ps faux | grep postgres
postgres 15198 0.0 3.4 212168 27548 ? Ss 13:29 0:00 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
postgres 15199 0.0 0.7 66096 5780 ? Ss 13:29 0:00 \_ postgres: logger
postgres 15200 0.0 1.0 212308 8164 ? Ss 13:29 0:00 \_ postgres: checkpointer
postgres 15201 0.0 0.7 212300 6184 ? Ss 13:29 0:00 \_ postgres: background writer
postgres 15203 0.0 1.3 212300 10664 ? Ss 13:29 0:00 \_ postgres: walwriter
postgres 15204 0.0 1.0 213772 8672 ? Ss 13:29 0:00 \_ postgres: autovacuum launcher
postgres 15205 0.0 1.1 213756 8820 ? Ss 13:29 0:00 \_ postgres: logical replication launcher
Gerenciamento do serviço do cluster
Criação e remoção
No contexto do PostgreSQL, um cluster se refere aos arquivos que compõem um conjunto de bancos de dados gerenciados por uma única instância, rodando em uma única porta. Cada cluster tem sua própria instância, conjunto de configurações, diretórios de dados, arquivos de log e processos associados.
Assim que instalamos o PostgreSQL no Red Hat, conforme mencionado anteriormente, tivemos uma etapa de criação de cluster. Criar um cluster nos permite ter várias instâncias do PostgreSQL em execução no mesmo sistema, cada uma com suas próprias configurações, portas e conjuntos de dados separados, sendo útil quando você precisa hospedar várias aplicações ou projetos, e cada um deles requer configurações independentes e/ou versões diferentes. O padrão desse sistema é que cada instalação tenha apenas um cluster, que não tem nome específico, mas se encontra na pasta data, neste endereço: /var/lib/pgsql/<versão>/data/.
Caso haja necessidade de remover e recriar o cluster, podemos fazer isso com alguns comandos:
Remoção:
Para removermos um cluster, o primeiro passo é desconectá-lo e garantir que não há nenhum processo do PostgreSQL utilizando-o. Para isso, vamos rodar:
systemctl stop postgresql-<versão>
Então podemos removê-lo apagando seu diretório (etapa que remove permanentemente os dados do cluster) com este comando que não imprime saída:
rm -r /var/lib/pgsql/<versão>/data
Criação:
Para criar um cluster no Red Hat, a primeira orientação é mudar para o usuário “postgres” com o comando su – postgres, pois existem operações que não conseguiremos fazer como root. Então basta rodar este comando para criar o novo cluster:
/usr/pgsql-<versão>/bin/initdb -D /var/lib/pgsql/<versão>/data
$ /usr/pgsql-16/bin/initdb -D /var/lib/pgsql/16/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
creating directory /var/lib/pgsql/16/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -l logfile start
Desse modo, podemos iniciar o servidor da base com o comando sugerido pela própria saída acima:
/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -l logfile start
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -l logfile start
waiting for server to start.... done
server started
Embora esse comando funcione normalmente, recomendamos não subir o servidor dessa forma, pois você irá confundir o systemd que gerencia a inicialização automática do PostgreSQL. Por isso, utilize no lugar do “pg_ctl” o “sytemctl”, como veremos a seguir.
Outros processos de gerenciamento do cluster
Para gerenciar os serviços no servidor, temos dois grupos de comandos (demonstrados aqui com o usuário postgres):
- pg_ctl: são os comandos nativos do PostgreSQL, que não recomendados para se utilizar em distribuições Red Hat e derivadas, pois podem impactar na inicialização automática dos serviços;
- systemctl: é o comando utilizado pelo systemd (sistema de inicialização de serviços do Linux) para subir e descer serviços. Ele só roda com poderes de administrador (com o usuário root ou com o sudo) e deve ser utilizado em favor da opção anterior.
Comandos utilizando pg_ctl
:
Iniciar o serviço do cluster:
/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data start
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data start
waiting for server to start....2024-02-28 19:43:20.685 UTC [14703] LOG: redirecting log output to logging collector process
2024-02-28 19:43:20.685 UTC [14703] HINT: Future log output will appear in directory "log".
done
server started
Parar o serviço do cluster:
/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data stop
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data stop
waiting for server to shut down.... done
server stopped
Reiniciar o serviço do cluster:
/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data restart
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2024-02-28 19:45:22.255 UTC [14743] LOG: redirecting log output to logging collector process
2024-02-28 19:45:22.255 UTC [14743] HINT: Future log output will appear in directory "log".
done
server started
Exibir o status atual do cluster:
/usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data status
$ /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data status
pg_ctl: server is running (PID: 14743)
/usr/pgsql-16/bin/postgres "-D" "/var/lib/pgsql/16/data"
Comandos utilizando systemctl:
- Iniciar o serviço do cluster (comando sem saída):
sudo systemctl start postgresql-<versão> - Parar o serviço do cluster (comando sem saída):
sudo systemctl stop postgresql-<versão> - Reiniciar o serviço do cluster (comando sem saída):
sudo systemctl restart postgresql-<versão> - Exibir o status atual do cluster:
sudo systemctl status postgresql-<versão>
$ sudo systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
Active: active (running) since Thu 2024-02-29 13:24:51 UTC; 1min 6s ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 34531 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 34537 (postgres)
Tasks: 7 (limit: 4478)
Memory: 18.2M
CPU: 148ms
CGroup: /system.slice/postgresql-16.service
├─34537 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
├─34538 "postgres: logger "
├─34539 "postgres: checkpointer "
├─34540 "postgres: background writer "
├─34542 "postgres: walwriter "
├─34543 "postgres: autovacuum launcher "
└─34544 "postgres: logical replication launcher "
Feb 29 13:24:51 centos-ludmila-teste systemd[1]: Starting PostgreSQL 16 database server...
Feb 29 13:24:51 centos-ludmila-teste postgres[34537]: 2024-02-29 13:24:51.768 UTC [34537] LOG: redirecting log output to logging collector process
Feb 29 13:24:51 centos-ludmila-teste postgres[34537]: 2024-02-29 13:24:51.768 UTC [34537] HINT: Future log output will appear in directory "log".
Feb 29 13:24:51 centos-ludmila-teste systemd[1]: Started PostgreSQL 16 database server.
- Habilitar inicialização automática do serviço postgresql (comando sem saída):
sudo systemctl enable postgresql-<versão> - Desabilitar inicialização automática do serviço postgresql (comando sem saída):
sudo systemctl disable postgresql-<versão> - Recarregar a configuração do serviço postgresql (comando sem saída):
sudo systemctl reload postgresql-<versão>
Instalação de mais de uma versão ao mesmo tempo
Se for necessário instalar mais de uma versão do PostgreSQL (para casos de um upgrade de versão ou desenvolvimento e/ou homologação do PostgreSQL em mais de uma versão), podemos instalar rodando o comando diretamente, uma vez que já instalamos o repositório RPM no sistema. Desse modo, basta rodar:
dnf install -y postgresql<versão>-server
Aqui escolhemos a versão 15, e esta foi a nossa saída:
# dnf install -y postgresql15-server
DigitalOcean Droplet Agent 45 kB/s | 3.3 kB 00:00
Dependencies resolved.
====================================================================
Package Arch Version Repo Size
====================================================================
Installing:
postgresql15-server x86_64 15.6-1PGDG.rhel9 pgdg15 6.1 M
Installing dependencies:
postgresql15 x86_64 15.6-1PGDG.rhel9 pgdg15 1.5 M
postgresql15-libs x86_64 15.6-1PGDG.rhel9 pgdg15 297 k
Transaction Summary
===================================================================
Install 3 Packages
Total download size: 7.9 M
Installed size: 35 M
Downloading Packages:
(1/3): postgresql15-libs-15.6-1PGD 291 kB/s | 297 kB 00:01
(2/3): postgresql15-15.6-1PGDG.rhe 1.0 MB/s | 1.5 MB 00:01
(3/3): postgresql15-server-15.6-1P 3.3 MB/s | 6.1 MB 00:01
-------------------------------------------------------------------
Total 4.3 MB/s | 7.9 MB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : postgresql15-libs-15.6-1PGDG.rhel9.x86_ 1/3
Running scriptlet: postgresql15-libs-15.6-1PGDG.rhel9.x86_ 1/3
Installing : postgresql15-15.6-1PGDG.rhel9.x86_64 2/3
Running scriptlet: postgresql15-15.6-1PGDG.rhel9.x86_64 2/3
Running scriptlet: postgresql15-server-15.6-1PGDG.rhel9.x8 3/3
Installing : postgresql15-server-15.6-1PGDG.rhel9.x8 3/3
Running scriptlet: postgresql15-server-15.6-1PGDG.rhel9.x8 3/3
Verifying : postgresql15-15.6-1PGDG.rhel9.x86_64 1/3
Verifying : postgresql15-libs-15.6-1PGDG.rhel9.x86_ 2/3
Verifying : postgresql15-server-15.6-1PGDG.rhel9.x8 3/3
Installed:
postgresql15-15.6-1PGDG.rhel9.x86_64
postgresql15-libs-15.6-1PGDG.rhel9.x86_64
postgresql15-server-15.6-1PGDG.rhel9.x86_64
Complete!
Na sequência, é necessário seguir os mesmos passos da instalação padrão aqui: iniciar o cluster, habilitar inicialização automática do serviço e iniciá-lo manualmente na primeira vez, sendo a única mudança a edição da porta no arquivo de configuração (postgresql.conf) para que não haja conflito com a versão já instalada. Sobre qual número usar de porta, considerando que a padrão é a 5432 atribuída à primeira instalação, podemos usar os números seguintes consecutivos até o limite de 65535.
- Iniciar o banco:
/usr/pgsql-15/bin/postgresql-15-setup initdb - Habilitar a inicialização automática com o sistema:
systemctl enable postgresql-15 - Editar o arquivo: /var/lib/pgsql/15/data/postgresql.conf sendo necessário alterar a seguinte informação (descomente a linha removendo o “#”):
port = <número de porta disponível> - Iniciar o serviço:
systemctl start postgresql-15 - Podemos verificar as versões instaladas com o comando abaixo:
rpm -qa | grep postgresql
# rpm -qa | grep postgresql
postgresql16-libs-16.2-1PGDG.rhel9.x86_64
postgresql16-16.2-1PGDG.rhel9.x86_64
postgresql16-server-16.2-1PGDG.rhel9.x86_64
postgresql15-libs-15.6-1PGDG.rhel9.x86_64
postgresql15-15.6-1PGDG.rhel9.x86_64
postgresql15-server-15.6-1PGDG.rhel9.x86_64
Instalação em diretório ou partição alternativa
Se você for fazer uma instalação num ambiente de produção, é muito importante não deixar o cluster na mesma partição do resto do Linux. Por padrão, o PostgreSQL cria o cluster em /var/lib/pgsql. Numa instalação padrão do Red Hat, esse diretório fica na partição raiz.
Você pode verificar as partições existentes com o comando df:
# df -h | grep -v tmpfs
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 25G 1.8G 24G 7% /
/dev/sda 100G 785M 100G 1% /mnt/volume_sfo3_02
Caso deseje alterar a estrutura das pastas pós-instalação e salvar seu banco em outro diretório/partição, é possível fazer isso alterando o arquivo de configuração do serviço no systemd, mais especificamente o trecho onde é determinado o padrão de diretórios dos dados. Esse arquivo fica em /lib/systemd/system/postgresql-16.service.
Primeiro, é preciso dar acesso ao usuário postgres ao diretório escolhido para iniciar o PostgreSQL, pois é ele quem faz as operações aqui. Para isso, você pode usar o comando abaixo, inserindo no final o caminho, dentro de sua nova partição, onde deseja salvar os dados do banco:
chown postgres:postgres <caminho_partição>
No nosso caso, ficou assim:
chown postgres:postgres /mnt/volume_sfo3_02/pgsql/16/data
Após isso, vamos editar o arquivo no systemd /lib/systemd/system/postgresql-16.service
Segue o trecho onde deve-se alterar, descomentando ambas as linhas e alterando apenas o destino na última, de acordo com sua nova partição e diretório desejados:
# [Service]
...
# Environment=PGDATA=/pgdata/16/data # também descomentar e alterar o caminho para o desejado
O nosso ficou:
[Service]
...
Environment=PGDATA=/mnt/volume_sfo3_02/pgsql/16/data
É recomendável manter a estrutura padrão depois que decidir seu diretório de preferência (.../pgsql/16/data) para uma melhor navegação e identificação da versão em uso.
Agora, é necessário recarregar o systemdb, e você pode fazer isso com este comando:
systemctl daemon-reload
Assim, podemos rodar o initdb e, então, iniciar o banco:
/usr/pgsql-<versão>/bin/postgresql-<versão>-setup initdb
Também vamos precisar mudar o arquivo .bash_profile para redefinir uma variável de ambiente chamada PGDATA, inserindo o novo caminho do diretório de dados do banco (no caso do usuário postgres no Red Hat, seria o arquivo /var/lib/pgsql/.bash_profile)
O trecho abaixo, especificamente na frente de “=”, deve ser alterado com o caminho escolhido. O nosso ficou assim:
PGDATA=/mnt/volume_sfo3_02/pgsql/16/data
Na sequência, vamos rodar os mesmos comandos de systemctl das instalações passadas para habilitar a inicialização automática e iniciar o serviço, sendo o último comando opcional para conferir se está tudo certo:
systemctl enable postgresql-16
systemctl start postgresql-16
systemctl status postgresql-16
# systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-02-27 18:21:19 UTC; 2h 33min ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 854 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 872 (postgres)
Tasks: 8 (limit: 4478)
Memory: 34.3M
CPU: 1.760s
CGroup: /system.slice/postgresql-16.service
├─ 872 /usr/pgsql-16/bin/postgres -D /mnt/volume_sfo3_02/pgsql/16/data/
├─ 893 "postgres: logger "
├─ 897 "postgres: checkpointer "
├─ 898 "postgres: background writer "
├─ 902 "postgres: walwriter "
├─ 903 "postgres: autovacuum launcher "
├─ 904 "postgres: logical replication launcher "
└─4674 "postgres: postgres postgres [local] idle"
Feb 27 18:21:18 centos-ludmila-teste systemd[1]: Starting PostgreSQL 16 database server...
Feb 27 18:21:19 centos-ludmila-teste postgres[872]: 2024-02-27 18:21:19.218 UTC [872] LOG: redirecting log output to logging collector process
Feb 27 18:21:19 centos-ludmila-teste postgres[872]: 2024-02-27 18:21:19.218 UTC [872] HINT: Future log output will appear in directory "log".
Feb 27 18:21:19 centos-ludmila-teste systemd[1]: Started PostgreSQL 16 database server.
Caso sua nova partição tenha sido montada no diretório padrão do PostgreSQL no Red Hat, é necessário realizar apenas o primeiro passo de conceder acesso ao usuário postgres no diretório da nova partição, pulando a necessidade de editar o arquivo systemd, para então seguir com os comandos systemctl e iniciar o serviço.
Conclusão
Ao compararmos a instalação via pacotes com a instalação compilada vista no artigo anterior, veremos que o processo todo é bem mais simples e rápido. Você consegue realizar uma instalação completa em poucos minutos e não terá dificuldades em manter esse ambiente depois. Ainda assim, alguns cuidados adicionais serão necessários para criar um servidor PostgreSQL em ambiente de produção, como por exemplo montar o banco de dados numa partição/disco diferente do resto do sistema operacional.