小知識:MySQL配置文件優先級

今天在RHEL7上,嚴格按以前的安裝規範文檔,部署MySQL環境時,發現經過服務的方式啓動MySQL失敗:
關鍵錯誤是:mysql

log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'.

規範的配置文件是:/etc/mysql/my.cnf,其中也有對應 log-error 參數的值,並非上面錯誤提示的路徑。
並且爲什麼會有mariadb字樣呢,猜想多是RHEL7默認配套mariadb的緣由,可是查詢安裝相關的rpm包,也未發現有mariadb的服務端。
最後對比發現,RHEL7默認的/etc/my.cnf有默認值,即便mariadb沒有安裝,而這個默認值裏配置的 log-error 參數值正好匹配報錯信息。
解決方案有兩個:sql

  • 1.刪掉/etc/my.cnf配置文件
  • 2.使用規範的參數配置,直接覆蓋/etc/my.cnf配置文件

我這裏選擇了第二種方案,成功解決問題。shell

最後覆盤時發現用:socket

mysql --help|more

能夠看到參數文件的順序是以下:code

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

也就是說優先級:/etc/my.cnf > /etc/mysql/my.cnf
但咱們知道優先級低的配置文件由於最後被讀到,若是有同一參數在不一樣配置文件中設置有差別,反而優先級低的配置文件,反而應該會覆蓋以前優先級高的配置文件中的對應參數內容。
那麼這又是怎麼回事呢?文檔

實際上仔細觀察,會發現RHEL7中默認的my.cnf內容以下:部署

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

實際上log-error的配置是在標籤[mysqld_safe]下,而不是[mysqld]下,而[mysqld_safe]標籤下的內容在以後優先級低的配置文件中並無再次設置;
換句話說,若是log-error在各個配置文件中,都是統一配置在[mysqld]下,就能夠實現被後面優先級低的用戶配置文件覆蓋。it

相關文章
相關標籤/搜索