mysql 新建文件夹权限设置_MySQL文件及目录权限设置分析-爱可生

本文详细探讨了MySQL在创建文件和目录时如何不受系统umask控制,其默认权限为0660和0700。通过设置UMASK和UMASK_DIR环境变量可以自定义权限,但不同启动方式可能影响这些变量的生效。服务启动脚本中添加环境变量可以使自定义权限生效,而socket文件的权限则由源码中固定设置。
摘要由CSDN通过智能技术生成

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

1

背景

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

2

umask对系统文件及

目录的影响

以下是linux man-page中对umask的相关描述:

339fb12705798c9456de5cb02595d8fc.png

从该描述中,可以看出,umask影响open、mkdir等其他系统调用产生的新的文件或目录的权限。

2.1 umask对open函数的影响

open函数用到umask的相关形式为:

9367dd519e0e9be398b89512d50ed0dd.png

截取open函数的部分描述:

d41a1dc0c055a91705e1bdbf9b09ab4d.png

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

dc72b106975edf7799c80452f7d1690b.png

2.2 umask对mkdir函数的影响

mkdir函数用的umask的相关形式:

e4633b3dc28a8c4cfc91a9c34351ed13.png

截取相关描述:

c089b7a4310b56740412692284695a84.png

在没有默认acl的情况下,创建的目录的权限为 mode & ~umask & 0777,一般情况下,目录的默认的mode为0777,所以实际创建的目录权限应为 0777 & ~umask & 0777,当umask为0022时,创建的目录的权限应为0755。

da7ccb341e25842a27945e2cce1fa6e3.png

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时,初始化后生成的文件及目录权限:

b3566fb1972fbb9dbd8f5956283f40a1.png

可以看出创建出来的文件的权限为0660,目录权限为0700,与系统umask并无关系。

实例启动后,通过mysql连接数据库,创建新的数据库及表,查看权限:

0ac411f658a5d43e2d384ddaedcf87d7.png

新创建的文件及目录权限为0660、0700,同样与umask无关。

3.2 源码层面分析

6c1b85462b3ce95c589dd969525bf3d6.png

通过这段源码可以看出,当没有设置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之后,生成的文件及目录的权限应分别为:

834d8d3253b4fc86fbd29e7ea02894b2.png

如设置了UMASK=0664,UMASK_DIR=0774,在经过以上运算之后,生成的文件及目录的权限应为0664,0774。

4.1.2 设置方式

设置这两个环境变量的建议做法是,在用户的/etc/skel/{bashrc, bash_profile}文件和root用户的.bashrc .bash_profile中加入:

b4f96217f3a33be6b1e4a36ede9f5039.png

4.1.3 验证

验证所用版本:mysql 5.6.31

系统umask:

686d008e23f84cfeae2e9314be8d4540.png

UMASK、UMASK_DIR环境变量:

3d07950307f7d2e5a7a147cefa60635f.png

初始化后生成的文件及目录权限为:

499b05c4b6539cfd65e264d6d1d1ca36.png

4.1.4 特殊的目录权限

在初始化完成后,mysql、test文件夹的权限和预期不符,出现此种情况的原因为mysql、test文件夹的创建是通过scripts/mysql_install_db这个perl脚本实现的,找到相关的代码如下,可以看出,这两个文件夹的创建时的权限是固定的。

7662ebd0268378fa3544b26a9a0f09ff.png

4.2 启动及MySQL实例运行中创建文件及目录的权限

启动mysql 有两种方式,/etc/init.d/mysql start或 service mysql start,这两种方式都能够正确的启动MySQL,但实际情况是有差别的,尤其是在设置了上述环境变量的情况下。

查看了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 /.

通过验证后确实如此,用service 命令启动 会去掉UMASK环境变量:

fa1bb69fa46b2742fcd05d68a661cdab.png

53866ec82fb5033234e39ecfe161cdb4.png

f2bd9a591e27f5aa85c37f37a54f0d1c.png

4.2.1 验证

8f681ab40683cecad5f782c171b0bdc1.png

启动后,生成的mysql.err文件权限为0640,通过mysql连接数据库,创建的新的database及table,查看权限:

a4008c7ab4a02b9bd404a6b798d5c595.png

实例运行后创建的文件及目录权限为0660、0700,UMASK、UMASK_DIR环境变量未起作用。

4.2.1.1 源码层面分析

1bb87ca2168dc630d30a0e931ef872ee.png

24cbdeae7e069aa6bcd635d03835e046.png

1ee65d0093b6ae0e4091ca0dcbabb0e0.png

使用service mysql start 启动:

f339f19cf67e86ac4bf22f25450cf409.png

使用service mysql start 启动不会产生 atoi_octal 函数调用,所以UMASK、UMASK_DIR环境变量没有生效。

4.2.2 解决办法

启动脚本中加入 export UMASK等环境变量;

不使用service命令启动。

验证

验证所用版本:mysql 5.6.31

以下,通过在每次启动MySQL服务之前,删除MySQL的错误日志,启动之后查看生成的错误日志的权限来具体说明这个问题(本例中,错误日志为mysql.err),最初初始化生成的错误日志的权限为0664,即 rw-rw-r–。

启动脚本中加入 export UMASK等环境变量:

7d2e4fe57787b0fd1cdbb63f0649b50e.png

50e224431b6060643f1e05114d5677ab.png

启动后mysql.err权限为0664,通过mysql连接数据库,创建新的数据库及表,查看权限:

11a90fff51357deb0226bfad494c468a.png

新创建的文件及数据库目录的权限为0664、0774。

4.2.2.1 源码层面分析

ac11c98d5e7f8d075c8a7740c45b4cfa.png

使用service启动:

1bee3a0e7681a80af4c33a61863c1d86.png

产生atoi_octal调用,UMASK、UMASK_DIR环境变量生效。

1. 不使用service命令启动

47e6d59fdcb90947870c4c2c8333c406.png

启动后生成的mysql.err权限仍为0664,通过mysql连接数据库,创建新的数据库及表,查看权限:

9b00fb97a5adb9591b957ea759f43db3.png

新创建的文件及数据库目录的权限为0664、0774。

4.2.2.2 源码层面分析

2640d3add7de8b15ffa5b3e6fe576b25.png

使用/etc/init.d/mysql 启动:

3ab249f4896cf611fe965c6bde5b7ef7.png

使用/etc/init.d/mysql start 启动,产生atoi_octal函数调用,UMASK、UMASK_DIR环境变量生效。

4.2.3 特殊文件的权限

socket文件权限:

每次MySQL启动之后产生的socket文件(本例中的mysql.sock)的权限与预期不符,通过查看相关源码,以及相关socket文件生成的源码,可以解释该现象。

4.2.3.1 源码层面分析

MySQL socket文件生成源码:

e77d033f46b74d3b29b197362ac1cd33.png

socket文件生成的相关源码:

78533436b4036612b1df0747e4bbd582.png

4.3 总结

代码中单独定义了my_umask变量,并通过判断环境变量来调整my_umask的值;

如果日志文件存在, 重启时打开日志时并不会对文件权限变更;如果文件不存在,打开日志时会创建并设定文件权限。

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值