【问题标题】:Lost connection to MySQL server at 'reading initial communication packet', system error: 0在“读取初始通信数据包”时失去与 MySQL 服务器的连接,系统错误:0
【发布时间】:2011-08-10 23:31:25
【问题描述】:

我收到错误:

“在'读取初始通信包时丢失与MySQL服务器的连接,系统错误:0”

当我要连接我的数据库时。

如果我使用 localhost 一切正常。 但是当我使用如下所示的实时 IP 地址时,会出现错误:

mysql_connect("202.131.xxx.106:xxxx", "xxxx", "xxxxx") or die(mysql_error());

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    有人here 建议可能是防火墙问题:

    我刚遇到这个问题,发现是我的防火墙。我使用 PCTools Firewall Plus,它不允许完全访问 MySQL。一旦我改变它就很好了。希望对您有所帮助。

    可以吗?

    另外,有人here 建议这可能是因为 MySQL 服务器绑定到环回 IP(127.0.0.1 / localhost),这有效地切断了您从“外部”连接。

    如果是这种情况,您需要将脚本上传到网络服务器(可能也在运行 MySQL 服务器)并将您的服务器主机保持为“localhost”

    【讨论】:

    • 本地主机是什么意思?我也面临同样的问题,也只使用本地主机。应用程序与数据库位于同一台机器上。本地主机是什么意思?
    • @oneofakind 他的意思是连接到'localhost'而不是'127.0.0.1'
    • 我在 OSX 上使用 mamp pro 时遇到了同样的问题。我通过禁用/重新启用 mamp pro mysql 选项卡上的“允许网络访问 mysql”复选框来修复它。
    【解决方案2】:

    打开名为 my.cnf 的 mysql 配置文件并尝试找到“bind-address”,这里将设置(127.0.0.1 或 localhost)替换为您的实时服务器 ip(您在 mysql_connect 函数中使用的 ip)

    这绝对可以解决问题。

    谢谢

    【讨论】:

    • 确保在使用 ssh 隧道时使用 bind-address = 127.0.0.1 或 localhost。 bitnami 有这个问题,其中 bind-address 是机器 ip。
    • Debian 10 + MySQL 独立专用服务器同样的问题及解决方法。
    • 应该提到的是,在适用的情况下,通常最好将 mysql 服务绑定到127.0.0.1,因此无法从其他主机直接访问。这可以防止远程暴力攻击,并且不会将可能的安全问题暴露给网络。如果您的应用程序位于同一台机器上(这是一种非常常见的托管设置),请使用 127.0.0.1 resp。 localhost 作为 mysql 主机,它的工作方式与将服务绑定到您的外部接口并将其用作 mysql 主机相同。如果您的应用程序位于其他地方,请尽可能使用内部网络。
    【解决方案3】:

    1) 允许远程连接到 MySQL。 编辑文件:

    >sudo nano /etc/mysql/my.cnf
    

    评论行:

    #bind-address       = 127.0.0.1
    

    重启 MySQL:

    >sudo service mysql restart
    

    2) 为远程连接创建用户。

    >mysql -uroot -p
    
    CREATE USER 'developer'@'localhost' IDENTIFIED BY 'dev_password';
    CREATE USER 'developer'@'%' IDENTIFIED BY 'dev_password';
    
    GRANT ALL ON *.* TO 'developer'@'localhost';
    GRANT ALL ON *.* TO 'developer'@'%';
    

    3) 在我的情况下,我需要使用 Ubuntu 从 Windows 远程连接到 VirtualBox 机器。所以我需要在 iptables 中允许端口 3306:

    >iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
    

    【讨论】:

    • 对我来说,我忘记了在 my.cnf 上验证绑定地址。谢谢。
    • 这完全有帮助。谢谢!
    • 工作得很好,但我在 Windows 上使用工作台,所以没有做第 3 步。但它工作。谢谢!
    • 虽然最后一个命令对我不起作用,但用你的方式创建新用户解决了我的问题。我可以从笔记本电脑访问树莓派上的 mysql。谢谢!
    • 创建新用户后记得FLUSH PRIVILEGES
    【解决方案4】:

    设置新的从服务器时遇到此问题。发现主服务器/etc/hosts.allow文件中缺少从服务器IP地址。添加了 IP 地址,它让我可以连接到主服务器。

    请注意,我使用hosts.allowhosts.deny 来控制访问。

    【讨论】:

    • 连接器/c++ 的问题。现在,如果我只能在denyALL: ALL 时找到allow 中需要的设置...
    • 这真的救了我的命,我在从工作台连接到 mysql 时遇到问题,我需要将“ALL: 127.0.0.1”添加到 /etc/hosts.allow 文件中,它开始工作跨度>
    • 在我的例子中,/etc/hosts 有一个错误(旧)的主机 IP 条目。当发布一个新 IP 时,它在旧 IP 之下,似乎被忽略了。删除旧 IP 可修复错误。
    【解决方案5】:

    我遇到了这个问题,结果是之前的系统管理员更改了 MySQL 运行的端口。 MySQL Workbench 试图连接到默认的 3306,但服务器在 20300 上运行。

    【讨论】:

    • 这个答案很好。事实证明,这是我对自己做的。
    【解决方案6】:

    这个错误意味着它没有从它期望找到服务器的端口收到响应。原因包括联系错误的机器(由于多种原因之一)到服务器不在预期的端口上。

    在 /etc/mysql/my.cnf 中检查您的服务器绑定到哪个端口。这是否与您的连接语句中的内容相对应。如果它们匹配,则尝试从服务器本身和运行客户端的机器的命令行连接 mysql。如果它在一个地方而不是另一个地方工作,那么您可能有防火墙/路由器配置问题。

    【讨论】:

    • 我不认为这是正确的,如果该端口上没有任何东西在监听,那么您将收到ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61) 的响应,而不是Lost connection to MySQL server 消息。
    【解决方案7】:

    我的问题是 MySQL 只绑定到 linux 上的 lo。 为了解决问题,我编辑了 my.cnf(位于 /etc/mysql/my.cnf)删除了 bind-address=127.0.0.1

    这允许mysql绑定到任何网络接口

    【讨论】:

      【解决方案8】:

      我刚刚在 Windows 机器上设置了 mysql。当我试图在同一个盒子上连接 Navicat MySql 客户端时,我得到了 OP 的错误。我必须将 127.0.0.1 指定为主机,然后就可以了。

      localhost,或者服务器的实际ip地址都不起作用。

      【讨论】:

        【解决方案9】:

        我在尝试使用 MySQL Workbench 6.3 连接到 Google Cloud SQL 时出现此错误。

        经过一番研究,我发现我的 IP 地址已被互联网提供商更改,并且不允许在 Cloud SQL 中使用。

        我授权了,又回去工作了。

        【讨论】:

          【解决方案10】:

          还有一个原因……

          我遇到了一个 Ubuntu 服务器,其中所有内容都是自定义的,并且由于同样的错误而无法连接。

          这个设置在/etc/ssh/sshd_config里面

          PermitTunnel no
          

          变成后

          PermitTunnel yes
          

          我能够远程连接到我的 MySQL 数据库

          【讨论】:

            【解决方案11】:

            从 MySQL 工作台连接时,我遇到了同样的错误。这是我修复它的方法。我的 /etc/my.cnf 配置文件将绑定地址值设置为服务器的 IP 地址。必须这样做才能设置复制。无论如何,我通过做两件事来解决它:

            1. 从my.cnf文件中的绑定地址创建一个可以用来连接的用户

            例如

            CREATE USER 'username'@'bind-address' IDENTIFIED BY 'password';
            GRANT ALL PRIVILEGES ON schemaname.* TO 'username'@'bind-address';
            FLUSH PRIVILEGES;
            
            1. 在 MySQL 工作台中更改连接详细信息中的 MySQL 主机名值以匹配绑定地址

            【讨论】:

            • 非常感谢,我们还有 MySQL 复制,绑定地址是本地地址:10.0.0.x。我为这个解决方案苦苦挣扎了好几天。
            【解决方案12】:

            对我来说,问题是 DNS 查询被子网内的 FW 阻止。解决方案是在 MySQL 中禁用 DNS 查找。

            【讨论】:

            • 我怀疑 DNS 也是我的罪魁祸首。
            【解决方案13】:

            对我来说,找到配置文件“/etc/mysql/mysql.conf.d/mysqld.cnf”注释掉绑定地址就可以了。

            正如我们在这里看到的: 现在默认只监听而不是跳过网络 localhost 更兼容且安全性更高。

            【讨论】:

            • 最令我惊讶的是,这个在 Debian 10 下工作。我给了它一个机会,并且工作!编辑了 mysql 配置 sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf 而不是 bind-address = 111.112.113.114 我使用了 bind-address = 127.0.0.1。 SSH 隧道设置按照hostpresto.com/community/tutorials/… 中的描述进行设置,干得好!谢谢!
            【解决方案14】:

            我正在尝试在 Ubuntu 18.04 上连接我的数据库 docker 容器,同样的问题。

            首先通过运行nmcli dev检查您的设备以检查设备docker0是否已连接。

            如果没有连接,尝试重启docker服务:

            sudo service docker restart

            【讨论】:

              【解决方案15】:

              我尝试在端口3306 上通过远程服务器创建telnet。 错误信息很清楚

              Host 'x.x.x.x' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.

              由于服务器 mysqladmin flush-hosts 上的 root 完全正常工作!

              【讨论】:

                【解决方案16】:

                就我而言,我在 hosts.deny 中有 ALL:ALL。将其更改为 ALL:PARANOID 在通过 ssh 连接时解决了我的问题

                【讨论】:

                  【解决方案17】:

                  这个问题对我来说很愚蠢。

                  我曾经在 AWS EC2 Ubuntu 机器上遇到同样的问题(MariaDB 暂时安装在本地),所以我尝试进行 SSH 隧道,并且遇到了同样的问题。所以我尝试通过终端 ssh 隧道:

                  ssh -L13306:127.0.0.1:3306 root@ip.address -i my/private/key.pem
                  

                  它告诉我这个:

                  请以“ubuntu”用户而不是“root”用户身份登录。

                  我将 ssh 用户从 root 更改为 ubuntu,就像我的 ssh 配置一样,它连接得很好。

                  所以请检查您的 SSH 连接用户。

                  我监督了这个,所以这也占了我半个小时的时间,所以我希望这对你有用。

                  【讨论】:

                    【解决方案18】:

                    遇到同样的问题,绑定地址来回无济于事。我的解决方案是刷新权限

                    mysql> FLUSH PRIVILEGES;
                    

                    【讨论】:

                      【解决方案19】:

                      我遇到了同样的问题。我检查并尝试设置 AllowTcpForwarding Yes 但它在我的 sshd_config 中丢失所以没有帮助。我没有更改 sshd_config 或 my.cnf。确保 ssh 主机名 NOT 与 mysql 主机名相同(使用 localhost)。

                      在工作台中,选择 + 添加新连接并设置以下内容:

                      • 连接方式:标准 TCP/IP over SSH
                      • SSH 主机名:192.168.0.50:22(替换远程 SSH 服务器 IP 和端口(可选))
                      • SSH 用户名:sshuser
                      • 您可以设置密码或根据提示添加
                      • MYSQL 主机名:localhost 或 127.0.0.1
                      • MYSQL 服务器端口:3306
                      • 您可以设置密码或根据提示添加

                      测试连接。应该成功然后点击OK.Viola!

                      【讨论】:

                        【解决方案20】:

                        Firewalld 阻止 IP 地址。因此要授予访问权限,请使用以下命令:

                        firewall-cmd --permanent --zone=trusted --add-source=YOUR_IP/32

                        firewall-cmd --permanent --zone=trusted --add-port=3306/tcp

                        firewall-cmd --reload

                        【讨论】:

                          【解决方案21】:

                          我在使用localhost 时遇到了同样的错误。我重新启动了 MySQL 服务,它工作正常。

                          【讨论】:

                          • 显然在我的情况下,图像初始化数据库花了很多时间,这就是为什么我有一段时间无法连接。
                          【解决方案22】:

                          对我来说,在 mysql/my.cnf 中设置 bind-address = 0.0.0.0 有效。它基本上会监听所有地址(但仍然是一个端口)。

                          别忘了重启你的服务器:systemctl restart mysql

                          【讨论】:

                          • 所有地址/接口,但只有一个端口。
                          【解决方案23】:

                          我只是遇到了同样的问题,但就我而言,我解决了它

                          服务 mysqld 启动

                          【讨论】:

                            【解决方案24】:

                            在我的情况下,是大学 wifi 阻塞了端口 3306。我能够使用移动热点进行连接。

                            更改为移动热点或其他网络,如果它在那里工作,那么您知道原始网络阻塞了端口 3306。如果您在多个网络上遇到相同的错误,那么您知道它特定于您的机器。

                            【讨论】:

                              【解决方案25】:

                              我在安装 MySQL docker 映像然后尝试从 WSL2 MySQL 客户端连接时遇到了同样的问题。

                              正如在接受的答案中所说,这应该是防火墙问题,在我的情况下,这个错误是由于不允许 docker for windows 与专用网络通信而引起的。

                              我更改了“防火墙和网络保护”、“允许应用程序通过防火墙”、“更改设置”(需要管理员权限)并允许“Docker 桌面后端”连接到专用网络。

                              【讨论】:

                                【解决方案26】:

                                我在 Mac 上安装了本地 MySQL 时遇到了同样的错误。问题是 MySQL 打开的文件数量对于 MacOS 来说太高了。

                                要查看您是否有同样的问题,您可以运行此命令并查找 File Descriptor 错误:

                                tail -200 /usr/local/var/mysql/$(whoami).err | grep "Warning"
                                

                                我将此行添加到 my.cnf 文件中,问题已解决:

                                table_open_cache = 200
                                

                                【讨论】:

                                  【解决方案27】:

                                  远程连接Mysql时出现错误。 我在/var/log/mysqld.log 收到了这个警告:

                                  [Warning] IP address 'X.X.X.X' could not be resolved: Temporary failure in name resolution
                                  

                                  我刚刚将这一行添加到/etc/hosts 文件中:

                                  X.X.X.X some_name
                                  

                                  问题解决了!连接 MySQL 时,不使用 skip-name-resolve 导致本地应用出现一些错误。

                                  【讨论】:

                                    【解决方案28】:

                                    我有同样的问题。为了解决这个问题,我只是将主机从 localhost:3306 更改为 localhost。因此,当您为连接选择不正确的端口时,可能会出现错误。最好保持默认。

                                    【讨论】:

                                    • 这可能是因为mysql不接受端口作为主机名的一部分,而是您需要使用参数-P 3306
                                    【解决方案29】:

                                    数据库目录读写权限也是我发现的一个问题。 只需确保您的应用程序能够在 db 位置上读取文件即可。尝试 chmod 777 进行测试。

                                    【讨论】:

                                      【解决方案30】:

                                      如果您的配置文件中不存在 bind-address 并且 mysql 托管在 AWS 实例上,请检查您的安全组。在理想情况下,入站规则应接受来自端口 3306 的所有连接,出站规则应响应所有有效 IP。

                                      【讨论】:

                                        猜你喜欢
                                        • 2015-03-17
                                        • 1970-01-01
                                        • 2011-10-09
                                        • 2011-11-23
                                        • 2015-06-29
                                        • 2011-07-07
                                        相关资源
                                        最近更新 更多