MySQL: Gerenciamento de usuários e controle de permissões…
Última atualização: 2026-08-26
O controle de acesso é a base da segurança de bancos de dados — cada usuário só pode acessar os dados para os quais tem autorização.
Esta aula aborda o gerenciamento de usuários e permissões.
graph TB
A[MySQL Permission Levels] --> B[Global Permissions<br/>*.*]
A --> C[Database Permissions<br/>mydb.*]
A --> D[Table Permissions<br/>mydb.users]
A --> E[Column Permissions<br/>mydb.users col]
B --> B1[ALL/CREATE/RELOAD...]
C --> C1[SELECT/INSERT/UPDATE/DELETE]
D --> D1[SELECT/ALTER/INDEX...]
E --> E1[SELECT col1, col2]
1. O que você vai aprender
- CREATE USER: Criar um usuário
- Autorização de SUBVENÇÃO
- REVOKE Revogar permissões
- Nível de permissão (Global/Banco de dados/Tabela/Coluna)
- Gerenciamento de funções (8.0+)
2. Uma história real
(1) Problema: um erro com a conta root leva a um grande desastre
A equipe de desenvolvimento sempre havia se conectado ao banco de dados de produção usando a conta root — era prático, mas então, um dia, um desenvolvedor executou acidentalmente o DROP TABLE users, e os dados de 3 milhões de usuários desapareceram em um instante. Levou quatro horas para restaurar o backup; durante esse tempo, o serviço ficou completamente fora do ar, resultando em prejuízos diretos de mais de um milhão.
(2) Soluções para o sistema de permissões
Aplique o princípio do privilégio mínimo: conceda a cada função apenas as permissões necessárias. Os desenvolvedores recebem acesso somente para leitura, além de acesso de leitura e gravação aos repositórios de desenvolvimento; a equipe de operações possui permissões de gerenciamento para repositórios específicos; e o acesso root é restrito aos administradores de banco de dados (DBAs) que utilizam o bastion host.
| Dimensão | Sempre usar o usuário root | Princípio do privilégio mínimo |
|---|---|---|
| Risco de operações acidentais | Extremamente alto (pode excluir qualquer tabela) | Extremamente baixo (permissões restritas) |
| Recuperação de desastres | Difícil (impacto abrangente) | Fácil (impacto limitado) |
| Histórico de auditoria | Não é possível identificar o operador | Rastreamento por usuário |
| Nível de segurança | ❌ | ✅ |
3. Gerenciamento de usuários
▶ Exemplo: Criação de um usuário
-- Create a Local User
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'DevPass123!';
-- Create a user who is allowed to connect remotely
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemotePass123!';
-- Create a user allowed to connect from a specific IP
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppPass123!';
▶ Exemplo: Modificação e exclusão de usuários
-- Change Password
ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'NewPass123!';
-- Delete User
DROP USER 'dev_user'@'localhost';
-- View All Users
SELECT user, host FROM mysql.user;
4. Autorização de SUBVENÇÃO
▶ Exemplo: Gerenciamento de permissões
-- Grant All Privileges (Administrator)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
-- Grant Permissions to a Specific Database
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'dev_user'@'localhost';
-- Grant Permissions on a Specific Table
GRANT SELECT ON mydb.users TO 'readonly'@'localhost';
-- Grant Permissions on Specific Columns
GRANT SELECT (username, email) ON mydb.users TO 'limited'@'localhost';
-- Refresh Permissions
FLUSH PRIVILEGES;
5. Níveis de permissão
| Nível | Sintaxe | Descrição |
|---|---|---|
| Global | *.* |
Todas as tabelas em todos os bancos de dados |
| Banco de dados | mydb.* |
Todas as tabelas de um banco de dados específico |
| Tabela | mydb.users |
Tabela específica |
| Coluna | mydb.users(email) |
Coluna específica |
6. REVOKE: Revogar permissões
-- Revoke All Permissions
REVOKE ALL PRIVILEGES ON *.* FROM 'dev_user'@'localhost';
-- Revoke Specific Permissions
REVOKE INSERT, DELETE ON mydb.* FROM 'dev_user'@'localhost';
FLUSH PRIVILEGES;
7. Permissões de visualização
-- View Current User Permissions
SHOW GRANTS;
-- View a Specific User's Permissions
SHOW GRANTS FOR 'dev_user'@'localhost';
8. Gerenciamento de usuários (MySQL 8.0+)
-- Create a role
CREATE ROLE 'app_read', 'app_write';
-- Grant privileges to roles
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';
-- Assign Roles to Users
GRANT 'app_read', 'app_write' TO 'dev_user'@'localhost';
-- Activate role
SET DEFAULT ROLE ALL TO 'dev_user'@'localhost';
❓ Perguntas Frequentes
P: Qual é a diferença entre
'user'@'localhost'e'user'@'%'? R: “localhost” permite apenas conexões locais, enquanto “%” permite conexões de qualquer host.
P: É necessária uma instrução
FLUSH PRIVILEGESapósGRANT? R: Não é necessária quando se usaGRANTdiretamente. Só é necessária quando se modifica a tabelamysql.userdiretamente.
P: O que devo fazer se esquecer minha senha de root? R: Inicie o sistema ignorando a verificação de permissão, altere a senha e, em seguida, reinicie o sistema.
P: O que é WITH GRANT OPTION? R: Permite que um usuário conceda seus próprios privilégios a outras pessoas. A concessão desse privilégio deve ser feita com cautela para evitar a proliferação de privilégios.
P: Qual é a diferença entre uma função e um usuário? R: Uma função é um conjunto de permissões; ela não pode ser usada para fazer login diretamente. Depois que um usuário faz login, ele usa o comando SET ROLE para ativar uma função.
📖 Resumo
- CREATE USER Cria um usuário, especificando o host e a senha
- GRANT concede permissão; REVOKE revoga permissão
- Nível de permissão: Global → Banco de dados → Tabela → Coluna
- Funções (8.0+) Permissões para gerenciamento em lote
- FLUSH PRIVILEGES atualiza as permissões
📝 Exercícios
-
Questão básica (Dificuldade: ⭐): Crie um usuário somente leitura que possa apenas consultar o banco de dados
mydb. -
Exercício avançado (Dificuldade: ⭐⭐): Crie uma função e atribua-a a um usuário.
-
Questão de desafio (Dificuldade: ⭐⭐⭐): Elabore um esquema de permissões em que os desenvolvedores tenham acesso de leitura e gravação, a equipe de operações tenha acesso somente de leitura e os administradores tenham acesso total.