1. 程式人生 > >ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock’(2) 是一個比較常見的資料庫報錯,而昨天我們的伺服器也報了這個錯誤,所有服務全掛,而且恰逢阿里雲升級,以為是升級的緣故,重啟了下伺服器,發現各種報錯,之後穩定下來了ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock’(2) 這個錯誤。而本文也主要是講解本次故障排查的經歷。

    首先有必要了解一下 “mysql.sock” 。 在linux與unix系統中的socket檔案是為了建立兩個程式之間的連線使用的 , 而在mysql中,當mysql啟動成功時,會根據配置檔案中設定的路徑(如:tmp/mysql.sock),在tmp中生成mysql.sock,用於連線資料庫使用。而如果沒有此檔案,造成的結果可想而知。
    說說本人這次的經歷,記得午餐回來,突然同事跑過來問我,為什麼網站登陸不上了,總是顯示錯誤,而恰逢阿里雲當時給我發了一條簡訊,即伺服器升級維護有可能造成雲服務不能正常使用,於是作為小白的我重啟了伺服器,發現靜態資源可以訪問了,但是資料庫好像有點問題,比如登陸的時候輸入錯誤密碼,會提示密碼或使用者名稱錯誤,輸入正確密碼的時候又會重定向到登陸頁面,查看了錯誤日誌,顯示session儲存錯誤,貌似存不下session資訊,之後趕緊檢視配置檔案,又沒有檢視到明顯的錯誤,於是又重啟了一下,查看了一下程序,發現mysql又沒有啟動起來。這錯誤還不停的換,也挺有意思的,這次重新進入登陸頁面,輸入任意使用者名稱密碼,直接丟擲資料庫連線失敗的異常,即 ‘ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock’(2)’ ,於是針對這一錯誤的排場開始。
    通過兩次重啟,以及原來系統正常使用可以推斷,有可能是資料庫損壞。於是輸入命令 rpm -qa | grep mysql

 ,發現出現很多錯誤,如下圖:


這是不是意味著rpm資料庫損壞呢,於是進行rpm資料庫修復 ,繼續輸入命令 rpm --rebuilddb ,重啟伺服器,發現還是報那個錯誤,猜測會不會是猜測是虛擬磁碟出現了

問題。

首先cd /  ,然後輸入df,  果然 100%佔用。

換一個比較友好的顯示。du -sh *  :

總共20g的系統盤,檔案超過10G的無疑算是大檔案了,不用想,也知道是日誌檔案了,

  cd /home/wwwlogs  ,du -sh * ,果然

發現日誌檔案比較大,而且暫時無用,於是清空>access.log。啟動mysql service mysql start  , 果然啟動成功,問題成功解決。

另外,在排查此錯誤是在網上看了幾篇文件,雖然跟我遇到的情況不一致,不過還是貼出來一下,供大家參考。

-----------------------------------------------

今天連線mysql資料庫的時候遇到一個問題:Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

方案1.
 1.#ps -A|grep mysql 
   顯示類似:
  1829 ?        00:00:00 mysqld_safe
   1876 ?        00:00:31 mysqld
  2.#kill -9 1829
  3.#kill -9 1876
  4.#/etc/init.d/mysql restart
  5.#mysql -u root -p
 
   他的麻煩解決了,我的還沒解決!
 
繼續找
方案2 
先檢視 /etc/rc.d/init.d/mysqld status 看看m y s q l 是否已經啟動.
另外看看是不是許可權問題.
------------------------------------------------------------------------------------
[

[email protected] beinan]#chown -R mysql:mysql /var/lib/mysql
[[email protected] beinan]# /etc/init.d/mysqld start
啟動 MySQL: [ 確定 ]
[[email protected] lib]# mysqladmin -uroot password '123456'
[[email protected] lib]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 3 to server version: 4.1.11

Type 'help;' or '/h' for help. Type '/c' to clear the buffe
 
他的也解決了,我的麻煩還在繼續,依然繼續尋找
 
方案3 
問題解決了,竟然是max_connections=1000 他說太多了,然後改成500也說多,無奈刪之問題解決了。
 
還是不行
方案4
    
     /var/lib/mysql 所有檔案許可權 改成mysql.mysql
     
     不行不行
 
