Causas dos Erros de Accesso Negado
Se você encontrar erros de Accesso Negado (Access denied) quando tentar conectar-se ao servidor MySQL, a lista abaixo indica alguns caminhos que você pode seguir para corrigir o problema:
- Depois de instalar o MySQL, você executou o script
mysql_install_dbpara configurar o conteúdo inicial das tabelas de permissões ? Se não, faça isto. Leia "Configurando os Privilégios Iniciais do MariaDB". Testes os privilégios iniciais executando este comando:shell>
mysql -u root testO servidor deve deixar você conectar sem erros. Você também deve assegurar que exista o arquivo
user.MYDno diretório do banco de dados do MariaDB. Normalmente ele fica emCAMINHO/var/mysql/user.MYD. ondeCAMINHOé o caminho para a raiz da instalação do MariaDB. - Depois de terminar uma instalação, você deve conectar ao servidor e configurar seus usuários e suas permissões de acesso.
shell>
mysql -u root mysqlO servidor deve permitir a conexão pois o usuário
rootMariaDB vem inicialmente configurado sem senha. Isto também é um risco de segurança, portanto configurar a senha do usuáriorooté algo que deve ser feito enquanto você configura os outros usuários do MariaDB.Se você tentar se conectar como
roote obter este erro:Access denied for user: '@unknown' to database mysql
isto significa que você não possui um registro na tabela
usercom o valor'root'no campoUsere que omysqldnão pode rsolver o nome de máquina do cliente. Neste caso, você deve reiniciar o servidor com a opção--skip-grant-tablese editar seu arquivo/etc/hostsou o\Windows\hostspara adicionar uma entrada para sua máquina. - Se você obter um erro como o seguinte:
shell>
mysqladmin -u root -pxxxx verAccess denied for user: 'root@localhost' (Using password: YES)Significa que você está usando uma senha incorreta. Leia "Configurando Senhas".
Se você esqueceu a senha de root, você pode reiniciar o
mysqldcom a opção--skip-grant-tablespara alterar a senha. Leia Seção A.4.2, "Como Recuperar uma Senha de Root Esquecida".Se você obter o erro acima mesmo se não tiver configurado uma senha, significa que você tem algum arquivo
my.iniconfigurado para passar alguma senha incorreta. Leia "Arquivo de Opçõesmy.cnf". Você pode evitar o uso de arquivos de opções com a opção--no-defaults, como a seguir:shell>
mysqladmin --no-defaults -u root ver - Se você atualizou uma instalação existente do MariaDB de um versão anterior à versão 3.22.11 para a Versão 3.22.11 ou posterior, você executou o script
mysql_fix_privilege_tabels? Se não faça isto. A estrutura das tabelas de permissões alteraram com a Versão 3.22.11 do MariaDB quando a instruçãoGRANTse tornou funcional. Leia "Atualizando a Tabela de Permissões". - Se os seus privilégios parecerem alterados no meio de uma sessão, pode ser que o superusuário os alterou. A recarga das tabelas de permissões afeta novas conexões dos clientes, mas ela também afeta conexões existentes como indicado em "Quando as Alterações nos Privilégios tem Efeito".
- Se você não consegue fazer a sua senha funcionar, lembre-se que você deve usar a função
PASSWORD()se você configurar a senha com instruçõesINSERT,UPDATEouSET PASSWORD. A funçãoPASSWORD()é desnecessária se você especificar a senha usando a instruçãoGRANT ... IDENTIFIED BYou o comandomysqladmin password. Leia "Configurando Senhas". localhosté um sinônimo para seu nome de máquina local, e é também a máquina padrão em que clientes tentam se conectar se você não especificar explicitamente o nome da máquina. Entretanto, conexões paralocalhostnão funcionam se você estiver executando em um sistema que utilize MIT-pthreads (conexõeslocalhostsão feitas utilizando sockets Unix, que não são suportadas pelas MIT-pthreads). Para evitar este problema nestes sistemas, você deve utilizar a opção--hostpara nomear explicitamente o servidor. Isto fará uma conexão TCP/IP ao servidormyssqld. Neste caso, você deve ter seu nome de máquina real nos registros da tabelauserno servidor. (Isto é verdadeiro mesmo se você estiver executando um programa cliente na mesma máquina que o servidor.)- Se você obter o erro
Access deniedquando tentando conectar ao banco de dados commysql -u nome_usuário _nome_bd, você pode ter um problema com a tabelauser. Verifique isto executandomysql -u root mysqle usando esta sentença SQL:mysql>
SELECT * FROM user;O resultado deve incluir uma entrada com as colunas
HosteUsercombinando com o nome de seu computador e seu nome de usuário no MariaDB. - A mensagem de erro
Access deniedirá dizer a você com qual usuário você está tentando se logar, a máquina que está tentando conectar e se você está utilizando uma senha ou não. Normalmente, você deve ter um registro na tabelauserque combine exatamente com o nome de máquina e o nome de usuário que forem fornecidos na mensagem de erro. Por exemplo, se você obter uma mensagem de erro que contenhaUsing password: NO, isto significa que você está tentando se conectar sem uma senha. - Se você obter o seguinte erro quando estiver tentando conectar de uma máquina diferente da que o servidor MariaDB estiver executando, então não deve existir um registro na tabela
userque combine com esta máquina:Host ... is not allowed to connect to this MariaDB server
Você pode corrigir isto utilizando a ferramenta de linha de comando
MariaDB(no servidor!) para adicionar um registro à tabelauser,dbouhostpara coincidir com o usuário e nome de máquina de onde você está tentando conectar, depois execute o comandomysqladmin flush-privileges. Se você não estiver executando o MariaDB Versão 3.22 e você não sabe o número IP ou o nome da máquina da qual estiver conectando, você deve colocar uma entrada com o valor'%'na colunaHostda tabelausere reiniciar omysqldcom a opção--logna máquina onde é executado o servidor. Depois tente conectar a partir da máquina cliente, a informação no log do MariaDB irá indicar como você está realmente conectando. (Então troque o'%'na tabelausercom o nome da máquina mostrado pelo log. De outra forma você teria um sistema que seria inseguro.)Outra razão para este erro no Linux pode ser porque você está utilizando uma versão binária do MariaDB que é compilada com uma versão diferente da glibc que você está usando. Neste caso você deve atualizar seu SO/Glibc ou fazer o download da versão fonte do MariaDB e compilá-la. Um RPM fonte é, normalmente, fácil de compilar e instalar, logo, isto não é um grande problema.
- Se você obter uma mensagem de erro onde o nome da máquina não é exibido ou, no lugar do nome da máquina existir um IP, mesmo se você tenta a conexão com um nome de máquina:
shell>
mysqladmin -u root -pxxxx -h some-hostname verAccess denied for user: 'root@' (Using password: YES)Isto significa que o MariaDB obteve algum erro quando tentava resolver o IP para um nome de maquina. Neste caso você pode executar
mysqladmin flush-hostspara zerar o cache DNS interno. Leia "Como o MariaDB Utiliza o DNS".Algumas soluções permanentes são:
- Tente descobrir o que está errado com seu servidor DNS e corrija os erros.
- Especifique números IPs no lugar de nomes nas tabelas de privilégios do MariaDB.
- Inicie o
mysqldcom--skip-name-resolve. - Inicie o
mysqldcom--skip-host-cache. - Conecte à
localhostse você estiver executando o servidor e o cliente na mesma máquina. - Coloque os nomes das máquinas clientes em
/etc/hosts.
- Se
mysql -u root testfunciona masmysql -h nome_servidor -u root testresultar emAccess denied, então você pode não ter o nome correto para a sua máquina na tabelauser. Um problema comum é quando o valor deHostna entrada da tabela user especifica um nome de máquina não qualificado, mas as rotinas de resolução de nomes de seu sistema retornam um nome qualificado completo do domínio (ou vice-versa). Por exemplo, se você tem uma entrada com o nome'tcx'na tabelauser, mas seu DNS diz ao MariaDB que o nome da máquina é'tcx.subnet.se', a entrada não irá funcionar. Tente adicionar um registro à tabelauserque contenha o número IP de sua máquina como o valor da colunaHost. (Uma alternativa, seria adicionar um registro à tabelausercom o valor deHostcontendo um metacaracter, por exemplo,'tcx.%'. Entretanto, o uso de nomes de máquinas terminando com '%' é inseguro e não é recomendado!) - Se
mysql -u nome_usuário testfunciona masmysql -u nome_usuário outro_bdnão funconar, você não possui uma entrada paraoutro_bdlistado na tabeladb. - Se
mysql -u nome_usuário nome_bdfunciona quando executado no próprio servidor, masmysql -u nome_máquina -u nome_usuário nome_bdnão funciona quando executado em outra máquina cliente, você não possui o nome da máquina cliente listado na tabelauserou na tabeladb. - Se você não estiver entendendo porque obtem
Access denied, remova da tabelausertodas as entradas da colunaHostque contenham meta caracteres (entradas que contenham '$' ou '_'). Um erro muito comum é inserir uma nova entrada comHost='%'eUser='algum usuário', pensando que isto irá permitir a você especificarlocalhostpara conectar da mesma máquina. A razão disto não funcionar é que os privilégios padrões incluem uma entrada comHost='localhost'eUser=''. Como esta entrada tem o valor'localhost'emHostque é mais específica que'%', ela é usada no lugar da nova entrada quando se conectar delocalhost! O procedimento correto é inserir uma segunda entrada comHost='localhost'eUser='algum_usuário', ou remover a entrada comHost='localhost'eUser=''. - Se você obter o seguinte erro, você pode ter um problema com a tabela
dbou a tabelahost:Access to database denied
Se a entrada selecionada da tabela
dbtiver um valor vazio na colunaHost, tenha certeza que exista uma ou mais entradas correspondentes na tabelahostespecificando quais máquinas aplicam-se à tabeladb.Se você obter o erro quando estiver utilizando comandos SQL
SELECT ... INTO OUTFILEouLOAD DATA INFILE, a entrada na tabelauserprovavelmente não tem o privilégio file habilitado. - Lembre-se que programas clientes irão usar parâmetros de conexões especificados em arquivos de configuração ou variáveis ambientais. Leia Apêndice F, Variáveis de Ambientes do MariaDB. Se parecer que algum cliente está enviando parâmetros errados para a conexão e você não os especificou na linha de comando, verifique seu ambiente e o arquivo
.my.cnfno seu diretório home. Você pode também conferir os arquivos de configurações do servidor MySQL, apesar de não ser interessante gravar configurações de cliente nestes arquivos. Leia "Arquivo de Opçõesmy.cnf". Se você obter a mensagem de acesso negado (Access denied) quando estiver executando um cliente sem opções, tenha certeza que você não especificou uma senha antiga em nenhum de seus arquivos de opções! Leia "Arquivo de Opçõesmy.cnf". - Se você fizer alterações para as tabelas de permissões diretamente (utilizando uma instrução
INSERTouUPDATE) e suas alterações parecem ser ignoradas, lembre que você deve usar uma instruçãoFLUSH PRIVILEGESou executar um comandomysqladmin flush-privilegespara o servidor ler novamente as tabelas com os privilégios. De outra forma, suas alterações não farão efeito até que o servidor seja reiniciado. Lembre-se que depois de configurar a senha derootcom um comandoUPDATE, não será necessário especificar a senha até que você atualize os privilégios, pois o servidor ainda não saberá que você alterou a senha! - Se você tiver problemas de acesso com Perl, PHP, Python ou um programa ODBC, tente conectar ao servidor com
mysql -u nome_usuário nome_bdoumysql -u nome_usuário -psua_senha nome_bd. Se você consegue conectar com o clienteMariaDB, existe algum problema com seu programa e não o acesso aos privilégios (Note que não espaço entre-pe a senha; você também pode utilizar a sintaxe--password=sua_senhapara especificar a senha. Se você utilizar a opção-psozinha, o MariaDB irá lhe solicitar a senha.) - Para testar, iniciae o daemon
mysqldcom a opção--skip-grant-tables. Então você pode alterar as tabelas de permissões do MariaDB e utilizar o scriptmysqlaccesspara conferir se suas modificações fizeram o não o efeito desejado. Quando você estiver satisfeito com suas alterações, executemysqladmin flush-privilegespara dizer ao servidormysqldpara iniciar utilizando as novas tabelas com os privilégios. Nota: Recarregar as tabelas de permissões sobrescreve a opção--skip-grant-tables. Isto lhe permite dizer ao servidor para começar a utilizar as tabelas de permissões novamente sem reiniciá-lo. - Se tudo mais falhar, inicie o servidor
mysqldcom uma opção de depuração (por exemplo,--debug=d,general,query). Isto irá imprimir informações de máquinas e usuários sobre tentativas de conexões, e também informações sobre cada comando disparado. Leia Seção E.1.2, "Criando Arquivos Trace (Rastreamento)". - Se você tiver outros problemas com as tabelas de permissões do MariaDB e sente que deve enviar o problema para a lista de discussão, sempre forneça um descarga das tabelas de permissões do seu MySQL. Você pode descarregar as tabelas com o comando
mysqldump mysql. Como sempre, envie seus problemas utilizando o scriptmysqlbug. Leia "Como relatar erros ou problemas". Em alguns casos você pode precisar reiniciar omysqldcom a opção--skip-grant-tablespara executar omysqldump.