【问题标题】:Connecting to MySQL via SSH ERROR 2013 (HY000)通过 SSH 连接到 MySQL 错误 2013 (HY000)
【发布时间】:2014-10-17 13:39:16
【问题描述】:

设置

我目前正在使用 MediaTemple 提供的高级 Wordpress 托管。我有一个非常大的数据集要导入,我希望通过 SSH 隧道直接访问数据库。

---------------                      -------------------               ------------
| My Machine  | ---- SSH TUNNEL -----| Hosting Server  | -- -- ? -- -- | Database |
---------------                      -------------------               ------------

什么有效

如果我通过 ssh 进入 Hosting Server 并从 shell 上的 Hosting Provider,像这样连接到 mysql,我就可以进入 MySQL。

mysql -uuser -ppassword -h123.456.789.1 -P3308

什么不起作用

但是,如果我尝试使用 -L 标志和 SSH 连接到 MySQL 来创建隧道,我将无法连接到服务器。

 ssh me@hostingserver.net  -L 7002:123.456.789.1:3308

从 shell 上 My Machine:

 mysql -uuser -ppassword -h127.0.0.1 -P7002

我收到以下错误:

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

通过阅读其他答案(StackOverflow StackOverflow),我推断问题源于 MySQL 客户端尝试绑定的 IP 地址。我认为附加到连接请求的 IP 地址在我的机器上执行时不在Database Server 的白名单上。

是否可以从My Machine 直接访问 MySQL 数据库。从系统管理的角度来看,我显然有足够的权限从 shell 连接到 MySQL 数据库,但我无法在 My Machine 上运行客户端。我有一个非常大的数据集,我想从My Machine 转移到Database。我还希望能够在需要时访问数据库并执行 SQL。这和大型数据集类型消除了在Hosting Server 上仅使用来自 MySQL 客户端的source 命令的可能性。什么是让我能够从My MachineDatabase 上运行 SQL 的最佳解决方法?

【问题讨论】:

  • 这可能会有所帮助serverfault.com/a/136792
  • 感谢您的链接,但我认为我无法直接通过 SSH 访问数据库服务器。

标签: mysql database ssh mediatemple


【解决方案1】:

我遇到了大致相同的问题。也就是说,我根本无法连接到 MySQL 服务器,即使我已经成功地通过隧道连接到远程主机。

TLDR:这是一个涉及环回接口的iptables 问题

在我的情况下,mysqldsshd 在同一个 VPS 上运行。但是,MySQL 实例仅绑定到 127.0.0.1 并侦听默认端口。正如你所做的那样,我确认我可以使用本地使用的凭据连接到远程计算机上的 mysqld 实例。

这里是隧道:

ssh -v -N -L 33306:127.0.0.1:3306 sshuser@sshanddbvps.org

这是使用mysql 客户端到mysqld 实例的连接字符串:

mysql -umysqluser -h127.0.0.1 -P 33306 -p

虽然ssh表示连接成功...

debug1: Connection to port 33306 forwarding to 127.0.0.1 port 3306 requested.

...mysql 客户端连接在接受正确密码后会出错,并显示您提到的消息:

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet'...

为了检查数据是否通过环回接口流动,我登录到远程服务器并在三个单独的 shell 中运行三个命令:

  1. while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l 127.0.0.1 1234; done
  2. tcpdump -i lo src 127.0.0.1 -or dst 127.0.0.1
  3. nc 127.0.0.1 1234

运行第三个后,出现第二个命令的输出:

13:59:14.474552 IP localhost.36146 > localhost.1234: Flags [S], seq 1149798272, win 43690, options [mss 65495,sackOK,TS val 48523264 ecr 0,nop,wscale 7], length 0

但没有任何迹象表明数据包在反向流动。

在防火墙的INPUT 链中插入允许来自默认环回地址的流量的规则解决了该问题:

iptables -I INPUT 4 -i lo -s 127.0.0.1 -j ACCEPT

【讨论】:

  • 感谢您的描述 - 它拯救了我的一天 :) 我相信最后一行应该运行 iptables,而不是 tcpdump,对吧?
  • @dimril 是的,感谢您的关注!我刚刚更正了。
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 2021-08-07
  • 2020-10-23
  • 2021-11-01
  • 1970-01-01
  • 2014-11-24
  • 2014-02-18
  • 2016-08-13
相关资源
最近更新 更多