方案5
     摘要:解決不能通過mysql .sock連線MySQL問題 這個問題主要提示是,不能通過 '/tmp/mysql .sock'連到伺服器,而php標準配置正是用過'/tmp/mysql .sock',但是一些mysql 安裝方法 將 mysql .sock放在/var/lib/mysql .sock或者其他的什麼地方,你可以通過修改/etc/my.cnf檔案來修正它,開啟檔案,可以看到如下的東東: 
   [mysql d] 
  socket=/var/lib/mysql .sock 
  改一下就好了,但也會引起其他的問題,如mysql 程式連不上了,再加一點: 
  [mysql ] 
  socket=/tmp/mysql .sock 
  或者還可以通過修改php.ini中的配置來使php用其他的mysql .sock來連,這個大家自己去找找
  
  或者用這樣的方法:
  ln -s /var/lib/mysql /mysql .sock /tmp/mysql .sock

成功了,就是這樣ln -s /var/lib/mysql /mysql .sock /tmp/mysql .sock

OK!

但我的系統中沒有找到mysql.sock檔案,只有mysqld.sock檔案,/var/run/mysqld/mysqld.sock

於是仿照上面的做法: ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock

這樣,可以正常連線資料庫了

 mysql_real_connect()試圖建立到執行host的一個MySQL資料庫引擎的一個連線。其函式原形為:

   MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)   

   我要編一段程式用來遠端連線一個mysql資料庫。我在資料庫的本機上做試驗,發現mysql_real_connect()的第二個引數設為"localhost"時可以正常連線,當改寫為該機器的IP地址"192.168.100.2"時就連線失敗。我在程式中寫的原句為: mysql_real_connect(mysql,"192.168.100.2","root","","mydns",0,NULL,0)。    最初,我以為將"localhost"改為"192.168.100.2"之後要將第六個引數埠號寫上,但還是不行。由於我是在Linux上做的,所以想也許需要將第七個引數unix_socket寫上,結果還是不行。於是到google找解決方法,發現要遠端連線mysql需要為mysql的指定帳號設定遠端連線的許可權。在我的程式中,就要為root設定這一許可權。事實證明,我之前連線失敗正是由於這個原因導致的。但問題是,網上被廣泛轉貼的方法是錯誤的,我照做後還不行,最後問了同學才解決的。下面我具體說一下,望大家不會再被誤導。    在mysql資料庫中有一個mysql庫,它裡面包含一個user表,裡面存有所有帳號及它們的許可權及特徵。對應我的user表中找到User項為root的,發現有兩項,其Host項分別為localhost和localhost.localdomain。我們只需要把'localhost'改為'%'就可以讓所有遠端機器以root帳號登陸mysql伺服器。也可以將'localhost'改為某一個ip地址,這樣就可以在該地址的機器上登陸mysql伺服器。這些都沒有問題,只是網上被廣為傳頌的一個更改Host項的方法是錯誤的。他的方法是用update語句將指定User項的Host項改過來,如果想新增一個新的用於遠端訪問的帳號,就用insert語句新增。事實是這根本不行,我按照作了,表是變了,但還是連不上。後來經過詢問才知道,要想改,結合我的情況,必須用下面的這條語句:      grant all privileges on mydns.* to 'root'@'%' 來改變root帳號的許可權。如果新增新帳號也是如此。想必這個表比較特殊,用普通的SQL語句不能操作。如果帳號有密碼,後面再加上identified by '***'(*為你帳號的密碼)就可以了。    為了解決這個問題用了一下午的時間,費了不少周折,寫出來也能讓大家少走些彎路。

-------------------------------------------------------------------------------------------------------------------------------

Mac Pro下解除安裝安裝Mysql

系統版本:OS X 10.11.5

昨天為了修改我的Mysql密碼,找了一堆教程在不明所以的情況下各種亂試,終於把我的mysql玩脫了,走上了曲折的mysql重灌之路。

一、Mac 關於Mysql的解除安裝:

如使用brew安裝brew uninstall mysql 或者 brew remove mysql

但是又有點怕某些東西沒有解除安裝完全影響到下一次的安裝(我第一次重灌就是這樣的��)以下是完整一點的手動解除安裝

  • sudo rm /usr/local/mysql
  • sudo rm -rf /usr/local/mysql*
  • sudo rm -rf /Library/StartupItems/MySQLCOM
  • sudo rm -rf /Library/PreferencePanes/My*
  • rm -rf ~/Library/PreferencePanes/My*
  • sudo rm -rf /Library/Receipts/mysql*
  • sudo rm -rf /Library/Receipts/MySQL*
  • sudo rm -rf /var/db/receipts/com.mysql.*

