Menu Principal

quarta-feira, 24 de agosto de 2011

Mysql

FONTE: :http://dev.mysql.com/doc/refman/4.1/pt/access-denied.html

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. 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.

Nenhum comentário:

Postar um comentário