親測有效,解決Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";

 最近租了一個阿里云云翼服務器,趁着本身仍是一個學生,享受一下優惠。我租的是阿里雲Ubuntu16.04版本的服務器,在搭建mysql的時候,一開始是能夠運行的,因爲某次手抽,把mysql的套接字文件不當心刪除了,而後不管怎麼卸載重裝,都出現了這個問題:mysql


root@iZufkfljcZ:~# mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
  網上找了很久,搜到的所有是重複的文章並且也沒講明爲何出現這個問題,找了一天才找到一篇講解mysql.sock文件做用的文章,而後分析一下爲何出現這個問題,如今講之總結一下,以備後人查閱。
  我出現的問題是:找不到mysql.sock,若是你能夠運行sql

find / -name mysql.sock
這條命令,而且能查到結果的話,只需將查到的結果作一個軟鏈接到/tmp目錄下便可解決(網上都是這麼解決的)。
可是,我執行了這條語句以後,並無任何反應,沒有找到mysql.sock文件。ubuntu

在這以前,須要明白mysql.sock這個文件有什麼用?服務器

鏈接localhost一般經過一個Unix域套接字文件進行,通常是/tmp/mysql.sock。若是套接字文件被刪除了,本地客戶就不能鏈接。這可能發生在你的系統運行一個cron任務刪除了/tmp下的臨時文件。socket

若是你由於丟失套接字文件而不能鏈接,你能夠簡單地經過重啓服務器從新建立獲得它。由於服務器在啓動時從新建立它。學習

若是和我同樣,重啓服務器仍是沒有任何變化,你能夠先執行下面的語句:測試


# mysql -uroot -h 127.0.0.1 -p
不出意外,這句話應該是能夠執行的,你如今不能用套接字創建鏈接由於它不見了,因此能夠創建一個TCP/IP鏈接
若是套接字文件被一個cron任務刪除,問題將重複出現,除非你修改cron任務或使用一個或使用一個不一樣的套接字文件,個人解決辦法是從新指定一個不一樣的套接字,或者說,我如今沒有mysql.sock文件,因此我要想辦法生成一個。
首先,更改my.cnf文件,個人服務器中的目錄爲/etc/my.cnf,若是沒有的話能夠用find去查找,ui

 

接下來就是保存退出,而後確保這個目錄存在,而且將這個目錄的權限修改一下阿里雲


# chmod 777 /var/lib/mysql
準備步驟作好,而後就是mysql和mysqld服務重啓.net

# service mysql restart
# service mysqld restart
我在重啓mysqld服務的時候,重啓失敗了,顯示以下:
root@iZufkfljcZ:~# service mysqld start
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalc
tl -xe" for details.
這個時候,提示能夠輸入systemctl status mysqld.service去查看具體的失敗緣由,因而:

****************************************************************************************

root@iZufkfljcZ:~# systemctl status mysqld.service
● mysqld.service - LSB: start and stop MySQL
  Loaded: loaded (/etc/init.d/mysqld; bad; vendor preset: enabled)
  Active: failed(Result: exit-code) since 三 2017-12-20 10:38:30 CST; 45s ago
Docs: man:systemd-sysv-generator(8)
 Process: 2154 ExecStart=/etc/init.d/mysqld start (code=exited, status=1/FAILURE)


12月 20 10:38:29 iZufkfljcZ systemd[1]: Starting LSB: start and stop MySQL...
12月 20 10:38:29 iZufkfljcZ mysqld[2154]: Starting MySQL
12月 20 10:38:29 iZufkfljcZ mysqld_safe[2689]:Logging to '/var/log/mysql/error.log'.
12月 20 10:38:29 iZufkfljcZ mysqld_safe[2693]:Directory '/var/run/mysqld' for UNIX socket file don't exists.
12月 20 10:38:30 iZufkfljcZ mysqld[2154]: . * The server quit without updating PID file (/var/run/mysqld/mysqld.pid).
12月 20 10:38:30 iZufkfljcZ systemd[1]: mysqld.service: Control process exited, code=exited status=1
12月 20 10:38:30 iZufkfljcZ systemd[1]: Failed to start LSB: start and stop MySQL.
12月 20 10:38:30 iZufkfljcZ systemd[1]: mysqld.service: Unit entered failed state.
12月 20 10:38:30 iZufkfljcZ systemd[1]: mysqld.service: Failed with result 'exit-code'.


****************************************************************************************

根據提示可知,/var/run/mysqld目錄不存在,也就是說mysqld服務重啓須要這個目錄,那就建一個吧:


root@iZufkfljcZ:~# mkdir /var/run/mysqld
root@iZufkfljcZ:~# chmod 777 /var/run/mysqld/
root@iZufkfljcZ:~# service mysqld start
root@iZufkfljcZ:~#
建完目錄後,從新運行mysqld服務,發現重啓成功了,那麼咱們再來看看爲何剛纔要建這個目錄呢?打開這個目錄看看:

root@iZufkfljcZ# ls /var/run/mysqld
mysqld.pid mysqld.sock mysqld.sock.lock
發現了一個熟悉的東西,mysqld.sock,可是這個是否是咱們須要的東西呢?無論他,先用這個sock文件登下mysql看看行不行:

root@iZufkfljcZ:/var/run/mysqld# mysql -uroot -p -S /var/run/mysqld/mysqld.sock
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

這麼一運行,發現好像能夠了,那接下來好辦了,咱們把以前改的配置改回來就好了,以前的目錄應該是/tmp/mysql.sock,咱們能夠創建一個軟鏈接連上去就能夠了,

root@iZufkfljcZ:~# ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
root@iZufkfljcZ:~# ls /tmp/
mysql.sock
這樣,tmp目錄下就有了my.cnf配置文件中須要的mysql.sock文件了,而後把my.cnf改回就好了,

到此爲止,咱們的mysql應該已經徹底修復了,那麼咱們再測試一下吧:


root@iZufkfljcZ:/var/run/mysqld# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

相關文章
相關標籤/搜索