1. 程式人生 > >記一次Linux修改MySQL配置不生效的問題

記一次Linux修改MySQL配置不生效的問題

背景

自己手上有一個專案服務用的是AWS EC2,最近從安全性和效能方面考慮,最近打算把騰訊雲的MySQL資料庫遷移到AWS RDS上,因為AWS的出口規則和安全組等問題,我需要修改預設的3306埠和Bind Address限制特定的IP訪問,我在Stackoverflow上查詢瞭如何修改,但是網上的資料大多比較老舊,不符合目前主流的MySQL版本(使用的MySQL 5.7.27,作業系統使用Ubuntu 18.04.1 LTS)

過程

在 Stackoverflow上的高票回答很簡單,修改只需要三步就可以完成

/etc/my.cnf      // 找到配置檔案
port = 3306     // 修改內容
sudo service mysql restart      // 重啟MySQL

但實時並沒有那麼簡單,以上答案可能對舊版本管用,但是新版本你在/etc/my.cnf下根本找不到任何東西,檔案都不存在

然後我去查閱的官方文件,找到的配置檔案原來在目錄:/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配置的內容,但是修改後的配置已經成功生效,確認是檔案全域性可讀的安全問題導致

總結

最後是關於 MySQL 的安全規則導致修改配置不生效,當然這條規則,大部分情況下我們是不知道的(如果沒有完整閱讀官網文件的話),在經過這次問題,我大概有如下幾點總結,幫助大家在排查問題上少走彎路,儘快找到真實的問題:

  1. 遇到問題首先應該看官網的最新文件
  2. 檢視資料時間,網上很多資料時間太長,可能會誤導你
  3. 認真檢視警告資訊,熟練掌握排查工具和命令
  4. 基礎知識很重要,越是深的問題越考驗程式設計師的內功