MySQL修改啟動埠無效
技術標籤:MySQLLinuxmysqllinuxcentos
今天遇到一個特別沙雕的問題:在安裝MySQL的時候,指定了my.cnf
檔案,但是檔案中指定的埠一直不生效,每次啟動都是用的3306。對my.cnf
內容進行了檢查核對,發現配置檔案並無問題,也就是在配置檔案內容沒有任何錯誤的情況下,配置並未生效,這就相當的奇怪了,排查了好久,最終在官網,找到了響應的解決方案,不過在講解決方案之前,我們來說一下mysql配置檔案的使用規則。
my.cnf載入順序
我們檢視MySQL在啟動的過程中,如果未指定--defaults-file
,那麼會載入哪裡的my.cnf
呢?我們檢視一下mysql
命令的幫助資訊:mysql --help | grep 'my.cnf'
[email protected] ~ % mysql --help | grep 'my.cnf' -C1 --color
--
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
原來mysql在啟動的時候,如果未指定my.cnf
的話,會依次去尋找/etc/my.cnf
、/etc/mysql/my.cnf
、/usr/local/mysql/etc/my.cnf
、~/.my.cnf
,只要找到
注意: 在
$HOME
目錄下的檔案是隱藏檔案,所以前面有個.
自定義my.cnf
mysqld
命令允許我們通過引數--defaults-file=./my.cnf
的方式來指定例項啟動時使用的配置檔案,這時MySQL在啟動時,會只讀取指定的檔案中的配置,若檔案不存在或者配置內容錯誤,也不會去尋找下一順位的檔案,而是直接報錯。
如何自定義不解釋了
問題解決
配置檔案核查了很多遍,發現是沒有任何的問題,然後就開始翻官網,在官網文件中看到了這樣一句話:
If you enable certain MySQL features, you might need to set the SELinux TCP port context for additional ports used by those features. If ports used by MySQL features do not have the correct SELinux context, the features might not function correctly.
大致意思就是如果啟用了SELinux,需要把埠加入到mysqld_port_t中。具體的加入方式如下:
# 1. 檢查SELinux是否開啟
getenforce
> Disabled
# 說明:(詳細可百度細看)
# disable - No SELinux policy is loaded.
# permissive - SELinux prints warnings instead of enforcing.
# enforcing - SELinux security policy is enforced.
# 1. 檢視mysql當前開放的埠
semanage port -l | grep mysqld
# 2. 第二步新增需要使用的埠
semanage port -a -t mysqld_port_t -p tcp 3308
加上埠之後,再次啟動MySQL服務,發現埠使用的還是3306
,這就很奇怪了,明明按照官網要求設定好了,怎麼還不行?然後再次嘗試使用命令setenforce 0
把SELinux關閉,發現仍然無濟於事,但是啟動日誌中出現了這麼一句話:
my_print_defaults: [Warning] World-writable config file '/usr/local/mysql3/config/my.cnf' is ignored.
哦吼?ignore???配置檔案被忽略了,因為配置檔案是World-writable
許可權,那我們來看下配置檔案的許可權:
喲呵,許可權是777,所有使用者都可以修改,這就很危險了,誰都能改,這不扯淡麼,並且在官網找到了這麼一句話:
On Unix platforms, MySQL ignores configuration files that are world-writable. This is intentional as a security measure.
那麼既然這樣的話,我們就把配置檔案修改為555,剝奪其寫許可權,然後再次啟動MySQL服務,哦喲,搞定了。