I have set up a SSH tunnel between two servers A and B. B has MySQL server, and this works:
mysql -h localhost -P 3306 -u user -p
While this doesn’t:
mysql -h 127.0.0.1 -P 3306 -u user -p
Although my.cnf has these lines:
bind-address = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address = 99.99.99.99
Now about the tunnel. It connects the following:(A) localhost(9989) -> (B) localhost(3306)
But when (on A, with ports forwarded) I do
mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p
I get ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
And when I do
mysql -v -h localhost -P 9989 -u user userdb -p
I get ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)
What might be the reason? What am I doing wrong?
There are three issues here.
1 – Forget about the SSH tunnel for now
You cannot bind MySQL to more than one specific IP.
The first
bind-addressclause is overridden (therefore, ignored) by the second one. Your server only listens to99.99.99.99.The reason why you can connect with
-h localhostbut not with-h 127.0.0.1is that in the first form, you do not actually connect through TCP/IP, but through a local socket.Look in your
my.cnffor asocketclause.Remove one redundant
bind-addressclause. You may want to usebind-address=0.0.0.0, which instructs MySQL daemon to listen to all network interfaces.2 – Let’s setup your SSH tunnel
The reason for you error
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0is not obvious to me. I suspect SSH tunnel is actually established only when it receives a connection request (in your case, when you run themysqlclient). Since your server does not listen to 127.0.0.1 (see previous paragraph), the SSH tunnel cannot be established, connection fails, and your client interprets it as a network failure.3 – Why
mysql -v -h localhost -P 9989 -u user userdb -pfailsPlease post the output of
[edit : just added
...OR host LIKE 'localhost'below, as this might be relevant for troubleshooting purposes](replace
'user', after theLIKEclause, with the actual user name if necessary)MySQL access control checks both the username/password (
user) and the origin of the connection (host) to identify a user. You probably did not create a user'user'@'localhost'.N.B.: mysql.com being unreachable from my location at this time, I cannot link to the relevant manual pages.