涉及到sock連接的問題。 為了測試MySQL的某些個特性,在一個機器上安裝了多個MySQL的實例,如下截圖,有兩個實例,一個埠是8000,一個埠是8001。在使用mysql -uroot -p -P8001連接至埠號為8001的MySQL實例的時候,show variables like ' ...
涉及到sock連接的問題。
為了測試MySQL的某些個特性,在一個機器上安裝了多個MySQL的實例,如下截圖,有兩個實例,一個埠是8000,一個埠是8001。
在使用mysql -uroot -p -P8001連接至埠號為8001的MySQL實例的時候,show variables like '%port%'卻顯示連接的是8000這個實例,莫名其妙?
筆者一開始也被這個問題嚇了一跳,後面才弄清楚是TCP連接和sock連接的問題。
這涉及到一個sock連接的問題,本地(也就是伺服器端)連接到MySQL實例的時候,
預設是使用的sock的方式連接的,當沒有指定sock文件的情況下,而預設的sock文件是從/tmp/mysql.sock路徑下找的。
也就是說,在伺服器端連接MySQL實例的時候(未指定-h127.0.0.1),
1,預設是以sock的方式連接至MySQL實例的
2,在未指定主機地址的情況下,也即-h參數,是會忽略埠號的參數值,也即-P的值。
比如使用上述的mysql -uroot -p -P8001,的方式連接至資料庫實例,預設是用sock的方式連接(沒有指定sock參數 -S,預設/tmp/mysql.sock),且忽略埠號參數,也即-P8001
比如如下截圖,-P指定了一個根本不存在的埠號,仍然正常地連接到了一個實例,具體是哪個實例,取決於預設/tmp/mysql.sock指向哪個實例(多實例的情況下)
sock的原理也不難理解:sock文件本身就是記錄了一個MySQL實例的進程id,mysql命令在本地直接通過sock中的進程id連接至該實例,因為可以忽略埠號。
如何在伺服器本地連接至具體的實例?
1,連接命名中明確指定sock文件的路徑,無須指定埠號( mysql -uroot -p -S/***/mysql.sock),即便指定埠號,也會被忽略
2,指定埠號+主機地址(指定TCP)的方式連接:mysql -uroot -p -P*** -h127.0.0.1
記下來,一臺機器上裝了N多個實例,一不小心又掉坑裡了……
在本地也即伺服器端連接至MySQL實例的時候,未指定主機地址的情況下,預設是以sock的方式連接的,而未指定sock的時候,又是按照預設的路徑找對應的sock文件
此時會忽略連接命令中的埠號參數,不註意的情況下可能會造成一些凌亂。
僅僅是從伺服器端連接的時候會出現類似情況,如果是從客戶端(非伺服器端)連接的話,肯定會指定IP,一旦指定了IP,對應的埠號就生效了,因此客戶端不會發生類似情況。
一直對某些預設的配置有所忌憚,實際上是掩蓋了很多問題,弄不好就掉坑理了。