鍍金池/ 問答/Java  數(shù)據(jù)庫/ mysql.sock到底存了什么信息?

mysql.sock到底存了什么信息?

mysql.sock到底存儲(chǔ)了什么東西?

mysql.sock作為mysql的套接字一般用于本地連接數(shù)據(jù)庫,在速度上優(yōu)于TCP/IP連接。一般放置在/tmp/mysql.sock目錄下,我們先查看下它的內(nèi)容:

[root@ tmp]# ll -i | grep mysql 
    85 srwxrwxrwx 1 mysql          mysql                0 Apr 18 15:03 mysql.sock

可以看到它的內(nèi)容大小為0,即沒有存儲(chǔ)任何的內(nèi)容,此時(shí)我們通過mysql -uroot -p來訪問(即默認(rèn)的-h localhost)可以訪問成功數(shù)據(jù)庫。

但當(dāng)我們新建一個(gè)相似的mysql.sock的時(shí)候,卻無法替代原有的空文件:

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

再次訪問本地?cái)?shù)據(jù)庫:

[root@ tmp]# mysql -uroot -p -hlocalhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

兩者內(nèi)容除了inode號(hào)不一樣外,完全一樣,但卻不能使用mysql訪問本地?cái)?shù)據(jù)庫了,新的socket為什么不能代替原有的socket文件,這個(gè)文件到底存儲(chǔ)了什么,又是怎么跟數(shù)據(jù)庫互相認(rèn)證的?

回答
編輯回答
病癮

思考良久,有了自己的解釋,但由于沒有看linux對(duì)socket的具體設(shè)計(jì)和實(shí)現(xiàn)代碼,不一定正確,詳情查看:https://segmentfault.com/a/11...

想要看具體實(shí)現(xiàn)的可以參考linux源碼:http://man7.org/linux/man-pag...

2017年1月12日 00:59