1

背景

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

2

umask对系统文件及

目录的影响

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

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

2.1 umask对open函数的影响

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

截取open函数的部分描述:

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

2.2 umask对mkdir函数的影响

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

截取相关描述:

在没有默认acl的情况下,创建的目录的权限为 mode & ~umask & 0777,一般情况下,目录的默认的mode为0777,所以实际创建的目录权限应为 0777 & ~umask & 0777,当umask为0022时,创建的目录的权限应为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对MySQL默认的影响

3.1 Umask对MySQL默认的影响

当umask=0022时,初始化后生成的文件及目录权限:

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

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

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

3.2 源码层面分析

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

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

4.1.2 设置方式

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

4.1.3 验证

验证所用版本:mysql 5.6.31

系统umask:

UMASK、UMASK_DIR环境变量:

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

4.1.4 特殊的目录权限

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

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环境变量:

4.2.1 验证

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

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

4.2.1.1 源码层面分析

使用service mysql start 启动:

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

4.2.2 解决办法

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

2. 不使用service命令启动。

验证

验证所用版本:mysql 5.6.31

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

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

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

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

4.2.2.1 源码层面分析

使用service启动:

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

1. 不使用service命令启动

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

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

4.2.2.2 源码层面分析

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

使用/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文件生成源码:

socket文件生成的相关源码:

4.3 总结

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

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

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

  1. mysql b树子节点个数_MySQL 和 B 树的那些事-爱可生

    原标题:MySQL 和 B 树的那些事-爱可生 在介绍B树之前,先来看另一棵神奇的树--二叉排序树(Binary Sort Tree),首先它是一棵树,"二叉"这个描述已经很明显了 ...

  2. linux 文件夹 775,linux - 如何为文件夹及其所有子文件夹和文件设置chmod?

    linux - 如何为文件夹及其所有子文件夹和文件设置chmod? 有没有办法为755设置htdocs及其所有内容,包括子文件夹和文件? 此外,在将来,如果我在htdocs内创建一个新文件夹或文件,它 ...

  3. win10 桌面新建文件夹、重命名文件、删除文件及复制文件不能自动刷新问题的解决

    早上清理c盘后发现电脑突然出了问题: 在桌面新建文件夹重命名后文件夹名字没有改变且双击无法打开(找不到位置),打算删除右击没有反应,需要手动刷新才能成功. 后来经过网络搜索找到解决方案: 1.win+ ...

  4. 新建一个文件夹出现多个文件夹

    @新建一个文件夹出现多个文件夹 解决办法: 这个是由于管理权限造成的 在这个硬盘的属性–安全–组或用户名–编辑,添加 Authenticated users,授予完全控制权限即可正常.

  5. Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限

    一台老的PHP后台服务器,今天用 free -m 查看,发现内存跑满了. 再 top,然后按下shift+m,也就是按内存占用百分比排序,发现排在第一的进程,才占用0.9%,那是什么占用的呢?谷歌了一 ...

  6. linux查询所建文件夹,linux中的文件和文件夹的新建、查询、删除

    新建文件夹 使用的mkdir命令可以新建文件夹. mkdir filename 这样就创建了一个叫做filename文件夹. 新建一个文件 新建的文件可以包括任何扩展名,.txt/.cpp/.csv ...

  7. mysql xp cmdshell_LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句...

    LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件 ...

  8. 服务器要删除文件访问被拒绝,删除文件提示:文件夹访问被拒绝 需要来自administrator权限执行操作...

    有时候我们在删除一些系统重要文件,或者被保护的文件的时候,会出现对话框,提示我们您需要来自administrator权限才能对此文件夹进行更改,这是什么原因导致的?今天小编就为大家分析下解决办法. 方 ...

  9. wi7计算机如何查看隐藏的文件夹,win7隐藏的文件夹怎么显示?隐藏文件夹查看及设置方法...

    隐藏电脑文件夹的方法 隐藏电脑文件夹的方法有很多,有我们最常用的方法,修改文件夹属性,也可以使用专门的文件佳隐藏软件或文件夹加密软件对文件夹进行包装都可以很好的保护我们的隐私,这里绿茶小编介绍给大家的 ...

  10. ubuntu 16.04怎么更改文件夹里面所有子文件权限

    环景: Ubuntu 16.04.7 LTS 问题描述: 怎么更改文件夹里面所有子文件权限 解决方案: 1.利用chmod修改权限: 对ML/目录下的所有子文件与子目录执行相同的权限变更: chmod ...

最新文章

  1. OpenCV+python:顶帽、黑帽、形态学梯度
  2. Java中ArrayList最大容量为什么是Integer.MAX_VALUE-8?
  3. win10获取NTLM哈希
  4. vue-cli打包后怎么修改服务器地址实践有效
  5. android studio 自动生成sql语句,Android Studio Plugin 插件开发教程(三) —— 制作一个自动生成数据库代码的插件...
  6. 《计算机网络》学习笔记 ·001【概述】
  7. LeetCode刷题——62. 不同路径
  8. 运动matlab分析机械振动,《运用Matlab分析机械振动》-毕业论文.doc
  9. 寒门难出贵子,我当程序员让爸妈在老家长脸了
  10. DeepMind再登Nature封面!2000年前残断古希腊文,完形填空七成准
  11. 拼图复原_1张废旧纸板,3分钟带娃变成趣味拼图!
  12. Localization-Aware Active Learning for Object Detection (ACCV)
  13. java设计九宫格拼图软件哪个好用_十亿人都在拼的拼图软件,这八款最好用
  14. 企业信息化的若干原则性问题
  15. 从图片到涂鸦:高品质涂鸦的自动生成
  16. 使用next(iter(data.DataLoader())报错StopIteration
  17. MySQL之全文索引详解
  18. 微巴士阳光出行---竞品分析
  19. 微信发送视频给好友,这篇文章保证原画质不被压缩
  20. 关店歇业?当黄金时代成为历史,快时尚品牌的花式自救

热门文章

  1. KingDZ 变菜鸟,每日一个C#小实例之---玩转鼠标
  2. android自定义按钮控件样式
  3. [原]奇怪的参数错误
  4. Python学习之路_day_08(函数介绍)
  5. Xcode Developer Tools
  6. 0427千里之行,始于足下
  7. RDLC报表上下标实现
  8. 面向Transformer模型的高效预训练方法
  9. 【Linux】很实用的 Linux 高级命令,老码农一定要懂
  10. NLP领域,哪些综述性的文章值得推荐?