AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 10852
Accepted
Just a learner
Just a learner
Asked: 2012-01-18 22:43:51 +0800 CST2012-01-18 22:43:51 +0800 CST 2012-01-18 22:43:51 +0800 CST

Erro do MySQL: Acesso negado para o usuário 'a'@'localhost' (usando senha: YES)

  • 772

Eu uso a conta root criada na conta 'a'@'%'. Mas não consigo usar a conta para conectar ao servidor MySQL quando especifico o parâmetro host. Eu posso conectar com sucesso sem o -hparâmetro. Por favor, veja a transcrição abaixo. Espero que alguém possa me ajudar a explicar. Obrigado.

mysql> grant all on *.* to 'a'@'%' identified by a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a' at line 1
mysql> grant all on *.* to 'a'@'%' identified by 'a';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'a'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for a@%                                                                                            |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'a'@'%' IDENTIFIED BY PASSWORD '*667F407DE7C6AD07358FA38DAED7828A72014B4E' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye

[root@localhost ~]# mysql -h localhost -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -h 127.0.0.1 -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.17, for Linux (x86_64) using readline 5.1

Connection id:      20
Current database:   
Current user:       a@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.17 MySQL Community Server (GPL)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/lib/mysql/mysql.sock
Uptime:         15 days 15 hours 20 min 18 sec

Threads: 1  Questions: 40  Slow queries: 0  Opens: 41  Flush tables: 1  Open tables: 4  Queries per second avg: 0.000
--------------

mysql> 

Editar:

Sim, o MySQL está escutando na porta 3306.

[root@localhost ~]# nmap localhost

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2012-01-18 07:35 CST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1674 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
111/tcp  open  rpcbind
631/tcp  open  ipp
840/tcp  open  unknown
3306/tcp open  mysql

Nmap finished: 1 IP address (1 host up) scanned in 0.064 seconds
[root@localhost ~]# 
mysql authentication
  • 4 4 respostas
  • 177370 Views

