O PostgreSQL 13, a versão mais recente do software de banco de dados Postgres, vem com muitas melhorias ocultas. Embora seja o RDBMS de código aberto mais popular e versátil, não é o mais fácil de configurar e começar. Continue lendo para saber como você pode usar a versão mais recente do Postgres na versão LTS mais recente do servidor Ubuntu.
Instalação
Ubuntu 20.04 vem com Postgres 12 de seu universo repositório. Como queremos a versão 13, podemos usar diretamente o repositório APT oficial do projeto PostgreSQL. Este repositório contém binários para o Ubuntu 20.04, e também inclui pacotes para várias extensões que você pode querer instalar posteriormente.
Vamos configurar o repositório assim (observe que “focal” é o codinome do Ubuntu 20.04):
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
Agora podemos instalar o servidor PostgreSQL e outras ferramentas de linha de comando usando:
sudo apt-get install -y postgresql-13
A instalação faz algumas coisas:
- Instala o servidor PostgreSQL, utilitários e um cliente de linha de comando chamadopsql .
- Cria um usuário do sistema Linux chamado postgres . Todos os arquivos de dados são de propriedade deste usuário e todos os processos são executados como este usuário.
- Cria um cluster de banco de dados (ver abaixo). Nesse cluster, ele cria um banco de dados, também chamado de postgres .
- Cria um usuário PostgreSQL (não o usuário do sistema Linux), também chamado depostgres . Este usuário do PostgreSQL tem privilégios de superusuário.
Você pode ver que isso está começando a ficar confuso!
Clusters de banco de dados
Em termos do Postgres, agora temos um único cluster de banco de dados em execução. Um único cluster de banco de dados pode conter um ou mais bancos de dados. No cluster de banco de dados que temos agora, existe um banco de dados chamado “postgres”. (Há também alguns bancos de dados “modelo” que podemos ignorar por enquanto.)
Um cluster de banco de dados é gerenciado por um processo postgres principal chamado postmaster .Ele gera vários processos filho que executam várias tarefas do sistema ou manipulam conexões de clientes de entrada. Dê uma olhada nos processos atualmente em execução:
alice@ubu:~$ ps -o uname,pid,ppid,cmd -H -U postgres
USER PID PPID CMD
postgres 4880 1 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf
postgres 4882 4880 postgres: 13/main: checkpointer
postgres 4883 4880 postgres: 13/main: background writer
postgres 4884 4880 postgres: 13/main: walwriter
postgres 4885 4880 postgres: 13/main: autovacuum launcher
postgres 4886 4880 postgres: 13/main: stats collector
postgres 4887 4880 postgres: 13/main: logical replication launcher
Aqui, o processo do postmaster é 4880 e gerou 6 processos filhos que lidam com várias atividades de limpeza. Você também pode ver a localização do cluster (
/var/lib/postgresql/13/main
) e a localização do arquivo de configuração (/etc/postgresql/13/main/postgresql.conf
). Recarregando e reiniciando
Em vários momentos, pode ser necessário recarregar ou reiniciar seu servidor Postgres.Recarregar faz com que o Postgres reexamine seus arquivos de configuração e aplique as alterações. Se não houver alterações nos arquivos de configuração, nada de ruim acontecerá. Recarregar não perturba os clientes conectados no momento. Para recarregar seu servidor Postgres, você pode fazer:
sudo systemctl reload postgresql
Algumas alterações de configuração entrarão em vigor somente depois que você reiniciar o servidor. Isso é mais prejudicial e desconectará todos os clientes conectados. Para reiniciar, você pode:
sudo systemctl restart postgresql
Arquivos de registro
Como você pode ver, existe um serviço systemd chamado
postgresql
que você pode usar para controlar o postmaster. Se o serviço não iniciar, você pode verificar seu status para verificar se há mensagens de erro:alice@ubu:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2020-10-29 04:52:29 UTC; 25min ago
Main PID: 4557 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 1075)
Memory: 0B
CGroup: /system.slice/postgresql.service
Oct 29 04:52:29 ubu systemd[1]: Starting PostgreSQL RDBMS...
Oct 29 04:52:29 ubu systemd[1]: Finished PostgreSQL RDBMS.
O servidor PostgreSQL grava um arquivo de log, no qual você pode verificar mensagens de erro mais detalhadas. Este arquivo está localizado em
/var/log/postgresql/postgresql-13-main.log
:alice@ubu:~$ cat /var/log/postgresql/postgresql-13-main.log
2020-10-29 04:52:34.096 UTC [4880] LOG: starting PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-bit
2020-10-29 04:52:34.097 UTC [4880] LOG: listening on IPv4 address "127.0.0.1", port 5432
2020-10-29 04:52:34.099 UTC [4880] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-10-29 04:52:34.106 UTC [4881] LOG: database system was shut down at 2020-10-29 04:52:31 UTC
2020-10-29 04:52:34.112 UTC [4880] LOG: database system is ready to accept connections
Conectando ao seu servidor Postgres
Agora que temos nosso servidor instalado e funcionando, vamos tentar nos conectar a ele. Por padrão, o servidor escuta apenas:
- Conexões TCP de 127.0.0.1 na porta 5432 e
- Soquetes de domínio Unix em /var/run/postgresql
Por causa da configuração padrão, a única maneira de se conectar ao servidor agora é através do soquete Unix de um processo que está sendo executado como o usuário do sistema postgres . Vamos executar o cliente interativo padrão psql assim:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
Aqui estamos executando o psql como o usuário do sistema postgres (“sudo -u postgres psql”) e conectando ao banco de dados chamado “postgres” (o último “postgres” na linha de comando). O prompt “postgres=#” indica o nome do banco de dados atualmente conectado (“postgres”) e que temos privilégios de superusuário (“#” em oposição a “$”).
A conexão ocorreu via sockets Unix (este é o método padrão no psql). Como por padrão o usuário postgres não possui senha e a configuração padrão requer autenticação por senha para conexões TCP, não é possível conectar sobre 127.0.0.1:5432 agora .
Permitir conexões de entrada de uma rede interna
Primeiro vamos alterar a configuração para permitir conexões de uma rede interna. Assumindo que o IP do nosso servidor nesta rede é 10.1.2.3, podemos editar o arquivo de configuração principal em
/etc/postgresql/13/main/postgresql.conf
e altere as linhas:#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
para:
listen_addresses = 'localhost,10.1.2.3'
Também precisamos dizer ao Postgres para usar autenticação de senha para conexões provenientes dessas redes. Para isso, edite outro arquivo de configuração chamado
/etc/postgresql/13/main/pg_hba.conf
e altere a linha:host all all 127.0.0.1/32 md5
para:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(Supondo que a rede interna seja 10.1.0.0/16.)
Também alteramos o padrão
md5
para o mais novo e seguroscram-sha-256
. Todas as outras ocorrências de md5
no arquivo também deve ser substituído por scram-sha-256
. Se seu aplicativo ou driver de banco de dados não suportar este método, continue usando o md5
método em vez disso. Para que essas alterações entrem em vigor, você precisa reiniciar o servidor:
sudo systemctl restart postgresql
Criando um usuário e banco de dados regulares
Estamos quase lá!
Agora podemos criar um usuário comum com o qual nosso aplicativo pode se conectar e um banco de dados sobre o qual ele tenha controle total. Conecte-se como o superusuário postgres localmente da máquina do servidor para fazer isso:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=# SET password_encryption = 'scram-sha-256';
SET
postgres=# CREATE USER alice PASSWORD 's3cr3tp@ss';
CREATE ROLE
postgres=#
(Omita o primeiro comando se quiser usar
md5
em vez disso.) Isso criou um usuário chamado alice com a senha s3cr3tp@ss . Vamos também criar um banco de dados que este usuário possuirá:postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
O banco de dados é chamado app1 . Desde alice possui este banco de dados, todas as operações dentro do banco de dados (como criar tabelas, inserir linhas) são permitidas se o aplicativo se conectar como o usuário alice .
Vamos tentar conectar como alice , pela rede:
~$ psql -h 10.1.2.3 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=>
Frio! Agora estamos conectados ao banco de dados app1 como a usuária alice .
Excluir bancos de dados, fazer backup e restaurar
Aqui estão alguns truques que podem ajudar enquanto você continua trabalhando com seu Postgresserver:
Excluindo um banco de dados
Você pode excluir o banco de dados que acabou de criar (“app1”), assim:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=> \c postgres
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "postgres" as user "alice".
postgres=> DROP DATABASE app1;
DROP DATABASE
postgres=>
Observe que você precisa alternar para outro banco de dados primeiro usando o comando “\c” do psql.
Para criar outro banco de dados ou recriar app1 , conecte-se como superusuário e faça “CREATE DATABASE” como antes.
Fazer backup do banco de dados
A maneira mais fácil de fazer backup dos dados em seu banco de dados é usar pg_dump assim:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
Isso cria um arquivo SQL chamado “backup.sql” que contém todos os comandos SQL necessários para recriar o esquema e os dados no banco de dados app1 , em formato de texto. Você pode executar esses comandos em qualquer banco de dados, e o esquema e os dados serão preenchidos nesse banco de dados.
Leia mais sobre pg_dump aqui.
Restaurando dados
O arquivo de comando SQL que você criou acima pode ser restaurado assim:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app2
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app2=> \i backup.sql
SET
SET
(..snip..)
Observe que restauramos o esquema e os dados em outro banco de dados, app2 . O comando “\i” do psql permite que você execute os comandos SQL a partir de um arquivo.
Próximas etapas
Há um monte de artigos, tutoriais, vídeos e cursos por aí para ajudá-lo a ficar mais proficiente com o PostgreSQL. No entanto, gaste algum tempo com a documentação oficial aqui, que fornece uma cobertura abrangente e confiável de todos os recursos, sintaxe e utilitários do PostgreSQL.