Ubuntu Bancos de Dados

Quase toda aplicação guarda seus dados num banco de dados: um programa servidor que organiza informações em tabelas e responde a pedidos na linguagem SQL. Nesta aula você instala e usa os dois mais comuns em servidores Ubuntu: PostgreSQL e MariaDB (o substituto livre do MySQL).

Você vai aprender
  • Como funciona um servidor de banco de dados e por que existem "usuários do banco".
  • Instalar o PostgreSQL, criar um usuário e um banco, e usar o psql.
  • Fazer o mesmo no MariaDB com o cliente mariadb.
  • Fazer backup e restaurar com pg_dump e mariadb-dump.
  • Liberar acesso remoto com segurança, e resolver "Access denied" e "role does not exist".

Os exemplos acontecem na máquina fictícia servidor, com a usuária ana. Você vai criar um banco chamado loja, usado por uma aplicação que se conecta com o usuário app.


Conceito: um servidor dentro do servidor

  • O banco roda como um serviço (veja systemctl) e escuta numa porta: 5432 no PostgreSQL, 3306 no MariaDB.
  • Ele tem usuários próprios, separados dos usuários do Ubuntu. A aplicação entra com um usuário do banco, com senha.
  • Dentro do servidor existem vários bancos (loja, blog…). Cada banco tem tabelas; cada tabela tem colunas e linhas, como uma planilha.
  • Você conversa com ele por um cliente: psql (PostgreSQL) ou mariadb. Comandos SQL terminam com ;.

Qual escolher?

PostgreSQLMariaDB / MySQL
Ponto forteRecursos avançados, rigor com os dadosSimplicidade, muito usado em hospedagem
Usado porDjango, Rails, muitos sistemas novosWordPress, Nextcloud, PHP em geral
Clientepsqlmariadb (antigo mysql)
Porta54323306
Pacote no Ubuntu 26.04postgresql (versão 18)mariadb-server (versão 11.8)

Na dúvida, use o que a aplicação recomenda. Para um sistema novo, o PostgreSQL é uma ótima escolha.


PostgreSQL

Instalar

$ sudo apt install postgresql
$ systemctl is-active postgresql
active
$ sudo ss -tlnp | grep 5432
LISTEN 0      200        127.0.0.1:5432      0.0.0.0:*    users:(("postgres",pid=2210,fd=6))   « só na própria máquina

Repare no 127.0.0.1: por padrão o banco só aceita conexões vindas do próprio servidor. Isso é bom para segurança.

Entrar como administrador

A instalação cria um usuário do Ubuntu chamado postgres, que é o administrador do banco. O PostgreSQL usa autenticação peer ("par"): se você é o usuário postgres do Ubuntu, entra como postgres no banco, sem senha.

sudo
Executa o próximo comando como outro usuário.
-u postgres
Como o usuário postgres (e não como root).
psql
O cliente do PostgreSQL.
$ sudo -u postgres psql
psql (18.3 (Ubuntu 18.3-1))
Type "help" for help.

postgres=#                                         « prompt do psql: banco "postgres", # = administrador

Dentro do psql, o prompt mostra o banco atual. Termina em =# para administrador e => para usuário comum. Dependendo dos pacotes de idioma, algumas mensagens aparecem em português.

Criar o usuário e o banco da aplicação

postgres=# CREATE USER app WITH PASSWORD 'troque-esta-senha';
CREATE ROLE                                        « "role" é o nome que o PostgreSQL dá para usuários
postgres=# CREATE DATABASE loja OWNER app;
CREATE DATABASE
postgres=# \q

Linhas que começam com \ são comandos do próprio psql (não SQL) e não precisam de ;. \q sai.

Outra forma: sem entrar no psql

O PostgreSQL traz programas que fazem o mesmo direto do terminal:

$ sudo -u postgres createuser --pwprompt app
Enter password for new role:
Enter it again:
$ sudo -u postgres createdb -O app loja

Conectar como a aplicação

