您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

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

时间:2020-04-18 09:43:52  来源:  作者:

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文件及目录权限设置分析-爱可生

 

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

 

4.1.2 设置方式

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

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

 

4.1.3 验证

验证所用版本:mysql 5.6.31

系统umask:

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

 

UMASK、UMASK_DIR环境变量:

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

 

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

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

 

4.1.4 特殊的目录权限

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

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

 

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

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

 


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

 


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

 

4.2.1 验证

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

 

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

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

 

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

 

4.2.1.1 源码层面分析

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

 


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

 


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

 

 

使用service mysql start 启动:

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

 

使用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文件及目录权限设置分析-爱可生

 


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

 

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

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

 

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

 

4.2.2.1 源码层面分析

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

 

使用service启动:

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

 

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

1. 不使用service命令启动

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

 

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

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

 

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

 

4.2.2.2 源码层面分析

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

 

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

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

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

 

socket文件生成的相关源码:

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

 

4.3 总结

  1. 代码中单独定义了my_umask变量,并通过判断环境变量来调整my_umask的值;
  2. 如果日志文件存在, 重启时打开日志时并不会对文件权限变更;如果文件不存在,打开日志时会创建并设定文件权限。


Tags:MySQL 权限设置   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1背景创建文件及目录时,我们会对相关的权限有一定的要求,默认的可以通过系统的umask来控制。然而,在我们使用MySQL时,无论是开始使用前的初始化,还是MySQL实例启动后,创建的相关文...【详细内容】
2020-04-18  Tags: MySQL 权限设置  点击:(65)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条