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. See Secção 4.4.4, “Configurando os Privilégios Iniciais do MySQL”. 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 MySQL. Normalmente ele fica em
CAMINHO/var/mysql/user.MYD
. onde
CAMINHO
é o caminho para a raiz da
instalação do MySQL.
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
MySQL vem inicialmente configurado
sem senha. Isto também é um risco de segurança, portanto
configurar a senha do usuário root
é
algo que deve ser feito enquanto você configura os outros
usuários do MySQL.
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 campo User
e
que o mysqld
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. See Secção 4.4.8, “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.
See Secçã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. See Secção 4.1.2, “Arquivo de Opções my.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 MySQL 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 MySQL quando a instrução
GRANT
se tornou funcional. See
Secção 2.5.6, “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 Secção 4.4.3, “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ções INSERT
,
UPDATE
ou SET
PASSWORD
. A função PASSWORD()
é desnecessária se você especificar a senha usando a
instrução GRANT ... IDENTIFIED BY
ou o
comando mysqladmin password
. See
Secção 4.4.8, “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
para localhost
não funcionam se você
estiver executando em um sistema que utilize MIT-pthreads
(conexões localhost
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 servidor myssqld
. Neste caso,
você deve ter seu nome de máquina real nos registros da
tabela user
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 com
mysql -u nome_usuário _nome_bd
, você
pode ter um problema com a tabela user
.
Verifique isto executando mysql -u root
mysql
e usando esta sentença SQL:
mysql> SELECT * FROM user;
O resultado deve incluir uma entrada com as colunas
Host
e User
combinando
com o nome de seu computador e seu nome de usuário no
MySQL.
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 tabela user
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 contenha
Using 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 MySQL
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 MySQL server
Você pode corrigir isto utilizando a ferramenta de linha de
comando mysql
(no servidor!) para
adicionar um registro à tabela user
,
db
ou host
para
coincidir com o usuário e nome de máquina de onde você
está tentando conectar, depois execute o comando
mysqladmin flush-privileges
. Se você
não estiver executando o MySQL 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 coluna Host
da
tabela user
e reiniciar o
mysqld
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 MySQL irá indicar como
você está realmente conectando. (Então troque o
'%'
na tabela user
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 MySQL 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 MySQL 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 MySQL 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. See Secção 5.5.5, “Como o MySQL 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 MySQL.
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 mas
mysql -h nome_servidor -u root test
resultar em Access denied
, então você
pode não ter o nome correto para a sua máquina na tabela
user
. Um problema comum é quando o valor
de Host
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 tabela user
,
mas seu DNS diz ao MySQL que o nome da máquina é
'tcx.subnet.se'
, a entrada não irá
funcionar. Tente adicionar um registro à tabela
user
que contenha o número IP de sua
máquina como o valor da coluna Host
.
(Uma alternativa, seria adicionar um registro à tabela
user
com o valor de
Host
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
mas mysql -u nome_usuário outro_bd
não
funconar, você não possui uma entrada para
outro_bd
listado na tabela
db
.
Se mysql -u nome_usuário nome_bd
funciona quando executado no próprio servidor, mas
mysql -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 tabela user
ou na
tabela db
.
Se você não estiver entendendo porque obtem
Access denied
, remova da tabela
user
todas as entradas da coluna
Host
que contenham meta caracteres
(entradas que contenham ‘$
’
ou ‘_
’). Um erro muito comum
é inserir uma nova entrada com
Host
='%'
e
User
='algum usuário'
,
pensando que isto irá permitir a você especificar
localhost
para conectar da mesma
máquina. A razão disto não funcionar é que os
privilégios padrões incluem uma entrada com
Host
='localhost'
e
User
=''
. Como esta
entrada tem o valor 'localhost'
em
Host
que é mais específica que
'%'
, ela é usada no lugar da nova
entrada quando se conectar de localhost
!
O procedimento correto é inserir uma segunda entrada com
Host
='localhost'
e
User
='algum_usuário'
,
ou remover a entrada com
Host
='localhost'
e
User
= ''
.
Se você obter o seguinte erro, você pode ter um problema
com a tabela db
ou a tabela
host
:
Access to database denied
Se a entrada selecionada da tabela db
tiver um valor vazio na coluna Host
,
tenha certeza que exista uma ou mais entradas
correspondentes na tabela host
especificando quais máquinas aplicam-se à tabela
db
.
Se você obter o erro quando estiver utilizando comandos SQL
SELECT ... INTO OUTFILE
ou LOAD
DATA INFILE
, a entrada na tabela
user
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. See
Apêndice F, Variáveis de Ambientes do MySQL. 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. See
Secção 4.1.2, “Arquivo de Opções my.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! See
Secção 4.1.2, “Arquivo de Opções my.cnf
”.
Se você fizer alterações para as tabelas de permissões
diretamente (utilizando uma instrução
INSERT
ou UPDATE
) e
suas alterações parecem ser ignoradas, lembre que você
deve usar uma instrução FLUSH
PRIVILEGES
ou executar um comando
mysqladmin 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 de root
com um comando
UPDATE
, 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
ou
mysql -u nome_usuário -psua_senha
nome_bd
. Se você consegue conectar com o cliente
mysql
, 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 MySQL 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 MySQL e utilizar o
script mysqlaccess
para conferir se suas
modificações fizeram o não o efeito desejado. Quando
você estiver satisfeito com suas alterações, execute
mysqladmin flush-privileges
para dizer ao
servidor mysqld
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. See
Secção E.1.2, “Criando Arquivos Trace (Rastreamento)”.
Se você tiver outros problemas com as tabelas de
permissões do MySQL 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 script
mysqlbug
. See
Secção 1.7.1.3, “Como relatar erros ou problemas”. Em alguns casos você pode
precisar reiniciar o mysqld
com a opção
--skip-grant-tables
para executar o
mysqldump
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.