其實不同的安裝方式有些東西的儲存位置不一樣,刪除完檢查一下一些問檔案是否刪除了,沒有的話則刪除掉:

  • /usr/local/Cellar 裡的mysql檔案
  • /usr/local/var 裡的mysql檔案
  • /tmp 裡的mysql.sock, mysql.sock.lock, my.cnf檔案
  • pid檔案和err檔案都在/usr/local/var/mysql裡確保刪除了
  • brew安裝的安裝包儲存在/usr/local/Library/Cache/Homebrew也可以一併刪除
  • 執行brew cleanup

二、各種檔案的作用

此次解除安裝安裝的過程中,感悟最深的還是對很多檔案的作用都不甚瞭解,導致到出了什麼問題就只會沿著那個問題找答案,有時候找到的答案有作用時候找到的答案就會很坑,所以就想了解一些那些檔案究竟是什麼作用

安裝過程中最常見的問題:

ERROR!The server quit without updating PID file (/usr/local/var/mysql/***MacBook-Pro.local.pid)

(一)Pid檔案:

記錄==當前Mysql程序的Process ID==。未指定 pid 檔案時,pid 檔案預設名為 主機名.local.pid,存放的路徑在預設MySQL的資料目錄。通過mysqld_safe啟動MySQL時,mysqld_safe會檢查pid檔案,如果pid檔案不存在,不做處理;如果檔案存在,且 pid 已佔用則報錯A mysqld process already exists,如果檔案存在,但 pid 未佔用,則刪除 pid 檔案。

mysqld 啟動後會通過create_pid_file函式新建 pid 檔案,通過getpid()獲取當前程序 pid 並將 pid 寫入 pid 檔案

因此,通過mysqld_safe啟動時, MySQL pid檔案的作用是:在資料檔案是同一份,但埠不同的情況下,防止同一個資料庫被啟動多次。

/ ll /usr/local/var/mysql/SarahMacBook-Pro.local.pid
-rw-r-----  1 sarah  admin     6B  5 19 17:55 /usr/local/var/mysql/SarahMacBook-Pro.local.pid
➜  / ps -ef | grep mysql | grep -v grep
  501 65673     1   005下午 ??         0:00.02 
  /bin/sh 
  /usr/local/opt/mysql/bin/mysqld_safe
  --bind-address=127.0.0.1
  --datadir=/usr/local/var/mysql
  501 65767 65673   005下午 ??         0:52.44 
  /usr/local/Cellar/mysql/5.7.12/bin/mysqld 
  --basedir=/usr/local/Cellar/mysql/5.7.12 
  --datadir=/usr/local/var/mysql 
  --plugin-dir=/usr/local/Cellar/mysql/5.7.12/lib/plugin 
  --bind-address=127.0.0.1 
  --log-error=/usr/local/var/mysql/SarahMacBook-Pro.local.err 
  --pid-file=/usr/local/var/mysql/SarahMacBook-Pro.local.pid
➜  / cat /usr/local/var/mysql/SarahMacBook-Pro.local.pid
65767
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

檢視一些檔案的ownership:ls -laF /usr/local/var/mysql/ 非mysql或者本人的hostname則修改sudo chown -R mysql[或者hostname] /usr/local/var/mysql/

開啟同目錄下的與pid同名的.err檔案檢視錯誤日誌檢視錯誤,按照錯誤提示去找原因

(二)、錯誤日誌:

MySQL有四種類型的日誌:Error Log、General Query Log、Binary Log 和 Slow Query Log。

  1. 錯誤日誌,記錄MySQL執行過程ERROR,WARNING,NOTE等資訊,系統出錯或者某條記錄出問題可以檢視ERROR日誌。存放在與pid檔案同目錄下,預設為主機名.local.err或在Mysql中查詢mysql> show variables like ‘log_error’; 可以在/etc/my.cnf中新增--log-error[=file_name]選項來開啟mysql錯誤日誌
  2. 日常執行日誌,記錄MySQL執行中的每條請求資料。在/etc/my.cnf中新增 general-log-file[=file_name]
  3. 二進位制日誌,包含了一些事件,這些事件描述了資料庫的改動,如建表、資料改動等,也包括一些潛在改動,主要用於備份恢復、回滾等操作。
  4. 慢查詢日誌,用於MySQL效能調優。

(三)、/etc/my.cnf檔案:

my.cnf檔案是Mysql的配置檔案。當Mysqld啟動服務時預設會按照一定順序讀配置檔案,遵循指定優於配置,後讀取的配置覆蓋前面讀取的配置的原則,則mysql會以讀取到的最後一個配置檔案為準。

檢視mysql讀取順序:

➜  ~ mysqld --help --verbose | grep -A 10 'Usage:'
Usage: mysqld [OPTIONS]

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
The following groups are read: mysqld server mysqld-5.7
The following options may be given as the first argument:
--print-defaults        Print the program argument list and exit.
--no-defaults           Don't read default options from any option file,
                        except for login file.
--defaults-file=#       Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

假如不存在該檔案:

在試過的幾種安裝方法,最後都沒有在這幾個資料夾裡找到該檔案,在安裝目錄下的support-files找到了安裝mysql時的預設配置檔案,複製過去,然後修改其中的一些配置,再重啟。

sudo cp /usr/local/Cellar/mysql/5.7.12/support-files/my-default.cnf /etc/my.cnf

然後就可以很方便的啟動停止mysql了(這個指令碼其實是呼叫了mysqld_safe指令碼,然後mysqld_safe再呼叫二進位制檔案 mysqld):/etc/init.d/mysql start

有可能在設定/etc/my.cnf檔案執行之後沒有作用,檢視一下讀取順序後的那幾個檔案是否存在,如果存在的話,刪除掉再重啟。{轉自:mysql 重啟不讀取 /etc/my.cnf 全域性配置問題

配置檔案中一些引數:

[mysql]
#prompt="(\\u:hostname:\D)[\\d]> "  
這樣使用mysql -uroot -p連線到mysql伺服器時,就會顯示
(root:hostname:Thu Feb  9 16:32:26 2012)[(none)]>

[client]使用者告訴客戶端工具mysql連線資料庫伺服器使用的port和socket檔案的路徑

[mysql]用於設定客戶端工具的顯示資訊,如在my.cnf中設定
port = 3306 //mysql服務執行時的埠號,預設為3306
password = your_password //mysql的密碼
socket = /tmp/mysql.sock //socket檔案存放地址
basedir = /usr/local/Cellar/mysql //根目錄(安裝目錄)
datadir = /usr/local/var/mysql  //資料檔案目錄
pid-file = /usr/local/var/mysql/your_pid_file_name  //pid檔案存放的地址
log-error = /usr/local/var
r/mysql/your_err_file_name.log //err檔案存放地址
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(四)、mysql.sock檔案:

mysql有兩種連線方式:

  1. TCP/IP
  2. socket

server和client在同一臺伺服器(host),並且使用localhost進行連結的時候,就會使用socket作為通訊協議的載體來進行連線,它比tcp快。也就是:為主機名為localhost建立的MySQL連線,該連線過程通過一個套接字檔案mysql.sock實現的。所以該檔案被刪後,用localhost使用者是連線不到MySQL伺服器的。

如果出現: 
Can't connect to local MySQL server through socket '/tmp/mysql.sock'

  • 檢視下該檔案是否存在,或者執行mysql.server start或者/usr/local/Cellar/mysql/5.7.12/support-file/mysql.start[你的安裝目錄裡的support-file]再檢視一下該檔案是否存在
  • 假如/tmp/mysql.sock不存在,必須建立一條tcp/ip連線,即使用127.0.0.1而不是localhost作為-h的引數去連線MySQL伺服器,如:mysqladmin -h 127.0.0.1 -u root -p shutdown,強制地建立一條tcp/ip連線,關閉MySQL伺服器,再重新以localhost為主機名啟動MySQL伺服器,它就會重新建立一個套接字檔案。轉自:mysql.sock的作用
  • 假如/tmp/mysql.sock存在,檢視一下mysqld的執行狀態mysqld status啟動它,檢視是否是許可權問題ls -laF /usr/local/var/mysql/[安裝的datadir]如果非host則修改許可權sudo chown -R mysql[或者hostname] /usr/local/var/mysql/ 然後再重啟一下mysql, 如果還不起作用可以修改/etc/my.cnf 看[mysqld]下的socket路徑socket=/usr/local/var/mysql/mysql.sock,重啟mysql

mysql.sock.lock這個檔案是用來檢測是否已經安裝的

lsof -i:3306檢視埠 kill -9 PID殺掉程序

(五)、mysqld,mysql_safe,mysql_client,mysql_server:

MySQL在整個網路環境中使用客戶端/伺服器(Client/Server)架構執行。其核心程式扮演著伺服器角色,而各個客戶端程式連線到伺服器並提出請求。

MySQL Server或者說mysqld,實際上是一個數據庫伺服器程式。它管理著對磁碟資料庫和記憶體的訪問,是mysql核心程式,生成管理資料庫例項、資料庫例項任務排程執行緒,並提供相關介面供不同客戶端呼叫.MySQL Server進行多執行緒操作,它支援多個客戶端連線的同時訪問。為了更好地管理資料庫內容,MySQL Server的特色架構模型支援多種儲存引擎以處理不同型別的表(例如,它同時支援事務和非事務表)。

server(伺服器)host(主機)的用詞區別。Server是指軟體(MySQL Server程式mysqld)。Server的特徵中有它的版本號,指的是哪些特性包括,哪些不包括等。而host是指==server程式執行所在的物理機==。Host的特徵中包括了硬體配置,所執行的作業系統,其網路地址等等。一個host可以有多個mysqld例項在上面同時執行

mysql-client:操作資料庫例項的工具,操作mysql例項的客戶端有很多,mysql-client只是其中一種,包括mysql,mysqldump,mysqlslap,這些訪問,備份,壓力測試的工具。客戶端程式被用於和server進行通訊以修改伺服器端server管理的資料庫資訊。

mysql-server與 mysql-client是DBMS的兩個面向不同操作物件的工具。server是DBMS面向物理層次,包含儲存資料的一系列機制、處理方法的整合;client是DBMS面向使用者,提供一系列工具為使用者所用,這些工具包括通常寫的sql在內都要通過server的編譯才能操作物理資料。參考:Mysql客戶端/伺服器

mysqld_safe在Unix和NetWare中推薦使用mysqld_safe來啟動mysqld伺服器。mysqld_safe增加了一些安全特性,例如當出現錯誤時重啟伺服器並向錯誤日誌檔案寫入執行時間資訊

三、mysql安裝

(一)使用brew安裝

  • brew update //更新
  • brew install mysql //安裝mysql,注意檢視此安裝過程中出現的資訊
➜  ~ brew install mysql
/*
 * 下載安裝,一開始安裝的都沒有密碼,需要執行mysql_secure_installation做些設定,裡面就會設定密碼
 */
==> Downloading https://homebrew.bintray.com/bottles/mysql-5.7.12.el_capitan.bot
######################################################################## 100.0%
==> Pouring mysql-5.7.12.el_capitan.bottle.tar.gz
==> /usr/local/Cellar/mysql/5.7.12/bin/mysqld --initialize-insecure --user=sarah --b
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

這種是沒出現什麼問題的安裝,接下來執行mysql_secure_installation 按照它裡面的提示去設定,設定完就可以直接運行了。接下來說說我遇到的坑

使用Brew安裝mysql時出現的問題:

  • 在brew執行install mysql之後會出現一系列的安裝資訊,出現一個Error,檢視到了ERROR的內容:
==> Pouring mysql-5.7.12.el_capitan.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink lib/libmysqlclient.20.dylib
/usr/local/lib is not writable.

You can try again using:
  brew link mysql
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

執行brew link mysql

➜  ~ brew link mysql
Linking /usr/local/Cellar/mysql/5.7.12...
Error: Could not symlink lib/libmysqlclient.20.dylib
/usr/local/lib is not writable. //這個資料夾不可寫
  • 1
  • 2
  • 3
  • 4

修改許可權:

➜  ~ sudo chown -R $(whoami) /usr/local/lib/
Password:
➜  ~ brew link mysql
Linking /usr/local/Cellar/mysql/5.7.12... 93 symlinks created
  • 1
  • 2
  • 3
  • 4

問題解決,接下來只需要執行mysql_secure_installation去設定密碼就行

  • 查詢到的一些homebrew安裝mysql的方法參考:OSX下使用Homebrew安裝MySQL資料庫 或者 MySQL安裝 但是需要注意的是,這兩個安裝教程裡面在初始化資料庫的時候可能是因為mysql版本的更新,應該更改為:unset TMPDIR –>mysqld -initialize --verbose --user=whoami --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp假如在安裝過程中遇到其他例如pid或者mysql.sock的問題可以參考前面介紹的那些問題解決方法。

(二)使用.tar.gz

//解壓到安裝目錄 
/usr/local/mysql
//將解壓後的包移動到安裝目錄下
sudo mv mysql-5.7.12-osx10.11-x86_64 /usr/local/mysql
//更改mysql安裝目錄所屬使用者與使用者組(許可權)
cd /usr/local sudochown -R root:wheel mysql
//完成一些預設的初始化,執行完下面這一步會出現一個臨時的密碼,請儲存好這密碼以便修改密碼
sudo bin/mysqld --initialize --user=mysql
cd /usr/local/mysql  
sudo support-files/mysql.server start //啟動 
sudo support-files/mysql.server restart  //重啟
sudo support-files/mysql.server stop //停止
sudo support-files/mysql.server status //檢查 MySQL 執行狀態
//修改密碼,輸入上面給的密碼
mysqladmin -u root -p舊密碼 password 新密碼