Conectando-se ao mysql de 127.0.0.1 em vez de localhost

6

Eu tenho um problema semelhante ao aqui . O problema é que a solução proposta não funciona para mim:

Só por enquanto tenho usuários:

+----------+------------------------------------+
| user     | host                               |
+----------+------------------------------------+
| root     | 127.0.0.1                          |
| root     | localhost                          |

ambos sem senhas (só por enquanto. Eu sei que é ruim!).

Estou conectando ao mysql usando este comando:

mysql -u root -h 127.0.0.1 --protocol=tcp

Depois de fazer login, recebo:

mysql -u root -h 127.0.0.1 --protocol=tcp
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.61-log Source distribution

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> \s
--------------
mysql  Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1

Connection id:      5
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.1.61-log Source distribution
Protocol version:   10
Connection:     127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:       3306
Uptime:         2 days 9 hours 2 min 13 sec

Threads: 1  Questions: 102  Slow queries: 0  Opens: 19  Flush tables: 1  Open tables: 12  Queries per second avg: 0.0
--------------

mysql> SELECT USER(),CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)

mysql> 

PERGUNTA:

Como fazer login como 'root'@127.0.0.1?

    
por misiek 23.04.2014 / 11:52

2 respostas

2

Boa noite, @RolandoMySQLDBA , o autor de essa postagem que você mencionou .

Veja as últimas três linhas

Server version:     5.1.61-log Source distribution
Protocol version:   10
Connection:     127.0.0.1 via TCP/IP

A última linha diz 127.0.0.1 via TCP/IP , então você está 100% usando o protocolo TCP / IP.

Você executou SELECT USER(),CURRENT_USER(); ?

Se você fez, deveria dizer

[email protected] | [email protected]

Parece estranho que a saída seja

[email protected] | root@localhost

Por favor, observe o seguinte: Como ambos os usuários root possuem concessões idênticas e senhas idênticas (nenhuma neste caso), o mysqld decidiu escolher root@localhost . Neste ponto, você provavelmente está se perguntando, "Por que mysqld faria essa escolha?"

No DBA StackExchange, eu tenho essa postagem de 2 anos de idade ( erro do MySQL: acesso negado para o usuário 'a' @ 'localhost' (usando a senha: YES) ). Nesse passado, descrevo exatamente como o mysqld faz a autenticação do usuário. Observe os parágrafos das páginas 486.487 do Guia de estudo de certificação do MySQL 5.0

There are two stages of client access control:

In the first stage, a client attempts to connect and the server either accepts or rejects the connection. For the attempt to succeed, some entry in the user table must match the host from which the clent connects, the username, and the password.

In the second stage (which occurs only if a client has already connected sucessfully), the server checks every query it receives from the client to see whether the client has sufficient privileges to execute it.

The server matches a client against entries in the grant tables based on the host from which the client connects and the user the client provides. However, it's possible for more than one record to match:

Como mencionei no livro de certificação, it's possible for more than one record to match . Portanto, mysqld fez a escolha.

Se você excluir root@localhost de mysql.user , essa é uma maneira de combinar SELECT USER(),CURRENT_USER(); . Outra maneira é dar a [email protected] uma senha.

SUMMARY

Ter dois usuários raiz com meios idênticos de uso para autenticação do usuário é a causa básica de você não conseguir ver [email protected] . Não obstante, você está usando TCP/IP .

NOTA LATERAL

Certifique-se de que 127.0.0.1 esteja definido no sistema operacional. Execute isto:

cat /etc/hosts | grep -c "127\.0\.0\.1"

Se você obtiver 0 , o sistema operacional não saberá sobre isso. Você precisaria adicionar 127.0.0.1 a /etc/hosts e reiniciar a rede e, em seguida, o mysql.

ATUALIZAÇÃO 2014-04-26 20:00 EDT

O que estou prestes a dizer pode parecer bobo, mas a Documentação usa TCP em vez de tcp

On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs. For connections to localhost, MySQL programs attempt to connect to the local server by using a Unix socket file. This occurs even if a --port or -P option is given to specify a port number. To ensure that the client makes a TCP/IP connection to the local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP address or name of the local server. You can also specify the connection protocol explicitly, even for localhost, by using the --protocol=TCP option. For example:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

The --protocol option enables you to establish a particular type of connection even when the other options would normally default to some other protocol.

Tente usar o protocolo = TCP assim

mysql -u root -h 127.0.0.1 --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"
mysql -u root -h localhost --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"

para ver se isso faz diferença.

ATUALIZAÇÃO 2014-05-09 16:19

Você precisa examinar o /etc/hosts cuidadosamente

Se você vir isso em /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

, em seguida, fazer login como [email protected] deve funcionar corretamente

Se você vir isso em /etc/hosts

127.0.0.1       localhost

então [email protected] não tem chance de trabalhar

    
por 25.04.2014 / 04:36
-1

O PHP ainda está tentando usar o local do soquete padrão. Esse problema pode aparecer se você tiver movido a pasta MariaDB / MySQL de / var / lib / mysql para outro local. Para resolver o problema, você deve definir a localização do novo socket no arquivo /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Cuidado, dependendo de qual driver você usa, você pode ter que especificar o pdo_mysql.default_socket = !

Para verificar seu diretório atual, execute o seguinte comando no mysql:

select @@datadir;
    
por 17.02.2017 / 11:30