1. 程式人生 > >MySQL多例項的環境下,伺服器端本地連線到指定例項的問題(sock方式連線)

MySQL多例項的環境下,伺服器端本地連線到指定例項的問題(sock方式連線)

涉及到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,對應的埠號就生效了,因此客戶端不會發生類似情況。

一直對某些預設的配置有所忌憚,實際上是掩蓋了很多問題,弄不好就掉坑理了。