Comportamento estranho com o redirecionamento de porta mysql


2

Eu configurei o encaminhamento de porta MySQL na minha máquina como:

ssh -f -N -L :9906:localhost:3306 <ssh login>

Agora, se eu tentar conectar ao MySQL do meu localhost como:

mysql -u<user> -p<password> -P9906 -h127.0.0.1 <schema> 

Funciona bem. Mas, se eu tirar o -parâmetro h no meu local, ou seja, se eu me conectar ao MySQL como abaixo do localhost:

mysql -u<user> -p<password> -P9906 <schema> 

Estou tendo o erro a seguir:

ERRO 1045 (28000): Acesso negado para o usuário '' @ 'localhost' (usando a senha: YES)

Por que esse comportamento?

Eu tentei definir o encaminhamento de porta para ambos localhost, bem como 127.0.0.1, mas o erro ainda permanece.

Além disso, no servidor, concedemos privilégios ao usuário tanto para o host local quanto para o 127.0.0.1.


Verifique seu my.ini. Isto existe? Está no lugar correto e acessível? Você mudou alguma coisa relacionada ao nome do host?
Synetech

Respostas:


4

Existem quatro (4) CENÁRIOS para prestar atenção

CENÁRIO 1

Quando você especificar, -P<port number>você deve estar usando o TCP / IP. Assim, -h<IPAddress>funcionaria.

CENÁRIO # 2

Quando você especifica -P<port number>sem -h<IPAddress>, localhosté assumido. Com isso acontecendo, o TCP / IP não é usado, mas o arquivo de soquete mysql é usado para autenticar.

CENÁRIO # 3

Quando você especifica -h127.0.0.1sem -P<port number>, localhosté assumido. Com isso acontecendo, o TCP / IP não é usado, mas o arquivo de soquete mysql é usado para autenticar.

CENÁRIO # 4

Quando você especifica -h127.0.0.1com -P<port number>, localhostnão é assumido. O TCP / IP será usado, mas o usuário deve ser definido corretamente.

Dada a mensagem de erro:

ERRO 1045 (28000): Acesso negado para o usuário '' @ 'localhost' (usando a senha: YES)

e do jeito que você tentou fazer o login

mysql -u -p -P9906 -h127.0.0.1

Você atingiu o CENÁRIO # 4

SUGESTÃO

Em mysql.user, verifique se você tem

  • user@localhost (Está bem)
  • user@127.0.0.1, (Está bem)
  • user@% (não recomendado mas pode fazer)

com a mesma senha (ou senhas diferentes se desejado)

Depois de conseguir fazer o login com êxito, execute esta consulta

SELECT USER(),CURRENT_USER();

USER () relata como você tentou autenticar no MySQL

CURRENT_USER () relata como você foi autorizado a autenticar no MySQL

Adicionar o usuário certo permite autenticar corretamente. Seu objetivo deve ser o de usuários de configuração no mysql.userde tal forma que USER()e CURRENT_USER()tem saída idêntica ou pelo menos como possível específico do host.


Eu acho que essa resposta está fora do tópico. A questão aqui não é a autorização para @'localhost', @'127.0.0.1'ou @'%', mas o fato de o MySQL se conectar através do arquivo de soquete ao usar o host local, como expliquei na minha resposta abaixo.
ssssteffff

1

O cliente MySQL conecta-se ao arquivo de soquete se nenhum nome de host for especificado (ou se hostname de host local for especificado usando -hlocalhost, mesmo que você especifique uma porta. Então, quando você tenta se conectar ao banco de dados remoto usando mysql -u -p -P9906, você está realmente tentando acessar seu servidor MySQL local Digite SHOW DATABASESe sua lista de bancos de dados locais será impressa.

Portanto, para acessar a instância remota por meio do encaminhamento de porta, é necessário especificar o host (127.0.0.1) para evitar a conexão com o arquivo de soquete.

Aqui está a documentação do MySQL :

No Unix, os programas MySQL tratam o nome do host localhost especialmente, de uma forma que é provavelmente diferente do que você espera comparado a outros programas baseados em rede. Para conexões com localhost, programas MySQL tentam se conectar ao servidor local usando um arquivo de soquete Unix. Isso ocorre mesmo se uma opção --port ou -P for especificada para especificar um número de porta. Para garantir que o cliente estabeleça uma conexão TCP / IP com o servidor local, use --host ou -h para especificar um valor de nome de host 127.0.0.1 ou o endereço IP ou o nome do servidor local. Você também pode especificar o protocolo de conexão explicitamente, mesmo para localhost, usando a opção --protocol = TCP.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.