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_db
para 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 test
O servidor deve deixar você conectar sem erros. Você também deve assegurar que exista o arquivo
user.MYD
no 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 mysql
O servidor deve permitir a conexão pois o usuário
root
MariaDB 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
root
e obter este erro:Access denied for user: '@unknown' to database mysql
isto significa que você não possui um registro na tabela
user
com o valor'root'
no campoUser
e que omysqld
não pode rsolver o nome de máquina do cliente. Neste caso, você deve reiniciar o servidor com a opção--skip-grant-tables
e editar seu arquivo/etc/hosts
ou o\Windows\hosts
para adicionar uma entrada para sua máquina. - Se você obter um erro como o seguinte:
shell>
mysqladmin -u root -pxxxx ver
Access 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
mysqld
com a opção--skip-grant-tables
para 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.ini
configurado 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çãoGRANT
se 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
,UPDATE
ouSET PASSWORD
. A funçãoPASSWORD()
é desnecessária se você especificar a senha usando a instruçãoGRANT ... IDENTIFIED BY
ou 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 paralocalhost
não funcionam se você estiver executando em um sistema que utilize MIT-pthreads (conexõeslocalhost
sã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--host
para 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 tabelauser
no servidor. (Isto é verdadeiro mesmo se você estiver executando um programa cliente na mesma máquina que o servidor.)- Se você obter o erro
Access denied
quando 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 mysql
e usando esta sentença SQL:mysql>
SELECT * FROM user;
O resultado deve incluir uma entrada com as colunas
Host
eUser
combinando com o nome de seu computador e seu nome de usuário no MariaDB. - A mensagem de erro
Access denied
irá 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 tabelauser
que 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
user
que 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
,db
ouhost
para 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 colunaHost
da tabelauser
e reiniciar omysqld
com a opção--log
na 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 tabelauser
com 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 ver
Access 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-hosts
para 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
mysqld
com--skip-name-resolve
. - Inicie o
mysqld
com--skip-host-cache
. - Conecte à
localhost
se 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 test
funciona masmysql -h nome_servidor -u root test
resultar 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 deHost
na 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 à tabelauser
que contenha o número IP de sua máquina como o valor da colunaHost
. (Uma alternativa, seria adicionar um registro à tabelauser
com o valor deHost
contendo 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 test
funciona masmysql -u nome_usuário outro_bd
não funconar, você não possui uma entrada paraoutro_bd
listado na tabeladb
. - Se
mysql -u nome_usuário nome_bd
funciona quando executado no próprio servidor, masmysql -u nome_máquina -u nome_usuário nome_bd
não funciona quando executado em outra máquina cliente, você não possui o nome da máquina cliente listado na tabelauser
ou na tabeladb
. - Se você não estiver entendendo porque obtem
Access denied
, remova da tabelauser
todas as entradas da colunaHost
que 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ê especificarlocalhost
para 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'
emHost
que é 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
db
ou a tabelahost
:Access to database denied
Se a entrada selecionada da tabela
db
tiver um valor vazio na colunaHost
, tenha certeza que exista uma ou mais entradas correspondentes na tabelahost
especificando quais máquinas aplicam-se à tabeladb
.Se você obter o erro quando estiver utilizando comandos SQL
SELECT ... INTO OUTFILE
ouLOAD DATA INFILE
, a entrada na tabelauser
provavelmente 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.cnf
no 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
INSERT
ouUPDATE
) e suas alterações parecem ser ignoradas, lembre que você deve usar uma instruçãoFLUSH PRIVILEGES
ou executar um comandomysqladmin flush-privileges
para 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 deroot
com 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_bd
oumysql -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-p
e a senha; você também pode utilizar a sintaxe--password=sua_senha
para especificar a senha. Se você utilizar a opção-p
sozinha, o MariaDB irá lhe solicitar a senha.) - Para testar, iniciae o daemon
mysqld
com a opção--skip-grant-tables
. Então você pode alterar as tabelas de permissões do MariaDB e utilizar o scriptmysqlaccess
para conferir se suas modificações fizeram o não o efeito desejado. Quando você estiver satisfeito com suas alterações, executemysqladmin flush-privileges
para dizer ao servidormysqld
para 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
mysqld
com 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 omysqld
com a opção--skip-grant-tables
para executar omysqldump
.