本身手上有一個項目服務用的是AWS EC2,最近從安全性和性能方面考慮,最近打算把騰訊雲的MySQL數據庫遷移到AWS RDS上,由於AWS的出口規則和安全組等問題,我須要修改默認的3306端口和Bind Address限制特定的IP訪問,我在Stackoverflow上查詢瞭如何修改,可是網上的資料大多比較老舊,不符合目前主流的MySQL版本(使用的MySQL 5.7.27,操做系統使用Ubuntu 18.04.1 LTS)mysql
在 Stackoverflow上的高票回答很簡單,修改只須要三步就能夠完成程序員
/etc/my.cnf // 找到配置文件 port = 3306 // 修改內容 sudo service mysql restart // 重啓MySQL
但實時並無那麼簡單,以上答案可能對舊版本管用,可是新版本你在/etc/my.cnf下根本找不到任何東西,文件都不存在sql
而後我去查閱的官方文檔,找到的配置文件原來在目錄:/etc/mysql/my.cnf 下,可是不要以爲找到配置文件就萬事大吉,當你打開文件你會看到畫風變了,由於配置文件裏面沒有內容,而是引用了另外2個配置文件夾,/etc/mysql/my.cnf 具體內容是這樣的數據庫
!includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/
能夠,至少有線索了,順着路徑去找,在2個目錄下每一個文件都看了下,最後看到 mysql.conf.d/mysqld.cnf 彷佛是咱們要找的文件(官方文檔也驗證了這一點),打開能夠看到咱們須要修改的文件屬性安全
[mysqld] prot = 3306 bind-address = 127.0.0.1 // 只容許本機訪問
改爲我須要的的配置參數後,我覺得事情到這裏就結束了,當我使用 sudo service mysql restart 重啓服務的時候,我發現個人內網機器仍是訪問不了,我使用 netstat -ntlp 查看 Local Address,Foregin Address,發現我修改的配置後的配置沒有生效,我陷入的深深的自我懷疑當中,彷彿線索在這裏中斷了工具
而後,有網友說提到說有多是文件權限問題,若是文件權限過大(全局可寫),MySQL 會出現安全考慮不會讀取該配置文件,並且讀取自身的配置副本文件,我執行命令,如看以下警告性能
mysql --help | grep my.cnf mysql: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf' is ignored. order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
上面是指文件因爲全局可寫存在風險,被MySQL忽略,而且列出MySQL讀取配置文件的順序,這裏是能夠看到MySQL是存在多個my.cnf配置文件,有些是全局配置,有些是局部配置,找到線索後,處理起來就簡單不少了,咱們更改文件權限,再看看 mysql --help 就發現警告已經沒有了,具體命令以下:操作系統
sudo chmod 644 /etc/mysql/mysql.conf.d/mysqld.cnf mysql --help | grep my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
而後再執行 sudo service mysql restart,而後再看看 Local Address 和 Foreign Address 已經變成咱們在my.cnf配置的內容,可是修改後的配置已經成功生效,確認是文件全局可讀的安全問題致使rest
最後是關於 MySQL 的安全規則致使修改配置不生效,固然這條規則,大部分狀況下咱們是不知道的(若是沒有完整閱讀官網文檔的話),在通過此次問題,我大概有以下幾點總結,幫助你們在排查問題上少走彎路,儘快找到真實的問題:code