psql
O cliente.
-h localhost
Conecta pela rede (TCP), o que exige senha. Sem -h, tentaria a autenticação peer.
-U app
Usuário do banco.
-d loja
Banco.
$ psql -h localhost -U app -d loja
Password for user app:
psql (18.3 (Ubuntu 18.3-1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql)
Type "help" for help.

loja=>

Uma tabela de verdade

loja=> CREATE TABLE produtos (id serial PRIMARY KEY, nome text NOT NULL, preco numeric(10,2));
CREATE TABLE
loja=> INSERT INTO produtos (nome, preco) VALUES ('Café', 18.90), ('Pão', 7.50);
INSERT 0 2                                          « 2 linhas inseridas
loja=> SELECT * FROM produtos;
 id | nome | preco
----+------+-------
  1 | Café | 18.90
  2 | Pão  |  7.50
(2 rows)
loja=> \dt
         List of relations
 Schema |   Name   | Type  | Owner
--------+----------+-------+-------
 public | produtos | table | app
(1 row)

Comandos do psql

ComandoO que faz
\lLista os bancos (list)
\c lojaConecta em outro banco
\dtLista as tabelas
\d produtosMostra as colunas de uma tabela
\duLista os usuários (roles)
\xLiga/desliga a exibição vertical (bom para linhas largas)
\? / \hAjuda dos comandos do psql / ajuda de SQL
\qSai

Backup e restauração

pg_dump gera um arquivo com tudo o que é preciso para recriar o banco.

pg_dump
"PostgreSQL dump": exporta um banco.
-h localhost -U app
Como se conectar, igual ao psql.
-Fc
Formato custom: compactado e restaurável por partes com pg_restore.
-f loja-2026-10-15.dump
Arquivo de saída.
loja
O banco.
$ pg_dump -h localhost -U app -Fc -f loja-$(date +%F).dump loja
Password:
$ ls -lh
total 4,0K
-rw-rw-r-- 1 ana ana 2,1K Oct 15 10:30 loja-2026-10-15.dump
FormaBackupRestauração
SQL puro (legível)pg_dump -h localhost -U app loja > loja.sqlpsql -h localhost -U app -d loja < loja.sql
Custom (recomendado)pg_dump … -Fc -f loja.dump lojapg_restore -h localhost -U app -d loja --clean loja.dump
Todos os bancossudo -u postgres pg_dumpall > tudo.sqlsudo -u postgres psql < tudo.sql

Para backup diário automático, coloque o pg_dump num script com cron. A senha pode ficar no arquivo ~/.pgpass (permissão 600), no formato localhost:5432:loja:app:SENHA.


MariaDB

Instalar e proteger

$ sudo apt install mariadb-server
$ systemctl is-active mariadb
active
$ sudo mariadb-secure-installation

O mariadb-secure-installation faz perguntas. Respostas recomendadas para um servidor novo:

Pergunta (em inglês)RespostaPor quê
Enter current password for rootEnterAinda não há senha
Switch to unix_socket authenticationnO Ubuntu já usa esse método para o root
Change the root password?nO root entra via sudo mariadb, sem senha
Remove anonymous users?YNinguém deve entrar sem usuário
Disallow root login remotely?YRoot só local
Remove test database?YBanco de teste é desnecessário
Reload privilege tables now?YAplica tudo

Entrar como administrador

No Ubuntu, o root do MariaDB usa autenticação unix_socket: quem é root no Ubuntu (via sudo) é root no banco.

$ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 11.8.6-MariaDB-5ubuntu0.1 Ubuntu 26.04

MariaDB [(none)]>                                « (none) = nenhum banco selecionado

Criar o usuário e o banco da aplicação

MariaDB [(none)]> CREATE DATABASE loja;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> CREATE USER 'app'@'localhost' IDENTIFIED BY 'troque-esta-senha';
Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON loja.* TO 'app'@'localhost';
Query OK, 0 rows affected (0.003 sec)
MariaDB [(none)]> exit
Bye
TrechoSignificado
'app'@'localhost'Usuário app que só pode entrar a partir da própria máquina. No MariaDB, o usuário inclui de onde ele vem
IDENTIFIED BY '…'A senha
GRANT ALL PRIVILEGES ON loja.*Dá todas as permissões em todas as tabelas (*) do banco loja, e só nele

Conectar como a aplicação

mariadb
O cliente.
-u app
Usuário.
-p
Pede a senha (não escreva a senha na linha de comando: ela fica no histórico).
loja
Banco que já abre selecionado.
$ mariadb -u app -p loja
Enter password:
MariaDB [loja]> CREATE TABLE produtos (id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(100), preco DECIMAL(10,2));
Query OK, 0 rows affected (0.012 sec)
MariaDB [loja]> INSERT INTO produtos (nome, preco) VALUES ('Café', 18.90), ('Pão', 7.50);
Query OK, 2 rows affected (0.003 sec)
Records: 2  Duplicates: 0  Warnings: 0
MariaDB [loja]> SELECT * FROM produtos;
+----+-------+-------+
| id | nome  | preco |
+----+-------+-------+
|  1 | Café  | 18.90 |
|  2 | Pão   |  7.50 |
+----+-------+-------+
2 rows in set (0.001 sec)

Comandos úteis no MariaDB

ComandoEquivalente no psqlO que faz
SHOW DATABASES;\lLista bancos
USE loja;\c lojaTroca de banco
SHOW TABLES;\dtLista tabelas
DESCRIBE produtos;\d produtosColunas da tabela
SELECT user, host FROM mysql.user;\duLista usuários
exit\qSai

Backup e restauração

$ mariadb-dump -u app -p loja > loja-$(date +%F).sql
Enter password:
$ mariadb -u app -p loja < loja-2026-10-15.sql            « restaura
Enter password:
$ sudo mariadb-dump --all-databases > tudo.sql             « todos os bancos, como root
Nomes antigos

Em tutoriais você vai ver mysql, mysqldump e mysql_secure_installation. São os nomes antigos (e os do MySQL da Oracle, pacote mysql-server). Nas versões novas do MariaDB, use mariadb, mariadb-dump e mariadb-secure-installation.


Acesso remoto, com cuidado

Expor o banco na internet é um dos erros de segurança mais comuns. A melhor forma de acessar de outro computador é não abrir a porta e usar um túnel SSH:

ssh
Conexão segura com o servidor (veja SSH).
-L 5432:localhost:5432
Porta 5432 do seu computador → porta 5432 do servidor, por dentro do SSH.
ana@192.168.0.50
O servidor.
$ ssh -L 5432:localhost:5432 ana@192.168.0.50
# deixe esse terminal aberto; em outro, no seu computador:
$ psql -h localhost -U app -d loja

Se realmente precisar abrir (ex.: o servidor da aplicação é outra máquina da rede interna):

  1. PostgreSQL: em /etc/postgresql/18/main/postgresql.conf, mude listen_addresses = 'localhost' para o IP do servidor. Em /etc/postgresql/18/main/pg_hba.conf, permita só a máquina da aplicação:
    # TIPO  BANCO  USUÁRIO  ENDEREÇO           MÉTODO
    host    loja   app      192.168.0.60/32    scram-sha-256
  2. MariaDB: em /etc/mysql/mariadb.conf.d/50-server.cnf, mude bind-address = 127.0.0.1 para o IP do servidor e crie o usuário com o IP de origem: 'app'@'192.168.0.60'.
  3. Firewall: libere só para aquele IP:
    $ sudo ufw allow from 192.168.0.60 to any port 5432 proto tcp
    Regra adicionada
  4. Reinicie o serviço: sudo systemctl restart postgresql ou mariadb.
Nunca

Não libere a porta 5432 ou 3306 para "qualquer lugar" (0.0.0.0/0) nem use 'app'@'%' com senha fraca. Robôs varrem a internet o tempo todo procurando essas portas.


Quando não funciona

PostgreSQL: "role "ana" does not exist"
$ psql
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  role "ana" does not exist

O que aconteceu: sem opções, o psql tenta entrar com o seu nome de usuário do Ubuntu (ana), que não existe no banco.

Como resolver: entre como administrador (sudo -u postgres psql) ou informe o usuário do banco (psql -h localhost -U app -d loja).

PostgreSQL: "password authentication failed"
$ psql -h localhost -U app -d loja
Password for user app:
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL:  password authentication failed for user "app"

O que aconteceu: senha errada (ou o usuário não existe).

Como resolver: redefina como administrador: sudo -u postgres psql -c "ALTER USER app WITH PASSWORD 'nova-senha';".

MariaDB: "Access denied for user 'root'@'localhost'"
$ mariadb -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

O que aconteceu: o root do MariaDB usa unix_socket: só entra quem é root no Ubuntu. Senha não adianta.

Como resolver: use sudo mariadb. Para aplicações, crie um usuário próprio, como app; nunca use o root do banco numa aplicação.

"Connection refused"
$ psql -h 192.168.0.50 -U app -d loja
psql: error: connection to server at "192.168.0.50", port 5432 failed: Connection refused
	Is the server running on that host and accepting TCP/IP connections?

O que aconteceu: o serviço está parado, ou está escutando só em 127.0.0.1 e você tentou pelo IP da rede.

Como confirmar: systemctl status postgresql e sudo ss -tlnp | grep 5432.

Como resolver: inicie o serviço ou ajuste listen_addresses (seção "Acesso remoto").


Referência rápida

TarefaPostgreSQLMariaDB
Instalarsudo apt install postgresqlsudo apt install mariadb-server
Entrar como adminsudo -u postgres psqlsudo mariadb
Criar usuárioCREATE USER app WITH PASSWORD '…';CREATE USER 'app'@'localhost' IDENTIFIED BY '…';
Criar bancoCREATE DATABASE loja OWNER app;CREATE DATABASE loja; + GRANT ALL …
Conectarpsql -h localhost -U app -d lojamariadb -u app -p loja
Backuppg_dump -Fc -f loja.dump lojamariadb-dump loja > loja.sql
Restaurarpg_restore -d loja loja.dumpmariadb loja < loja.sql
Configuração/etc/postgresql/18/main//etc/mysql/mariadb.conf.d/
Porta54323306

Exercícios

1. Administrador do PostgreSQL

Complete para abrir o psql como o administrador do banco:

sudo psql

2. Conectar com senha

Complete para entrar no banco blog com o usuário editor, pela rede local da máquina:

psql -h localhost

3. Backup do MariaDB

Complete para salvar o banco loja no arquivo loja.sql:

-u app -p loja > loja.sql

4. mariadb -u root -p responde "Access denied", mesmo com a senha certa. Por quê?

5. Qual é a forma mais segura de acessar o banco do servidor a partir do seu notebook?


Resumo

  • O banco é um serviço com usuários próprios; a aplicação usa um usuário dedicado, nunca o administrador.
  • PostgreSQL: sudo -u postgres psql, CREATE USER, CREATE DATABASE … OWNER, conectar com psql -h localhost -U app -d loja.
  • MariaDB: sudo mariadb-secure-installation, sudo mariadb, CREATE USER 'app'@'localhost' + GRANT.
  • Backup: pg_dump / mariadb-dump, agendados com cron.
  • Acesso remoto: prefira túnel SSH; se abrir, libere só o IP necessário.