MySQL文件及目录权限设置分析-爱可生

1
背景
创建文件及目录时,我们会对相关的权限有一定的要求,默认的可以通过系统的umask来控制 。然而,在我们使用MySQL时,无论是开始使用前的初始化,还是MySQL实例启动后,创建的相关文件及目录,并不受umask控制,MySQL 默认创建出来的文件权限是0660,目录权限是0700,并且,在通过引入MySQL初始化相关的环境变量解决了这一问题后,在以不同的MySQL的启动方式启动实例后,创建的文件及目录的权限也不相同 。以下,将从几个方面分别讨论 。
 
2
umask对系统文件及
目录的影响
以下是linux man-page中对umask的相关描述:

MySQL文件及目录权限设置分析-爱可生

文章插图
 
从该描述中,可以看出,umask影响open、mkdir等其他系统调用产生的新的文件或目录的权限 。
 
2.1 umask对open函数的影响
open函数用到umask的相关形式为:
MySQL文件及目录权限设置分析-爱可生

文章插图
 
截取open函数的部分描述:
MySQL文件及目录权限设置分析-爱可生

文章插图
 
通过该段描述,当没有默认的acl时,创建的文件的权限应为mode & ~umask,而一般情况下针对文件来说,系统默认的mode为0666(并不是所有的文件都可以执行),所以实际创建的文件权限应为 0666 & ~umask,当umask为0022时,创建出来的文件的权限应为0644 。
MySQL文件及目录权限设置分析-爱可生

文章插图
 
2.2 umask对mkdir函数的影响
mkdir函数用的umask的相关形式:
MySQL文件及目录权限设置分析-爱可生

文章插图
 
截取相关描述:
MySQL文件及目录权限设置分析-爱可生

文章插图
 
在没有默认acl的情况下,创建的目录的权限为 mode & ~umask & 0777,一般情况下,目录的默认的mode为0777,所以实际创建的目录权限应为 0777 & ~umask & 0777,当umask为0022时,创建的目录的权限应为0755 。
MySQL文件及目录权限设置分析-爱可生

文章插图
 
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对MySQL默认的影响
3.1 Umask对MySQL默认的影响
当umask=0022时,初始化后生成的文件及目录权限:
MySQL文件及目录权限设置分析-爱可生

文章插图
 
可以看出创建出来的文件的权限为0660,目录权限为0700,与系统umask并无关系 。
 
实例启动后,通过mysql连接数据库,创建新的数据库及表,查看权限:
MySQL文件及目录权限设置分析-爱可生

文章插图
 
新创建的文件及目录权限为0660、0700,同样与umask无关 。
 
3.2 源码层面分析
MySQL文件及目录权限设置分析-爱可生

文章插图
 
通过这段源码可以看出,当没有设置UMASK、UMASK_DIR环境变量时,MySQL默认创建文件及目录的权限分别为0660、0700 。
 
4
自定义MySQL相关文件及
目录权限
4.1 初始化过程中文件及目录的权限
4.1.1 方法
MySQL 提供另外一种方法,设置UMASK和UMASK_DIR环境变量,可以影响创建文件和目录的权限:
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.
简单的把核心内容翻译一下,设置了UMASK及UMASK_DIR之后,生成的文件及目录的权限应分别为:
MySQL文件及目录权限设置分析-爱可生


推荐阅读