mysql目录权限设置_MySQL文件及目录权限设置分析-爱可生
1
背景
創(chuàng)建文件及目錄時(shí),我們會(huì)對(duì)相關(guān)的權(quán)限有一定的要求,默認(rèn)的可以通過系統(tǒng)的umask來控制。然而,在我們使用MySQL時(shí),無論是開始使用前的初始化,還是MySQL實(shí)例啟動(dòng)后,創(chuàng)建的相關(guān)文件及目錄,并不受umask控制,MySQL 默認(rèn)創(chuàng)建出來的文件權(quán)限是0660,目錄權(quán)限是0700,并且,在通過引入MySQL初始化相關(guān)的環(huán)境變量解決了這一問題后,在以不同的MySQL的啟動(dòng)方式啟動(dòng)實(shí)例后,創(chuàng)建的文件及目錄的權(quán)限也不相同。以下,將從幾個(gè)方面分別討論。
2
umask對(duì)系統(tǒng)文件及
目錄的影響
以下是linux man-page中對(duì)umask的相關(guān)描述:
從該描述中,可以看出,umask影響open、mkdir等其他系統(tǒng)調(diào)用產(chǎn)生的新的文件或目錄的權(quán)限。
2.1 umask對(duì)open函數(shù)的影響
open函數(shù)用到umask的相關(guān)形式為:
截取open函數(shù)的部分描述:
通過該段描述,當(dāng)沒有默認(rèn)的acl時(shí),創(chuàng)建的文件的權(quán)限應(yīng)為mode & ~umask,而一般情況下針對(duì)文件來說,系統(tǒng)默認(rèn)的mode為0666(并不是所有的文件都可以執(zhí)行),所以實(shí)際創(chuàng)建的文件權(quán)限應(yīng)為 0666 & ~umask,當(dāng)umask為0022時(shí),創(chuàng)建出來的文件的權(quán)限應(yīng)為0644。
2.2 umask對(duì)mkdir函數(shù)的影響
mkdir函數(shù)用的umask的相關(guān)形式:
截取相關(guān)描述:
在沒有默認(rèn)acl的情況下,創(chuàng)建的目錄的權(quán)限為 mode & ~umask & 0777,一般情況下,目錄的默認(rèn)的mode為0777,所以實(shí)際創(chuàng)建的目錄權(quán)限應(yīng)為 0777 & ~umask & 0777,當(dāng)umask為0022時(shí),創(chuàng)建的目錄的權(quán)限應(yīng)為0755。
2.3 參考資料
[umask 參考](http://man7.org/linux/man-pages/man2/umask.2.html)
[open 參考](http://man7.org/linux/man-pages/man2/open.2.html)
[mkdir 參考](http://man7.org/linux/man-pages/man2/mkdir.2.html)
3
Umask對(duì)MySQL默認(rèn)的影響
3.1 Umask對(duì)MySQL默認(rèn)的影響
當(dāng)umask=0022時(shí),初始化后生成的文件及目錄權(quán)限:
可以看出創(chuàng)建出來的文件的權(quán)限為0660,目錄權(quán)限為0700,與系統(tǒng)umask并無關(guān)系。
實(shí)例啟動(dòng)后,通過mysql連接數(shù)據(jù)庫,創(chuàng)建新的數(shù)據(jù)庫及表,查看權(quán)限:
新創(chuàng)建的文件及目錄權(quán)限為0660、0700,同樣與umask無關(guān)。
3.2 源碼層面分析
通過這段源碼可以看出,當(dāng)沒有設(shè)置UMASK、UMASK_DIR環(huán)境變量時(shí),MySQL默認(rèn)創(chuàng)建文件及目錄的權(quán)限分別為0660、0700。
4
自定義MySQL相關(guān)文件及
目錄權(quán)限
4.1 初始化過程中文件及目錄的權(quán)限
4.1.1 方法
MySQL 提供另外一種方法,設(shè)置UMASK和UMASK_DIR環(huán)境變量,可以影響創(chuàng)建文件和目錄的權(quán)限:
The default UMASK and UMASK_DIR values are 0660 and 0700, respectively. MySQL assumes that the value forUMASK or UMASK_DIR is in octal if it starts with a zero. For example,setting UMASK=0600 is equivalent toUMASK=384 because 0600 octal is 384 decimal.
The UMASK and UMASK_DIR variables, despite their names, are used as modes, not masks:
If UMASK is set, mysqld uses ($UMASK | 0600) as the mode for file creation, so that newly created files have a mode in the range from 0600 to 0666 (all values octal).
If UMASK_DIR is set, mysqld uses ($UMASK_DIR | 0700) as the base mode for directory creation, which then is AND-ed with ~(~$UMASK & 0666), so that newly created directories have a mode in the range from 0700 to 0777 (all values octal). The AND operation may remove read and write permissions from the directory mode, but not execute permissions.
簡單的把核心內(nèi)容翻譯一下,設(shè)置了UMASK及UMASK_DIR之后,生成的文件及目錄的權(quán)限應(yīng)分別為:
如設(shè)置了UMASK=0664,UMASK_DIR=0774,在經(jīng)過以上運(yùn)算之后,生成的文件及目錄的權(quán)限應(yīng)為0664,0774。
4.1.2 設(shè)置方式
設(shè)置這兩個(gè)環(huán)境變量的建議做法是,在用戶的/etc/skel/{bashrc, bash_profile}文件和root用戶的.bashrc .bash_profile中加入:
4.1.3 驗(yàn)證
驗(yàn)證所用版本:mysql 5.6.31
系統(tǒng)umask:
UMASK、UMASK_DIR環(huán)境變量:
初始化后生成的文件及目錄權(quán)限為:
4.1.4 特殊的目錄權(quán)限
在初始化完成后,mysql、test文件夾的權(quán)限和預(yù)期不符,出現(xiàn)此種情況的原因?yàn)閙ysql、test文件夾的創(chuàng)建是通過scripts/mysql_install_db這個(gè)perl腳本實(shí)現(xiàn)的,找到相關(guān)的代碼如下,可以看出,這兩個(gè)文件夾的創(chuàng)建時(shí)的權(quán)限是固定的。
4.2 啟動(dòng)及MySQL實(shí)例運(yùn)行中創(chuàng)建文件及目錄的權(quán)限
啟動(dòng)mysql 有兩種方式,/etc/init.d/mysql start或?service mysql start,這兩種方式都能夠正確的啟動(dòng)MySQL,但實(shí)際情況是有差別的,尤其是在設(shè)置了上述環(huán)境變量的情況下。
查看了service 命令的 manual,描述是這樣的:
DESCRIPTION
service runs a System V init script in as predictable environment as possible, removing most environment variables and with current working directory set to /.
通過驗(yàn)證后確實(shí)如此,用service 命令啟動(dòng) 會(huì)去掉UMASK環(huán)境變量:
4.2.1 驗(yàn)證
啟動(dòng)后,生成的mysql.err文件權(quán)限為0640,通過mysql連接數(shù)據(jù)庫,創(chuàng)建的新的database及table,查看權(quán)限:
實(shí)例運(yùn)行后創(chuàng)建的文件及目錄權(quán)限為0660、0700,UMASK、UMASK_DIR環(huán)境變量未起作用。
4.2.1.1 源碼層面分析
使用service mysql start 啟動(dòng):
使用service mysql start 啟動(dòng)不會(huì)產(chǎn)生 atoi_octal 函數(shù)調(diào)用,所以UMASK、UMASK_DIR環(huán)境變量沒有生效。
4.2.2 解決辦法
啟動(dòng)腳本中加入 export UMASK等環(huán)境變量;
不使用service命令啟動(dòng)。
驗(yàn)證
驗(yàn)證所用版本:mysql 5.6.31
以下,通過在每次啟動(dòng)MySQL服務(wù)之前,刪除MySQL的錯(cuò)誤日志,啟動(dòng)之后查看生成的錯(cuò)誤日志的權(quán)限來具體說明這個(gè)問題(本例中,錯(cuò)誤日志為mysql.err),最初初始化生成的錯(cuò)誤日志的權(quán)限為0664,即 rw-rw-r–。
啟動(dòng)腳本中加入 export UMASK等環(huán)境變量:
啟動(dòng)后mysql.err權(quán)限為0664,通過mysql連接數(shù)據(jù)庫,創(chuàng)建新的數(shù)據(jù)庫及表,查看權(quán)限:
新創(chuàng)建的文件及數(shù)據(jù)庫目錄的權(quán)限為0664、0774。
4.2.2.1 源碼層面分析
使用service啟動(dòng):
產(chǎn)生atoi_octal調(diào)用,UMASK、UMASK_DIR環(huán)境變量生效。
1. 不使用service命令啟動(dòng)
啟動(dòng)后生成的mysql.err權(quán)限仍為0664,通過mysql連接數(shù)據(jù)庫,創(chuàng)建新的數(shù)據(jù)庫及表,查看權(quán)限:
新創(chuàng)建的文件及數(shù)據(jù)庫目錄的權(quán)限為0664、0774。
4.2.2.2 源碼層面分析
使用/etc/init.d/mysql 啟動(dòng):
使用/etc/init.d/mysql start 啟動(dòng),產(chǎn)生atoi_octal函數(shù)調(diào)用,UMASK、UMASK_DIR環(huán)境變量生效。
4.2.3 特殊文件的權(quán)限
socket文件權(quán)限:
每次MySQL啟動(dòng)之后產(chǎn)生的socket文件(本例中的mysql.sock)的權(quán)限與預(yù)期不符,通過查看相關(guān)源碼,以及相關(guān)socket文件生成的源碼,可以解釋該現(xiàn)象。
4.2.3.1 源碼層面分析
MySQL socket文件生成源碼:
socket文件生成的相關(guān)源碼:
4.3 總結(jié)
代碼中單獨(dú)定義了my_umask變量,并通過判斷環(huán)境變量來調(diào)整my_umask的值;
如果日志文件存在, 重啟時(shí)打開日志時(shí)并不會(huì)對(duì)文件權(quán)限變更;如果文件不存在,打開日志時(shí)會(huì)創(chuàng)建并設(shè)定文件權(quán)限。
總結(jié)
以上是生活随笔為你收集整理的mysql目录权限设置_MySQL文件及目录权限设置分析-爱可生的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql查询当天最新的一张表_mysq
- 下一篇: mysql安全性实验心得_mysql安全