4 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-01-19T10:13:24+08:002012-01-19T10:13:24+08:00

    ​​​​​​​​​​Aqui está um método rápido e sujo para verificar como o MySQL executa uma autenticação bem-sucedida.

    Execute esta consulta:

    SELECT USER(),CURRENT_USER();
    

    USER() relata como você tentou autenticar no mysqld

    CURRENT_USER() relata como você teve permissão para autenticar pelo mysqld

    Às vezes, USER()e CURRENT_USER()são diferentes. Isso porque a autenticação mysql segue um protocolo específico.

    De acordo com o Guia de Estudo de Certificação MySQL 5.0

    insira a descrição da imagem aqui

    as páginas 486.487 informam o seguinte sobre o algoritmo de autenticação do mysql:

    Existem dois estágios de controle de acesso do cliente:

    No primeiro estágio, um cliente tenta se conectar e o servidor aceita ou rejeita a conexão. Para que a tentativa seja bem-sucedida, alguma entrada na tabela de usuários deve corresponder ao host do qual o cliente se conecta, o nome de usuário e a senha.

    Na segunda etapa (que ocorre apenas se um cliente já tiver se conectado com sucesso), o servidor verifica todas as consultas que recebe do cliente para ver se o cliente possui privilégios suficientes para executá-la.

    O servidor compara um cliente com as entradas nas tabelas de concessão com base no host do qual o cliente se conecta e no usuário fornecido pelo cliente. No entanto, é possível que mais de um registro corresponda:

    Os valores de host nas tabelas de concessão podem ser especificados, pois os padrões contêm valores curinga. Se uma tabela de concessões contiver entradas de myhost.example.com, %.example.com, %.come %, todas elas correspondem a um cliente que se conecta de myhost.example.com.

    Os padrões não são permitidos para os valores do usuário nas entradas da tabela de permissões, mas um nome de usuário pode ser fornecido como uma string vazia para especificar um usuário anônimo. A string vazia corresponde a qualquer nome de usuário e, portanto, atua efetivamente como um curinga.

    Quando os valores de Host e User em mais de um registro da tabela de usuários correspondem a um cliente, o servidor deve decidir qual deles usar. Ele faz isso classificando os registros com os valores de coluna de Host e Usuário mais específicos primeiro e escolhendo o registro correspondente que ocorre primeiro na lista classificada, a classificação ocorre da seguinte maneira:

    Na Coluna Host, valores literais como localhost, 127.0.0.1e myhost.example.comclassificam à frente de valores como aqueles %.example.com que possuem caracteres padrão neles. Os valores padrão são classificados de acordo com a sua especificidade. Por exemplo, %.example.comé mais específico que %.com, que é mais específico que %.

    Na coluna Usuário, os nomes de usuário não em branco são classificados à frente dos nomes de usuário em branco. Ou seja, usuários não anônimos classificam à frente de usuários anônimos.

    O servidor executa essa classificação quando é iniciado. Ele lê as tabelas de concessões na memória, as classifica e usa as cópias na memória para controle de acesso.

    A partir desta descrição, você não precisa se preocupar com a ordem das tabelas mysql.user, pois há uma cópia na memória das tabelas de concessões que são classificadas conforme mencionado anteriormente.

    Com relação a como você fez login, só mysql -u afuncionou. Volte e faça login novamente e execute esses comandos

    SELECT USER(),CURRENT_USER();
    SELECT user,host,password FROM mysql.user;
    

    Certifique-se de que

    • cada usuário tem uma senha.
    • não há usuários anônimos (quando o usuário está em branco)

    Isso é apenas um palpite, mas suspeito mysql -u ade conectar via localhost porque quando o protocolo de conexão não é especificado, o padrão é conectar através do arquivo de soquete. Pode existir uma entrada mysql.userque permite conexão anônima de host local.

    Execute esta consulta:

    SELECT user,host,password FROM mysql.user WHERE user='' AND host='localhost';
    

    Se você voltar uma linha sem senha, isso explica totalmente por que mysq -u afunciona.

    ATUALIZAÇÃO 2012-01-19 11:12 EDT

    Craig Efrein levantou uma questão interessante: se dois nomes de usuário idênticos existirem na tabela mysql.user, um com senha e outro sem, isso significa que o MySQL nega autenticação quando não está usando uma senha?

    Esta pergunta é um excelente aviso sobre a autenticação do usuário do MySQL.

    Por favor, note que a chave primária de mysql.user é host,user. Não há outros índices. Isso permite várias ocorrências de um nome de usuário. Cada ocorrência pode ter uma senha diferente ou nenhuma senha. Isso permite que o usuário 'dbuser' faça login localmente (dbuser@localhost) usando nenhuma senha e o mesmo login de usuário de outro servidor dentro de um determinado netblock (dbuser@'10.1.2.20') com uma senha como 'pass1' e esse usuário faça login remotamente de qualquer lugar (dbuser@'%') com uma senha remota como 'pass2'.

    Dado o algoritmo de autenticação que o MySQL usa, não há restrições impostas aos usuários com a presença ou ausência de uma senha.

    É por isso que o Guia de Estudo de Certificação do MySQL 5.0 diz na página 498 Parágrafo 6 em seus marcadores que mostra como limpar o processo de autenticação:

    No Unix, o MySQL vem com um script mysql_secure_installation que pode executar várias operações úteis relacionadas à segurança em sua instalação. O script tem os seguintes recursos:

    • Defina uma senha para as contas root
    • Remova quaisquer contas root acessíveis remotamente.
    • Remova as contas de usuários anônimos. Isso melhora a segurança porque evita a possibilidade de qualquer pessoa se conectar ao servidor MySQL como root a partir de um host remoto. O resultado é que qualquer pessoa que queira se conectar como root deve primeiro poder fazer login no host do servidor, o que oferece uma barreira adicional contra ataques.
    • Remova o banco de dados de teste (se você remover as contas anônimas, também poderá remover o banco de dados de teste ao qual elas têm acesso).
    • 28
  2. atxdba
    2012-01-19T07:05:56+08:002012-01-19T07:05:56+08:00

    O curinga do host '%' não corresponde a 'localhost'. Por padrão, o cliente mysql tentará se conectar através de um soquete em vez de tcp (geralmente em algum lugar como /var/lib/mysql/mysql.sock).

    Você pode alterar sua concessão para 'a'@'localhost' ou forçar o cliente a operar na pilha TCP como:

    mysql -u a -p --protocol=TCP
    
    • 6
  3. Craig Efrein
    2012-01-18T23:18:07+08:002012-01-18T23:18:07+08:00

    Você verificou se o MySQL está realmente ouvindo em 3306? Execute um netstat -tlpn e forneça os resultados. Se você não vir 3306, provavelmente não.

    Em my.cnf você deve verificar se --skip-networking está comentado

    [mysqld]
    user            = mysql
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    port            = 3306
    basedir         = /usr
    datadir         = /var/lib/mysql
    tmpdir          = /tmp
    language        = /usr/share/mysql/English
    bind-address    = 65.55.55.2
    # skip-networking
    
    • 2
  4. shgnInc
    2014-10-16T03:59:39+08:002014-10-16T03:59:39+08:00

    Como o @atxdba descreveu, para conectar o daemon mysql do remoto que não se conecta via soquete, então você precisa se conectar remotamente via TCP.

    Para isso, você deve especificar as --protocol=TCPconexões por cada. Embora, você possa configurá-lo no my.cnfservidor:

    [client]
    protocol=tcp
    
    • 2

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve