代码之家  ›  专栏  ›  技术社区  ›  mk12

MySQL连接不工作:2002没有这样的文件或目录

  •  84
  • mk12  · 技术社区  · 15 年前

    我正在设置WordPress。我已经运行了Apache和MySQL,并且帐户和数据库都已设置好。我试着做一个简单的连接:

    <?php
        $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
        if(!$conn) {
            echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
        }
    ?>
    

    我总是明白:

    错误:2002-没有此类文件或 目录

    它可能在谈论什么文件或目录?

    我在一个OSXSnowLeopard上,使用内置的Apache。我使用x86 DMG安装了MySQL。

    更新:我发现套接字位于/tmp/mysql.sock,所以在php.in i中,我用它替换了所有出现错误路径的地方。

    18 回复  |  直到 6 年前
        1
  •  86
  •   Alec Gorge    15 年前

    如果使用linux:mysql.sock文件的路径是错误的。这通常是因为您正在使用(lampp)xampp,而它不在/tmp/mysql.sock中。

    打开php.ini文件并找到以下行:

    mysql.default_socket
    

    并使之成为

    mysql.default_socket = /path/to/mysql.sock
    
        2
  •  121
  •   bryan kennedy    13 年前

    我有一个类似的问题,可以通过使用 127.0.0.1 而不是 localhost .

    这可能意味着我的主机设置出了问题,但这个快速修复的GET让我马上就要开始了。

        3
  •  33
  •   Jacek Laskowski    8 年前

    这是为了 Mac OS X Apache HTTP的本地安装 自定义安装MySQL .

    答案是基于@alec garge出色的响应,但是由于我必须谷歌一些特定的更改才能在我的配置中配置它,主要是Mac OS X-specific,为了完整性,我想在这里添加它。

    为Apache HTTP启用php5支持

    确保在中启用了php5支持 /etc/apache2/httpd.conf .

    用编辑文件 sudo vi /etc/apache2/httpd.conf (询问时输入密码)并取消注释(删除 ; 从)行开始加载 PHP5-模 模块。

    LoadModule php5_module libexec/apache2/libphp5.so
    

    使用启动Apache HTTP sudo apachectl start (或 restart 如果已经启动,需要重新启动才能重新读取配置文件)。

    确保 /var/log/apache2/error_log 包含一行,告诉您启用了php5_模块-您应该看到 PHP/5.3.15 (或类似)。

    [notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations
    

    查找套接字文件的名称

    当mysql启动并运行时(使用 ./bin/mysqld_safe )应该有一些调试行输出到控制台,告诉您在哪里可以找到日志文件。注意文件名中的主机名- localhost 在我的情况下-这可能与您的配置不同。

    后面的文件 Logging to 很重要。这就是MySQL记录工作的地方。

    130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
    130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data
    

    打开 localhost.err 文件(同样,您的名称可能不同),即 tail -1 /Users/jacek/apps/mysql/data/localhost.err 要找出套接字文件的名称,它应该是最后一行。

    $ tail -1 /Users/jacek/apps/mysql/data/localhost.err
    Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)
    

    注意 socket: 部分-这是应该在中使用的套接字文件 php.ini .

    还有另一种方法(有些人说是更简单的方法)通过登录mysql并运行来确定套接字文件名的位置:

    show variables like '%socket%';
    

    使用mysql支持配置php5-/etc/php.ini

    说到php.ini…

    /etc 目录有 /etc/php.ini.默认 文件。把它复制到 /等/php.ini .

    sudo cp /etc/php.ini.default /etc/php.ini
    

    正常开放 /etc/php.ini 寻找 mysql.default_套接字 .

    sudo vi /etc/php.ini
    

    默认的 mysql.default_socket /var/mysql/mysql.sock . 你应该把它改成你之前提到的值——它是 /tmp/mysql.sock 就我而言。

    替换 /ETC/PHPini 要反映套接字文件名的文件:

    mysql.default_socket = /tmp/mysql.sock
    mysqli.default_socket = /tmp/mysql.sock
    

    最终验证

    重新启动Apache HTTP。

    sudo apachectl restart 
    

    如果没有与php5相关的错误,请检查日志。没有错误意味着你已经完成了,使用MySQL的php5应该可以正常工作。恭喜!

        4
  •  13
  •   Oleg    9 年前

    在配置文件(db connection)中将“localhost”替换为“127.0.0.1”有帮助!

        5
  •  9
  •   Todd Moses    15 年前

    首先,确保mysql正在运行。命令:mysqld start

    如果仍然无法连接,则: 你的/etc/my.cnf是什么样子的?

    其他2个帖子是正确的,因为2002年是一个套接字错误,所以您需要检查套接字。

    关于设置灯的一个很好的教程是: http://library.linode.com/lamp-guides/centos-5.3/index-print

        6
  •  6
  •   Myles    15 年前

    我会检查您的php.ini文件并验证mysql.default_socket是否设置正确,还将验证您的mysql d是否正确配置了可以访问的socket文件。典型的默认值是“/tmp/mysql.sock”。

        7
  •  6
  •   Arthur Reutenauer    15 年前

    不是它对你有很大帮助,而是在 recent versions (甚至) less recent )对于MySQL,错误代码2002意味着__无法通过socket[socket名称]__连接到本地MySQL服务器,因此这可能会告诉您更多信息。

        8
  •  6
  •   JackSun    11 年前

    我也遇到了这个问题,然后我将“localhost”修改为“127.0.0.1”,它起作用。

        9
  •  6
  •   masoud2011    9 年前

    在我的情况下,我对mysqli_connect有问题。
    当我想连接时
    mysqli_connect('localhost', 'myuser','mypassword')
    mysqli_connect_error()返回此错误“无此类文件或目录”

    这对我有用 mysqli_connect('localhost:3306', 'myuser','mypassword')

        10
  •  6
  •   Community rohancragg    7 年前

    正在扩展 Matthias D's answer here 我能解决这个问题 2002误差 在mysql和mariadb上,使用以下命令使用精确的路径:

    首先得到 实际路径 到mysql套接字:

    netstat -ln | grep -o -m 1 '/.*mysql.sock'
    

    然后得到 PHP路径 :

    php -r 'echo ini_get("mysql.default_socket") . "\n";'
    

    使用 这两个命令的输出 ,将它们链接起来:

    sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock
    

    如果回报 No such file or directory 例如,如果您的路径是 /var/mysql/mysql.sock 你会跑:

    sudo mkdir -p /var/mysql
    

    然后尝试 苏多伦 再次命令。

        11
  •  5
  •   Avani Khabiya    6 年前

    重新启动MySQL服务器可能会有所帮助。在我的例子中,重新启动服务器节省了很多时间。

    service mysql restart
    

    P.S.使用 sudo service mysql restart 对于非根用户。

        12
  •  3
  •   Community rohancragg    7 年前

    错误2002表示mysql无法通过socket文件(例如 /tmp/mysql.sock )

    要查找套接字文件的位置,请运行:

    mysql_config --socket
    

    然后再次检查您的应用程序是否使用正确的Unix套接字文件,或者通过TCP/IP端口进行连接。

    然后再次检查您的PHP是否具有正确的MySQL套接字设置:

    php -i | grep mysql.default_socket
    

    并确保 文件存在 .

    测试插座:

    mysql --socket=/var/mysql/mysql.sock
    

    如果Unix套接字错误或不存在,则可以对其进行符号链接,例如:

    ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
    

    或更正配置文件(例如 php.ini )

    测试 PDO 直接从PHP连接,您可以运行:

    php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"
    

    同时检查apache和cli(命令行界面)之间的配置,因为配置可能不同。

    可能是服务器正在运行,但您试图使用与服务器侦听的端口不同的TCP/IP端口、命名管道或UNIX套接字文件进行连接。要更正您需要调用客户端程序(例如,指定 --port 选项)指示正确的端口号,或正确的命名管道或Unix套接字文件(例如 --socket 选择权。

    见: Troubleshooting Problems Connecting to MySQL


    其他有助于跟踪问题的实用程序/命令:

    • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
    • netstat -ln | grep mysql
    • php -r "phpinfo();" | grep mysql
    • php -i | grep mysql
    • 使用XDebug xdebug.show_exception_trace=1 在你 xdebug.ini
    • 关于OSX尝试 sudo dtruss -fn mysqld ,在Linux上使用调试 strace
    • 检查Unix套接字上的权限: stat $(mysql_config --socket) 如果你有足够的自由空间( df -h )。
    • 重新启动MySQL。
    • 检查 net.core.somaxconn .
        13
  •  2
  •   Husain Al Faraj    8 年前

    确保本地服务器(MAMP、XAMPP、WAMP等)正在运行。

        14
  •  0
  •   Jignesh Rawal    10 年前

    我也有类似的问题。
    基本上,这里的问题是可能有两个MySQL实例在运行。
    a)一个在/etc/init.d运行
    b)安装在/opt/lamp的灯
    解决方案:
    步骤1:-使用commnad“find/grep mysqld”查找所有运行mysql的实例
    步骤2:-使用service mysql stop关闭在/etc/init.d运行的服务
    步骤3:-使用/opt/lamp/lamp restart重新启动灯服务

    你该走了:)

        15
  •  0
  •   Steven Ventimiglia    7 年前

    在Mac电脑上,在进行所有艰苦工作之前,只需在 System Preferences > MySQL . 从那以后,我经常遇到团队遇到这个问题。 The MySQL Server Instance is stopped .

    单击 Start MySQL Server 按钮,魔法就会发生。

        16
  •  0
  •   navotera    7 年前

    我在我的服务器中使用php-fpm或多个php版本。在我的示例中,我更新mysql i值,因为没有mysql默认socket参数:

    mysqli.default_socket
    

    到:

    mysql.default_socket = /path/to/mysql.sock
    

    感谢@alec garge

        17
  •  0
  •   Fom    7 年前

    我也有同样的问题。我的套接字最终在/tmp/mysql.sock中找到。然后我添加了php.ini的路径。我在mysql工作台的“服务器状态”页面中找到了这个套接字。如果您的套接字不在/tmp/mysql.sock中,那么mysql workbench可能会告诉您它在哪里?(允许您使用MySQL Workbench…)

        18
  •  0
  •   Park JongBum    6 年前

    我使用安装程序安装了MySQL。实际上,“bin”目录旁边没有数据目录。

    所以,我 手动创建 “c:\program files\mysql\mysql server 8.0”下的“data”目录。而且它工作正常(按照上建议的步骤更改根密码 https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/en/resetting-permissions-windows.html .