当前位置 : 首页 » 互动问答 » 正文

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

分类 : 互动问答 | 发布时间 : 2011-03-21 18:33:36 | 评论 : 30 | 浏览 : 1157510 | 喜欢 : 340

I am having a big problem trying to connect to mysql. When I run:

/usr/local/mysql/bin/mysql start

I have the following error :

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

I do have mysql.sock under the /var/mysql directory.

In /etc/my.cnf I have:

[client]
port=3306
socket=/var/mysql/mysql.sock

[mysqld]
port=3306
socket=/var/mysql/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

and in /etc/php.ini I have :

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /var/mysql/mysql.sock

I have restarted apache using sudo /opt/local/apache2/bin/apachectl restart

But I still have the error.

Otherwise, I don't know if that's relevant but when I do mysql_config --sockets I get

--socket         [/tmp/mysql.sock]

回答(30)

  • 1楼
  • If your file my.cnf (usually in the /etc/mysql/ folder) is correctly configured with

    socket=/var/lib/mysql/mysql.sock
    

    you can check if mysql is running with the following command:

    mysqladmin -u root -p status
    

    try changing your permission to mysql folder. If you are working locally, you can try:

    sudo chmod -R 755 /var/lib/mysql/
    

    that solved it for me

  • 2楼
  • are you sure you installed mysql as well as mysql server..

    For example to install mySql server I'll use yum or apt to install both mysql command line tool and the server:

    yum -y install mysql mysql-server (or apt-get install mysql mysql-server)
    

    Enable the MySQL service:

    /sbin/chkconfig mysqld on
    

    Start the MySQL server:

    /sbin/service mysqld start
    

    afterwards set the MySQL root password:

    mysqladmin -u root password 'new-password' (with the quotes)
    

    I hope it helps.

  • 3楼
  • A quick workaround that worked for me: try using the local ip address (127.0.0.1) instead of 'localhost' in mysql_connect(). This "forces" php to connect through TCP/IP instead of a unix socket.

  • 4楼
  • I got the following error

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
    

    Tried several ways and finally solved it through the following way

    sudo gksu gedit /etc/mysql/my.cnf
    

    modified

    #bind-address       = 127.0.0.1
    

    to

    bind-address        = localhost
    

    and restarted

    sudo /etc/init.d/mysql restart
    

    it worked

  • 5楼
  • Make sure you are running mysqld : /etc/init.d/mysql start

  • 6楼
  • To prevent the problem from occurring, you must perform a graceful shutdown of the server from the command line rather than powering off the server.

    shutdown -h now
    

    This will stop the running services before powering down the machine.

    Based on Centos, an additional method for getting it back up again when you run into this problem is to move mysql.sock:

    mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak
    
    service mysqld start
    

    Restarting the service creates a new entry called mqsql.sock

  • 7楼
  • Another workaround is to edit /etc/my.cnf and include host in the section [client]

     [client]
     #password       = your_password
     host            = 127.0.0.1
     port            = 3306
     socket          = /var/run/mysql/mysql.sock
    

    And then restarting the mysql service.

    This workaround was tested in: Server version: 5.5.25a-log Source distribution

  • 8楼
  • As can be seen by the many answers here, there are lots of problems that can result in this error message when you start the MySQL service. The thing is, MySQL will generally tell you exactly what's wrong, if you just look in the appropriate log file.

    For example, on Ubuntu, you should check /var/log/syslog. Since lots of other things might also be logging to this file, you probably want to use grep to look at mysql messages, and tail to look at only the most recent. All together, that might look like:

    grep mysql /var/log/syslog | tail -50

    Don't blindly make changes to your configuration because someone else said 'This worked for my system.' Figure out what is actually wrong with your system and you'll get a better result much faster.

  • 9楼
  • In my case, I was using Centos 5.5. I found that the problem was because the mysql service was stopped some how. So I started mysql service with the command:

     /etc/init.d/mysqld start
    

    So.. silly mistake.

  • 10楼
  • I had the same problem and it has been caused by an update of mysql drivers when mysql server was running. I fixed it just restarting both mysql and apache2:

    sudo service mysql stop

    sudo service mysql start

    sudo service apache2 stop

    sudo service apache2 start

  • 11楼
  • If everything worked just fine and you just started seeing this error, before you do anything else, make sure you're not out of disk space:

    df -h
    

    If the volume where the mysql.sock is being created is at 100% use, MySql won't be able to create it and this will be the cause of this error. All you need to do is delete something that's not needed, like old log files.

  • 12楼
  • try with -h (host) and -P(port):

    mysql -h 127.0.0.1 -P 3306 -u root -p

  • 13楼
  • I got this error when I set cron job for my file. I changed the permissions of file to 777 but it still not worked for me. Finally I got the solution. May be it will be helpful for others.

    Try with this command:

    mysql -h 127.0.0.1 -P 3306 -u root -p

    Remember that -h means host and -p means port.

  • 14楼
  • sudo service mysql start
    

    This should serve you just fine. There could be a possibility that you changed some commands that affected the mysql configurations.

  • 15楼
  • I was getting the error because I was running MAMP and my .sock file was in a different location. I just added a symbolic link where the app thought it should be that pointed to where it actually was and it worked like a charm.

  • 16楼
  • I also found that this was a permissions problem. I compared the MySQL files to a working install (both on Debian 6 squeeze) and had to make the following ownership changes (where mydatabase is any database(s) you have).

    Ownership mysql:mysql:

    chown mysql:mysql /var/lib/mysql
    chown mysql:mysql /var/lib/mysql/ib*
    chown mysql:mysql /var/lib/mysql/mydatabase
    chown mysql:mysql /var/lib/mysql/mydatabase/*
    chown mysql:mysql /var/lib/mysql/mysql/* 
    

    Ownership mysql:root:

    chown mysql:root /var/lib/mysql/mysql
    chown mysql:root /var/run/mysqld 
    

    Ownership mysql:adm:

    chown mysql:adm /var/log/mysql
    chown mysql:adm /var/log/mysql.err
    chown mysql:adm /var/log/mysql.log* 
    
  • 17楼
  • There are many solutions to this problem but for my situation, I just needed to correct the DATE on the machine/server (Ubuntu 16.04 Server).

    i) Check the date of your server and correct it.

    ii) Run sudo /etc/init.d/mysql restart

    That should get it started.

  • 18楼
  • you can always start mysql server by specifying the location of the mysql.sock file using the --socket option like

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

    This will work even if the location of socket file in specified in a different location in the my.cnf file.

  • 19楼
  • If you are using AWS (Amazon Web Services) Micro version, then it is a memory issue. When I ran

    mysql
    

    from the terminal it would say

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket /var/run/mysqld/mysqld.sock' (111)
    

    So I tried the following and it would just fail.

    service mysqld restart
    

    After much searching, I found out that you have to create a swap file for MySQL to have enough memory. Instructions are listed: http://www.prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html.

    Then, I was able to restart mysqld.

  • 20楼
  • For those whose any solution did not work, try:

    cd /etc/mysql
    

    check if my.cnf is present

    nano my.cnf
    

    and make sure you have only one bind-address as follows:

    bind-address = 127.0.0.1

    If not, that might be the problem, just exit nano and save the file.

    and service mysql start

    note that if you don't have nano (its a text editor) just install it with apt-get install nano and once in just press Ctrl+X to exit, dont forget to say Y to save and use the same file)

  • 21楼
  • Adding

    --protocol=tcp 
    

    to the list of pramaters in your connection worked for me.

  • 22楼
  • This was good enough for me

    sudo /etc/init.d/mysql restart
    
  • 23楼
  • I ran into this issue today. None of these answers provided the fix. I needed to do the following commands (found here https://stackoverflow.com/a/20141146/633107) for my mysql service to start:

    sudo /etc/init.d/mysql stop
    cd /var/lib/mysql/
    ls ib_logfile*
    mv ib_logfile0 ib_logfile0.bak
    mv ib_logfile1 ib_logfile1.bak
    ... etc ...
    /etc/init.d/mysql restart
    

    This was partly indicated by the following errors in /var/log/mysql/error.log:

    140319 11:58:21 InnoDB: Completed initialization of buffer pool
    InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
    InnoDB: than specified in the .cnf file 0 5242880 bytes!
    140319 11:58:21 [ERROR] Plugin 'InnoDB' init function returned error.
    140319 11:58:21 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
    140319 11:58:21 [ERROR] Unknown/unsupported storage engine: InnoDB
    140319 11:58:21 [ERROR] Aborting
    

    I also saw the disk full error, but only when running commands without sudo. If the permissions check fails, it reports disk full (even when your partition is not even close to full).

  • 24楼
  • CentOS 7, 64 bit. Fresh installation.
    In my case, the error was because I didn't have the right MySQL server and MySQL client installed.
    Using yum, I removed mariadb and mysql-community edition. I downloaded the rpm's for the client and server from the official MySQL website and installed the server and client.

    On installing the server, I was shown a message that the password to the root account for MySQL was stored in a file which I could view with sudo cat /root/.mysql_secret.

    So after installing the client and server, I checked if MySQL was working (I think I rebooted before doing so) with the command sudo service mysql status and I got the result.

    MySQL running (2601) [ OK ]

    I logged into MySQL using the password from the .mysql_secret file:
    mysql -uroot -pdxM01Xfg3DXEPabpf. Note that dxM01Xfg3DXEPabpf is the password mentioned in the .mysql_secret file.

    and then typed entered the following command at the mysql prompt to change the password of root:

    mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somePassword');

    Everything worked fine from then on.

  • 25楼
  • sudo service mysqld start
    

    Worked for me, I'm using Centos

  • 26楼
  • This doesn't directly answer your question but a subset of it, namely using PythonAnywhere. I kept stumbling upon this question when looking for a fix so I'm adding it here in the hope that it will help others in my situation.


    PythonAnywhere decided to change the database connection hostnames in order to improve efficiency and reliability, as detailed here:

    The official host name you should use for connecting to your account's MySQL database instance has changed from mysql.server to yourusername.mysql.pythonanywhere-services.com. This bypasses a part of our infrastructure that has started showing problems in recent weeks, and it should be much more efficient and reliable than the old way.

    Hence, you will need to update your hostname to the value highlighted above.

  • 27楼
  • I had this problem too when trying to start the server, so many of the answers here that just say to start the server didn't work. The first thing you can do is execute the following to see if there are any config errors:

    /usr/sbin/mysqld --verbose --help 1>/dev/null
    

    I did have one error that showed up:

    160816 19:24:33 [Note] /usr/sbin/mysqld (mysqld 5.5.50-0ubuntu0.14.04.1-log) starting as process 9461 ...
    160816 19:24:33 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
    160816 19:24:33 [Note] Plugin 'FEDERATED' is disabled.
    160816 19:24:33 [ERROR] /usr/sbin/mysqld: unknown variable 'innodb-online-alter-log-max-size=4294967296'
    160816 19:24:33 [ERROR] Aborting
    

    A simple grep -HR "innodb-online-alter-log-max-size" /etc/mysql/ showed me exactly what file contained the offending line, so I removed that line from the file.

    Then, checking my /var/log/mysql/error.log file I had:

    InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
    InnoDB: than specified in the .cnf file 0 671088640 bytes!
    160816 22:46:46 [ERROR] Plugin 'InnoDB' init function returned error.
    160816 22:46:46 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
    160816 22:46:46 [ERROR] Unknown/unsupported storage engine: InnoDB
    160816 22:46:46 [ERROR] Aborting
    

    Based on this question the accepted solution wouldn't work because I couldn't even get the server started, so I followed what some of the comments said and deleted my /var/lib/mysql/ib_logfile0 and /var/lib/mysql/ib_logfile1 files.

    This allowed the server to start and I was able to connect and execute queries, however checking my error log file it was quickly getting filled up with several tens of thousands of lines like this:

    160816 22:52:15  InnoDB: Error: page 1415 log sequence number 82039318708
    InnoDB: is in the future! Current system log sequence number 81640793100.
    InnoDB: Your database may be corrupt or you may have copied the InnoDB
    InnoDB: tablespace but not the InnoDB log files. See
    InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
    InnoDB: for more information.
    

    Based on a suggestion from here, to fix this I did a mysqldump and restore of all databases (see the link for several other solutions).

    $ mysqldump -u root -p --allow-keywords --add-drop-database --comments --hex-blob --opt --quote-names --databases db_1 db_2 db_3 db_etc > backup-all-databases.sql
    $ mysql -u root -p < backup-all-databases.sql
    

    Everything appears to be working as expected now.

  • 28楼
  • For me - this was simply a case of MySQL taking a long time to load. I have over 100,000 tables in one of my databases and it did eventually start but obviously has to take a long time in this instance.

  • 29楼
  • I used 127.0.0.1 for -h instead localhost and everything was OK. In other case had what had - error that above.

相关阅读:

MySQL date format DD/MM/YYYY select query?

Multiple select statements in Single query

How to access remote server with local phpMyAdmin client?

Grant **all** privileges on database

How to get a list of MySQL user accounts

How can I prevent SQL injection in PHP?

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

'IF' in 'SELECT' statement - choose output value based on column values

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

How do you set a default value for a MySQL Datetime column?