解決mac上mysql不能遠(yuǎn)程訪問的問題

問題背景

公司的部分測試環(huán)境在一臺iMac上,其中mysql是通過brew進(jìn)行安裝的。
安裝時,配置一下macOS的防火墻,允許一下mysqld應(yīng)用程序,其他電腦就可以訪問了。
后來進(jìn)行了一次brew upgrade升級,就不能訪問了。

分析與定位過程

1. 初步認(rèn)為是防火墻配置問題

各種google,各種查年macOS的幫助文檔,各種嘗試,最終告敗。

2. 遇到轉(zhuǎn)機(jī),發(fā)現(xiàn)是mysql服務(wù)問題

上面各種嘗試時,發(fā)現(xiàn)mysqld進(jìn)程中,帶了參數(shù)--bind-address=127.0.0.1,才考慮到是由于mysql升級導(dǎo)致mysql默認(rèn)本地訪問。

解決方法與過程

確定病因

查看mysql進(jìn)程,發(fā)現(xiàn)帶有參數(shù)--bind-address=127.0.0.1

?  ~ ps -ef|grep mysql
  501   452     1   0  5:35下午 ??         0:00.03 /bin/sh /usr/local/opt/mysql/bin/mysqld_safe --bind-address=127.0.0.1 --datadir=/usr/local/var/mysql
  501   597   452   0  5:35下午 ??         0:08.17 /usr/local/opt/mysql/bin/mysqld --basedir=/usr/local/opt/mysql --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql/lib/plugin --bind-address=127.0.0.1 --log-error=/usr/local/var/mysql/wenin819-RMBP.local.err --pid-file=/usr/local/var/mysql/wenin819-RMBP.local.pid
  501 14758  9182   0  3:07下午 ttys002    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn mysql

確認(rèn)端口監(jiān)聽,發(fā)現(xiàn)只監(jiān)聽localhost,確定病因。

?  ~ sudo lsof -i:3306
Password:
COMMAND    PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld     597 wenin   40u  IPv4 0x7ab1e3f71f0cd1af      0t0  TCP localhost:mysql (LISTEN)
JavaAppli 7506 wenin   83u  IPv6 0x7ab1e3f71c925147      0t0  TCP [::192.168.1.189]:60796->[::192.168.1.88]:mysql (CLOSED)

恍然大悟,知道m(xù)acOS防火墻中為什么沒有主動出現(xiàn)mysqld應(yīng)用程序。自己手工添加也不可以。

解決過程

通過google與brew info mysql,以及查看mysql配置文件,都沒有發(fā)現(xiàn)“問題參數(shù)”是哪里添加的。最后只有通過暴力查找了,查找發(fā)現(xiàn)在homebrew.mxcl.mysql.plist文件中指定了那參數(shù)。

?  ~ cd $(brew --prefix mysql)/
?  mysql grep '127.0.0.1' -r * | vim -

編輯該文件,去掉<string>--bind-address=127.0.0.1</string>,或改為<string>--bind-address=0.0.0.0</string>,最終homebrew.mxcl.mysql.plist文件內(nèi)容如下。

?  mysql cat homebrew.mxcl.mysql.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.mysql</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mysql/bin/mysqld_safe</string>
    <string>--datadir=/usr/local/var/mysql</string>
    <string>--bind-address=0.0.0.0</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/usr/local/var/mysql</string>
</dict>
</plist>

重啟mysql服務(wù)。

?  mysql sudo brew services restart mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)

進(jìn)一步開啟防火墻,解決問題。


mysqld的macOS防火墻配置

總結(jié)

反思一:先入為主,過分依賴自己的猜測

最終定位解決問題很簡單,不過我還是犯了這樣低級錯誤,主要原因如下。
這臺iMac既當(dāng)部分測試環(huán)境,同時也是別人的個人電腦,在出問題的前后,有macOS系統(tǒng)的升級,又有brew upgrade升級,可以說mysql與系統(tǒng)都可能發(fā)生改變,給解決問題帶了迷霧。本來可以利用自己Linux運(yùn)維知識,能很快的去確定問題的,但由于自己的猜測,走錯了方向,繞了很大的彎路。

學(xué)習(xí)一:macOS防火墻小知識

  1. 當(dāng)應(yīng)用或服務(wù)初始監(jiān)聽某一端口時,系統(tǒng)會詢問是否允許訪問;在shell環(huán)境下默認(rèn)阻止(猜測,可以先這樣理解)。同時在防火墻中會出現(xiàn)對應(yīng)應(yīng)用程序的配置。
  2. 如果防火墻中沒有對應(yīng)的配置,很可能是應(yīng)用沒有監(jiān)聽外網(wǎng)端口,或是被刪除掉了配置,這樣可以通過sudo lsof -i:<端口號>去確認(rèn)。
  3. 如果由于防火墻配置被刪除,可以通過sudo ps -ef|grep <pid>,查詢到監(jiān)聽端口對應(yīng)的命令行,進(jìn)而手動添加此應(yīng)用,進(jìn)而進(jìn)行配置。

學(xué)習(xí)二:macOS防火墻只能按應(yīng)用配置,而不能按端口配置,利大于弊

這樣更安全,畢竟macOS主要針對個人用的,應(yīng)用會裝很多很雜。如果只是按端口配置,那惡意應(yīng)用完全可以在對應(yīng)服務(wù)停止的情況下,利用此端口,進(jìn)而威脅電腦的安全。
所以網(wǎng)上雖然有辦法可以讓macOS按端口進(jìn)行配置防火墻,但我真不建議大家那樣做。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容