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).
- 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_dumpemariadb-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) oumariadb. Comandos SQL terminam com;.
Qual escolher?
| PostgreSQL | MariaDB / MySQL | |
|---|---|---|
| Ponto forte | Recursos avançados, rigor com os dados | Simplicidade, muito usado em hospedagem |
| Usado por | Django, Rails, muitos sistemas novos | WordPress, Nextcloud, PHP em geral |
| Cliente | psql | mariadb (antigo mysql) |
| Porta | 5432 | 3306 |
| Pacote no Ubuntu 26.04 | postgresql (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
| Comando | O que faz |
|---|---|
\l | Lista os bancos (list) |
\c loja | Conecta em outro banco |
\dt | Lista as tabelas |
\d produtos | Mostra as colunas de uma tabela |
\du | Lista os usuários (roles) |
\x | Liga/desliga a exibição vertical (bom para linhas largas) |
\? / \h | Ajuda dos comandos do psql / ajuda de SQL |
\q | Sai |
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
| Forma | Backup | Restauração |
|---|---|---|
| SQL puro (legível) | pg_dump -h localhost -U app loja > loja.sql | psql -h localhost -U app -d loja < loja.sql |
| Custom (recomendado) | pg_dump … -Fc -f loja.dump loja | pg_restore -h localhost -U app -d loja --clean loja.dump |
| Todos os bancos | sudo -u postgres pg_dumpall > tudo.sql | sudo -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) | Resposta | Por quê |
|---|---|---|
| Enter current password for root | Enter | Ainda não há senha |
| Switch to unix_socket authentication | n | O Ubuntu já usa esse método para o root |
| Change the root password? | n | O root entra via sudo mariadb, sem senha |
| Remove anonymous users? | Y | Ninguém deve entrar sem usuário |
| Disallow root login remotely? | Y | Root só local |
| Remove test database? | Y | Banco de teste é desnecessário |
| Reload privilege tables now? | Y | Aplica 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
| Trecho | Significado |
|---|---|
'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
| Comando | Equivalente no psql | O que faz |
|---|---|---|
SHOW DATABASES; | \l | Lista bancos |
USE loja; | \c loja | Troca de banco |
SHOW TABLES; | \dt | Lista tabelas |
DESCRIBE produtos; | \d produtos | Colunas da tabela |
SELECT user, host FROM mysql.user; | \du | Lista usuários |
exit | \q | Sai |
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
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):
- PostgreSQL: em
/etc/postgresql/18/main/postgresql.conf, mudelisten_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
- MariaDB: em
/etc/mysql/mariadb.conf.d/50-server.cnf, mudebind-address = 127.0.0.1para o IP do servidor e crie o usuário com o IP de origem:'app'@'192.168.0.60'. - Firewall: libere só para aquele IP:
$ sudo ufw allow from 192.168.0.60 to any port 5432 proto tcp Regra adicionada
- Reinicie o serviço:
sudo systemctl restart postgresqloumariadb.
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
$ 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).
$ 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 -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.
$ 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
| Tarefa | PostgreSQL | MariaDB |
|---|---|---|
| Instalar | sudo apt install postgresql | sudo apt install mariadb-server |
| Entrar como admin | sudo -u postgres psql | sudo mariadb |
| Criar usuário | CREATE USER app WITH PASSWORD '…'; | CREATE USER 'app'@'localhost' IDENTIFIED BY '…'; |
| Criar banco | CREATE DATABASE loja OWNER app; | CREATE DATABASE loja; + GRANT ALL … |
| Conectar | psql -h localhost -U app -d loja | mariadb -u app -p loja |
| Backup | pg_dump -Fc -f loja.dump loja | mariadb-dump loja > loja.sql |
| Restaurar | pg_restore -d loja loja.dump | mariadb loja < loja.sql |
| Configuração | /etc/postgresql/18/main/ | /etc/mysql/mariadb.conf.d/ |
| Porta | 5432 | 3306 |
Exercícios
1. Administrador do PostgreSQL
Complete para abrir o psql como o administrador do banco:
2. Conectar com senha
Complete para entrar no banco blog com o usuário editor, pela rede local da máquina:
3. Backup do MariaDB
Complete para salvar o banco loja no arquivo 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 compsql -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.