Criar usuário MySQL: como dar permissões com GRANT
Veja como criar usuário MySQL, escolher o host, dar só as permissões necessárias com GRANT, conferir com SHOW GRANTS e corrigir erros de acesso negado.
Por Redação Eleven Host · @robson.direitodigital · 29 de outubro de 2026 · 9 min de leitura

Capa da Redação Eleven Host para o guia: Criar usuário MySQL: como dar permissões com GRANT Arte: Eleven Host
Para criar usuário MySQL, entre como administrador e rode CREATE USER com nome, host e senha. Depois use GRANT para dar ao usuário só as permissões que o app precisa, apenas no banco dele, e confira com SHOW GRANTS.
Este guia mostra o caminho completo no Ubuntu: entrar no MySQL, criar a conta, escolher o host (localhost ou um IP), conceder permissões com o menor privilégio possível, conferir, trocar a senha, tirar permissão e apagar o usuário. No fim, há os erros comuns de conexão. Ele segue o manual do MySQL (versões 8.0 e 8.4) e a documentação do Ubuntu Server.
Entrar no MySQL como administrador
Antes de tudo, o MySQL precisa estar instalado e rodando. Se ainda não instalou, siga o guia Instalar MySQL no Ubuntu: passo a passo na VPS. Para conferir se o serviço está ativo:
sudo systemctl status mysql
Segundo a documentação do Ubuntu, a entrada de administrador é feita com o comando abaixo (também funciona só com sudo mysql):
sudo mysql -u root
Esse comando não pede senha do MySQL. A documentação explica que o MySQL autentica pelo auth_socket: ele confia no usuário do Linux, então quem tem sudo no servidor entra direto. Esse login só funciona localmente, na própria máquina, e não de outro computador. Quando o prompt mudar para mysql>, você já pode digitar os comandos das próximas seções.
Criar o usuário: localhost, IP ou %
No MySQL, a conta tem duas partes: o nome e o host de onde ela pode conectar. Por isso 'usuario'@'localhost' e 'usuario'@'198.51.100.20' são contas diferentes, cada uma com a própria senha e as próprias permissões. O comando básico, adaptado da documentação, é:
CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'SenhaForteAqui';
Troque usuario pelo nome que quiser e SenhaForteAqui por uma senha longa e só sua. A página "Account Names" do manual descreve formas de escrever o host:
'usuario'@'localhost': a conta só conecta da própria máquina. É a escolha para um app que roda no mesmo servidor do banco.'usuario'@'198.51.100.20': a conta só conecta daquele endereço. Use quando o app está em outra máquina, trocando o IP de exemplo pelo do seu app.'usuario'@'198.51.100.0/255.255.255.0': uma faixa de endereços, escrita com máscara. O manual também aceita o formato CIDR, como/24, para IPv4.'usuario'@'%': aceita conexões de outras máquinas, sem restringir o endereço. Se você escrever só'usuario', sem host, o MySQL entende como'usuario'@'%'.
Quanto ao %, o manual do MySQL 8.4 avisa que o uso dos curingas % e _ em nomes de host ou IP é permitido, mas está depreciado e pode ser removido numa versão futura. Na prática, prefira o IP exato ou a máscara.
O manual também lembra que 127.0.0.1 (loopback IPv4) e ::1 (loopback IPv6) são endereços, e não valem como a conta localhost. Se o seu app conecta por 127.0.0.1, confira a qual conta ele corresponde.
Precisa de um banco de dados na nuvem? Veja o 11SQL Mini a partir de R$ 9,90/mês e confira na loja o que cada plano inclui. Ver o 11SQL
Dar permissões com GRANT
Um usuário recém-criado ainda não tem permissão sobre os dados. É o GRANT que liga o usuário a um banco e diz o que ele pode fazer ali. Exemplo para um app comum, que lê e grava linhas no banco meu_banco, que já precisa existir (veja os erros comuns mais abaixo):
GRANT SELECT, INSERT, UPDATE, DELETE ON meu_banco.* TO 'usuario'@'localhost';
O trecho meu_banco.* significa todas as tabelas daquele banco. Já *.* significaria todos os bancos do servidor, algo a evitar para um app.
O manual dá o motivo: é boa ideia conceder a uma conta só os privilégios de que ela precisa, com cuidado especial para o privilégio FILE e os administrativos. Os privilégios comuns são:
SELECT: ler linhas.INSERT: inserir linhas.UPDATE: alterar linhas.DELETE: apagar linhas.CREATE: criar bancos e tabelas.DROP: apagar bancos, tabelas e views.ALTER: mudar a estrutura de uma tabela (oALTER TABLEtambém exigeCREATEeINSERT).INDEX: criar e remover índices.ALL PRIVILEGES: todos os privilégios disponíveis naquele nível, exceto oGRANT OPTION.GRANT OPTION: permite que o usuário repasse a outros os privilégios que tem.
Dica prática: comece com SELECT, INSERT, UPDATE, DELETE e só acrescente CREATE, ALTER, INDEX e DROP se o sistema precisar criar ou mudar tabelas, como um instalador de CMS na instalação ou na atualização. Se der erro de permissão, acrescente só o privilégio que faltou.
Por exemplo, um usuário só de leitura, para um relatório, fica assim:
GRANT SELECT ON meu_banco.* TO 'usuario'@'localhost';
E um usuário de instalação, que também cria tabelas, precisa de mais privilégios:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON meu_banco.* TO 'usuario'@'localhost';
Conferir com SHOW GRANTS
Depois de conceder, veja o que a conta realmente tem:
SHOW GRANTS FOR 'usuario'@'localhost';
A saída lista uma linha por nível, no formato GRANT ... ON ... TO `usuario`@`localhost`. Confira se o banco e os privilégios são os que você escolheu. Se aparecer ON *.* com privilégios que você não pediu, revise o que foi concedido.
Para testar de verdade, saia do MySQL com EXIT; e entre com a conta nova, digitando a senha quando pedir:
mysql -u usuario -p meu_banco
Se entrou, rode um SELECT simples numa tabela do banco. Se aparecer erro de permissão, volte ao GRANT.
Trocar a senha, tirar permissão e apagar o usuário
Com o administrador logado, estes são os comandos de manutenção da conta.
Trocar a senha
ALTER USER 'usuario'@'localhost' IDENTIFIED BY 'NovaSenha';
Segundo o manual, o servidor aplica o plugin de autenticação padrão e guarda só o hash da senha. Depois de trocar, atualize a senha no arquivo de configuração do app.
Tirar uma permissão
REVOKE DELETE ON meu_banco.* FROM 'usuario'@'localhost';
O REVOKE retira só o privilégio citado. Rode o SHOW GRANTS de novo para conferir.
Apagar o usuário
DROP USER 'usuario'@'localhost';
Antes de remover um usuário que o app ainda usa, troque a configuração do app, ou ele perde o acesso. Se o banco tem dados que importam, faça um backup antes de mexer em contas, como mostra o guia Backup MySQL com mysqldump: como fazer e restaurar.
Precisa rodar FLUSH PRIVILEGES?
É uma dúvida comum, pois alguns tutoriais terminam com FLUSH PRIVILEGES;. Segundo o manual do MySQL, se você muda as tabelas de permissões de forma indireta, com um comando de gerenciamento de contas, o servidor percebe a mudança e carrega as tabelas na memória de novo na hora. Os exemplos citados são GRANT, REVOKE, SET PASSWORD e RENAME USER. O CREATE USER também é um comando de gerenciamento de contas, então vale a mesma regra.
O FLUSH PRIVILEGES só é preciso se alguém alterou as tabelas de permissões diretamente, com INSERT, UPDATE ou DELETE, o que o manual diz não ser recomendado. Rodar o comando sem necessidade não faz mal, mas com CREATE USER e GRANT ele não é preciso.
Quer testar seu app com banco numa VPS? A VPS Plano Bronze sai a partir de R$ 17,00/mês; confira na loja o que cada plano inclui. Ver planos de VPS
Erros comuns ao criar e usar o usuário
- Access denied for user: a causa provável é senha errada, host diferente do cadastrado ou falta de permissão no banco. Veja o
SHOW GRANTSda conta, confira o host e teste a senha direto pelo terminal. - Host diferente do esperado: um usuário criado como
'usuario'@'localhost'não conecta de outra máquina. O inverso também vale: se o app está em outro servidor, crie a conta com o IP dele e libere a conexão remota, como descreve o guia Acesso remoto MySQL: como liberar com segurança. - Plugin de autenticação: no MySQL 8.0, o plugin padrão é o
caching_sha2_password, e não mais omysql_native_password. Omysql_native_passwordestá depreciado desde o 8.0.34, vem desativado no 8.4 e foi removido no 9.0.0. Se um programa ou biblioteca antiga só fala o plugin antigo e não conecta, a saída é atualizar o cliente. No 8.4, dá para religar o plugin commysql_native_password=ONna seção[mysqld]do arquivo de configuração, mas isso é um paliativo. - Banco inexistente: o nome do banco pode estar errado ou o banco pode não ter sido criado. Confira o nome com
SHOW DATABASES;. - Senha com caracteres especiais no app: se a senha tem símbolos, o arquivo de configuração do app pode exigir aspas ou escape. Teste primeiro pelo terminal, como mostrado acima.
- Erro de conexão no site: se o site exibe "erro ao estabelecer conexão com o banco de dados", siga o guia Erro ao estabelecer conexão com o banco de dados: solução.
Checklist do usuário do app
- Entrei como administrador com
sudo mysql. - Criei o banco do app antes de dar permissão.
- Criei a conta com o host certo:
localhostou o IP exato do app. - Evitei o
%no host, que está depreciado no MySQL 8.4. - Usei senha longa e só minha, sem reaproveitar de outro sistema.
- Dei permissão só no banco do app (
meu_banco.*) e evitei*.*. - Comecei com
SELECT, INSERT, UPDATE, DELETEe acrescentei só o que faltou. - Conferi com
SHOW GRANTSe testei o login pelo terminal. - Guardei a senha no arquivo de configuração do app e em nenhum outro lugar público.
Perguntas frequentes
Qual comando cria um usuário no MySQL?
O CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'SenhaForteAqui';. Ele cria a conta sem permissões; depois você usa o GRANT para liberar o acesso a um banco.
Preciso rodar FLUSH PRIVILEGES depois do GRANT?
Não. Segundo o manual, o servidor recarrega as permissões sozinho quando você usa comandos como GRANT e REVOKE. O FLUSH PRIVILEGES só é preciso se as tabelas de permissões foram editadas diretamente.
Qual a diferença entre localhost e % no usuário?
Com localhost, a conta só conecta da própria máquina. Com %, ela aceita outras máquinas, mas o manual do MySQL 8.4 avisa que o curinga no host está depreciado. Prefira o IP exato.
Como ver as permissões de um usuário?
Use SHOW GRANTS FOR 'usuario'@'localhost';. A saída lista os privilégios por nível, como banco e tabela.
Posso usar ALL PRIVILEGES para o app?
Pode, mas o manual diz que é boa ideia conceder só os privilégios necessários. Para um app comum, comece com leitura e escrita de linhas e acrescente o resto se o sistema pedir.