mysql?sock?文件解析及作用講解
引言
在觀察MySQL
本地連接的時(shí)候,發(fā)現(xiàn)對(duì)mysql.sock
是個(gè)啥我不明白,于是我提出了一個(gè)問題:mysql.sock到底存了什么信息?
根據(jù)多方查資料和自我思考,我有了自己的一些認(rèn)識(shí)和結(jié)論,但結(jié)論并不一定正確,歡迎大家指教。
連接MySQL
連接MySQL
的操作實(shí)際上是啟動(dòng)一個(gè)連接進(jìn)程和MySQL
數(shù)據(jù)庫實(shí)例進(jìn)行通信,本質(zhì)上屬于進(jìn)程間通信,而進(jìn)程通信的方式有管道、命名管道、命名字、TCP/IP
套接字、UNIX
套接字。MySQL
數(shù)據(jù)庫提供的方式有3種:
TCP/IP
套接字方式- 命名管道和共享內(nèi)存(
Windows
平臺(tái)獨(dú)有) UNIX
套接字(UNIX
平臺(tái)獨(dú)有)
TCP/IP
套接字方式是MySQL
數(shù)據(jù)庫在任何平臺(tái)都提供的連接方式,一般用于客戶端和服務(wù)端不在同一臺(tái)服務(wù)器上,基于網(wǎng)絡(luò)的遠(yuǎn)程連接請(qǐng)求。
筆者使用的是UNIX
服務(wù)器,所以不了解Windows
相關(guān)的內(nèi)容,在使用UNIX
域套接字時(shí),一般用于客戶端和服務(wù)端在同一臺(tái)服務(wù)器上的情況,而該套接字并不是一個(gè)網(wǎng)絡(luò)協(xié)議,只是用于同機(jī)器連接通訊的載體。
mysql.sock文件
我們可以在配置文件my.cnf
中指定套接字文件的路徑:
[mysqld] socket = /tmp/mysql.sock
也可以在啟動(dòng)時(shí)指定socket
文件的路徑:
# 以下兩種均可 ./mysqld_safe --socket=/tmp/mysql.sock ./mysqld_safe -S /tmp/mysql.sock
在啟動(dòng)MySQL
之后我們可以查詢socket
文件的路徑:
mysql> show variables like 'socket'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | socket | /tmp/mysql.sock | +---------------+-----------------+ 1 row in set (0.00 sec)
mysql.sock文件的作用
這個(gè)套接字文件在我們啟動(dòng)MySQL
后會(huì)自動(dòng)在我們指定的路徑被創(chuàng)建:
[work@ work]$ ll /tmp | grep mysql.sock srwxrwxrwx 1 mysql mysql 0 Aug 21 20:49 mysql.sock
可以看到該文件被剛剛創(chuàng)建,并且文件類型's'
代表socket
套接字類型。同時(shí)0
代表該文件內(nèi)容為空。
當(dāng)我們使用localhost
(mysql
命令 -h
參數(shù)的缺省值)連接本地?cái)?shù)據(jù)庫時(shí),因?yàn)闊o法使用TCP/IP
協(xié)議監(jiān)聽端口的請(qǐng)求和數(shù)據(jù),我們需要使用該socket
文件來進(jìn)行你啟動(dòng)的連接進(jìn)程和MySQL
實(shí)例進(jìn)程的進(jìn)程間通信,即通訊協(xié)議的載體。如果我們刪除了該文件,當(dāng)你再次連接本地?cái)?shù)據(jù)庫時(shí)會(huì)報(bào)錯(cuò):
[root@ work]# mysql -uroot -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
此時(shí),我們新建一個(gè)socket
文件,并且修改權(quán)限和擁有者,同時(shí)再次發(fā)起數(shù)據(jù)庫連接是依然會(huì)報(bào)錯(cuò),不過是不一樣的錯(cuò)誤:
# 新建的為mysql.sock,原有的改名為mysql.sock.bak mv mysql.sock mysql.sock.bak # 創(chuàng)建新的mysql socket文件 mksock mysql.sock chown mysql:mysql mysql.sock chmod 777 mysql.sock # 展示對(duì)比兩個(gè)mysql.sock [root@ tmp]# ll -i | grep mysql 85 srwxrwxrwx 1 mysql mysql 0 Apr 18 15:03 mysql.sock.bak 37 srwxrwxrwx 1 mysql mysql 0 Aug 20 20:35 mysql.sock # 再次發(fā)起連接 [root@ tmp]# mysql -uroot -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
可以看出除了inode
不同之外其他的信息全部一樣,而且內(nèi)容都是空的,為什么就不能使用呢?
以下原因?yàn)閭€(gè)人推測,實(shí)際的原因需要看linux對(duì)socket文件的實(shí)現(xiàn),每個(gè)socket肯定有屬性的不同。
原因是由于mysql.sock
是每一次MySQL
啟動(dòng)之后生成的,該socket
文件會(huì)監(jiān)聽創(chuàng)建它的進(jìn)程,此處即本機(jī)的mysqld
進(jìn)程,用于其與MySQL
實(shí)例進(jìn)程通信,如果你關(guān)閉了mysqld
進(jìn)程,該文件會(huì)被自動(dòng)刪除。而你新建的socket
文件只是虛有其表,并沒有監(jiān)聽任何的IP
和端口以及進(jìn)程PID
,所以自然不能與MySQL
實(shí)例通信了。所以如果你刪掉了這個(gè)文件,只能殺死mysqld
進(jìn)程并重啟,因?yàn)榇藭r(shí)你給MySQL
實(shí)例發(fā)送關(guān)閉信號(hào)的通道也沒有了(當(dāng)然此時(shí)你可以走TCP/IP
通信的方法)。
為了證明我的猜測,做了一些測試:
- 保留
mysql.sock
,殺死進(jìn)程并重啟MySQL
,復(fù)用該socket
,依然無法通信,證明非僅僅簡單監(jiān)聽本地端口。 tail -f mysql.sock
,由于socket
只能通過進(jìn)程間通信使用,所以不能通過open()
方法打開,報(bào)錯(cuò)無法打開該文件,因此無法觀察到是怎么通過該socket
進(jìn)行進(jìn)程間通信的。
數(shù)據(jù)庫運(yùn)維:mysql.sock錯(cuò)誤修復(fù)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
問題根源:mysql.sock
文件找不到了
問題場景:一般為該文件被誤刪,或者PHP
等后端指定的該socket
文件地址路徑不對(duì)
解決方案:
1 . 重啟
ps -auxf | grep mysql kill -SIGKILL pid(找到指定的mysql進(jìn)程pid) ./mysqld_safe
2 . 使用locate mysql.sock
定位,同時(shí)重啟:./mysqld_safe -S /path/to/mysql.sock
3 . 在php
等配置文件(如php.ini
)中修改指定該socket
的配置地址
pdo_mysql.default_socket = /path/to/mysql.sock mysql.default_socket = /path/to/mysql.sock mysqli.default_socket = /path/to/mysql.sock
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
問題根源:mysql.sock
文件無法通信
問題場景:一般為該mysql.sock
文件內(nèi)容不符合通信的需要
解決方案:跟上面的(2)
錯(cuò)誤本質(zhì)上一樣,解決方案也一樣
參考資料
MySQL技術(shù)內(nèi)幕 InnoDB存儲(chǔ)引擎第2版 1.5節(jié) 連接MySQL:
http://chabaoo.cn/books/598536.html
mysql.sock文件詳解:http://chabaoo.cn/article/93285.htm
以上就是mysql sock 文件解析及作用的詳細(xì)內(nèi)容,更多關(guān)于mysql sock 文件解析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MYSQL IN 與 EXISTS 的優(yōu)化示例介紹
當(dāng)B表的數(shù)據(jù)集必須小于A表的數(shù)據(jù)集時(shí),用in優(yōu)于exists,當(dāng)A表的數(shù)據(jù)集系小于B表的數(shù)據(jù)集時(shí),用exists優(yōu)于in2014-08-08達(dá)夢數(shù)據(jù)庫獲取SQL實(shí)際執(zhí)行計(jì)劃方法詳細(xì)介紹
在達(dá)夢數(shù)據(jù)庫中,使用EXPLAIN語句可以查看sql的執(zhí)行計(jì)劃,但EXPLAIN只生成執(zhí)行計(jì)劃,并不會(huì)真正執(zhí)行SQL語句,因此產(chǎn)生的執(zhí)行計(jì)劃有可能不準(zhǔn)。本章將帶領(lǐng)大家了解多種獲取SQL實(shí)際的執(zhí)行計(jì)劃的方法2022-10-10windows server2014 安裝 Mysql Applying Security出錯(cuò)的完美解決方法
這篇文章給大家介紹了windows server2014 安裝 Mysql Applying Security出錯(cuò)的完美解決方法,造成這種問題的主要原因是因?yàn)榘惭b一遍之后沒有卸載干凈,要解決這個(gè)問題需要注意以下幾點(diǎn),具體解決方法,大家參考下本文2017-07-07數(shù)據(jù)庫索引的知識(shí)點(diǎn)整理小結(jié),你所需要了解的都在這兒了
這篇文章主要介紹了數(shù)據(jù)庫索引的知識(shí)點(diǎn)整理小結(jié),你所需要了解的都在這兒了,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07MYSQL 的10大經(jīng)典優(yōu)化案例場景實(shí)戰(zhàn)
在應(yīng)用開發(fā)的早期,數(shù)據(jù)量少,開發(fā)人員開發(fā)功能時(shí)更重視功能上的實(shí)現(xiàn),隨著生產(chǎn)數(shù)據(jù)的增長,很多SQL語句開始暴露出性能問題,對(duì)生產(chǎn)的影響也越來越大,有時(shí)可能這些有問題的SQL就是整個(gè)系統(tǒng)性能的瓶頸。本文我們就聊聊MYSQL的優(yōu)化2021-09-09Mysql區(qū)間分組查詢的實(shí)現(xiàn)方式
這篇文章主要介紹了Mysql區(qū)間分組查詢的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Mysql的timestamp時(shí)間戳詳解及2038問題
本文主要介紹了Mysql的timestamp時(shí)間戳詳解及2038問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04