Base de Conhecimento

Criar usuário MySQL: como dar permissões com GRANT

  • mysql, criar usuário, grant, permissões, banco de dados, ubuntu
  • Usuários acharam útil: 0

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

Arte da Eleven Host: janela de terminal com o título: Criar usuário MySQL: como dar permissões com GRANT

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 (o ALTER TABLE também exige CREATE e INSERT).
  • INDEX: criar e remover índices.
  • ALL PRIVILEGES: todos os privilégios disponíveis naquele nível, exceto o GRANT 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 GRANTS da 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 o mysql_native_password. O mysql_native_password está 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 com mysql_native_password=ON na 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: localhost ou 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, DELETE e acrescentei só o que faltou.
  • Conferi com SHOW GRANTS e 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.

Esta resposta lhe foi útil?

Artigos Relacionados