前言
本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义和使用,对常见的用户相关命令如useradd,usermod,chage,userdel,id,su,whoami,who am i,groupadd,groupmod,groupdel,gpasswd,newgrp等命令的使用方法和实际演练。
文章目录
用户和组概览
用户和组概念
Linux 是多用户多任务操作系统,支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。
不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,通过这种权限的划分与管理,实现了多用户多任务的运行机制。
每个用户都有用户名和密码。在登录系统时,需要输入用户名和密码进入系统和自己的主目录。
用户组是具有相同特征用户集合。例如当需要让多个用户具有相同的权限,建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。
用户和组的关系
用户和用户组的对应关系有以下 4 种:
一对一:一个用户可存在一个组,是组中的唯一成员;
一对多:一个用户可以存在多个组中,此用户具有这多个组的权限;
多对一:多个用户存在一个组,这些用户具有和组相同的权限;
多对多:多个用户存在多个组中。
UID和GID
登陆系统时,输入用户名和密码,对于系统只认识用户名对应的 ID 。系统将用户名称与 ID 的对应关系存储在 /etc/passwd 中。
用户ID为2种,分别是用户 ID(UID)和组 ID(GID),每个文件都有自己的UID和GID。
/etc/passwd 文件中,UID 找到对应的用户名;
/etc/group 文件中,GID 找到对应的组名。
系统用户UID:1-999;普通用户UID:1000+。其中超级管理员的uid为0.
演示
- 查看用户uid,及文件所属用户
//可看到用户的uid是1005
[root@node1 ~]# grep -n 'hulk' /etc/passwd
35:hulk:x:1005:1005::/home/hulk:/bin/bash
//可看到文件的所属所属用户是hulk
[root@node1 ~]# ll -d /home/hulk/
drwx------ 2 hulk hulk 92 Jul 21 23:41 /home/hulk/
- 修改UID,再查看文件所属用户
将hulk的uid更改成为1006
[root@node1 ~]# grep -n 'hulk' /etc/passwd
35:hulk:x:1006:1005::/home/hulk:/bin/bash
之前的 hulk 因为修改了UID,导致 1005 找不到对应的账号,因此显示数字,不会显示用户名
[root@node1 ~]# ls -l /home/hulk/2
-rw-rw-r-- 1 1005 hulk 0 Jul 21 23:40 /home/hulk/2
#记得最后将其再手动改正过来
[root@prometheus ~]# id
uid=0(root) gid=0(root) groups=0(root)
初始组和附加组
一个用户可以属于多个群组,拥有这些群组的权限,这就引出了初始组(主组)和附加组。
初始组
初始组(主组):当用户登陆系统,立刻就会拥有这个群组的相关权限;在创建文件的时候,文件显示的是这个初始组。主组是添加 用户时默认创建的群组当创建,用户不指定主组的时候,会自动创建跟用户名称相同的主组。
新建用户 mysql,并将其加入 dba 群组中,执行命令如下:
root@localhost ~]# useradd mysql <--添加新用户
[root@localhost ~]# groupadd dba <--添加新群组
[root@localhost ~]# usermod -G dba mysql <--将用户mysql加入 users群组
[root@prometheus ~]# grep 'mysql' /etc/group <---mysql组的id是1000
mysql:x:1000:
dba:x:1001:mysql
[root@prometheus ~]# grep 'dba' /etc/group <--- dba的组id是1001
dba:x:1001:mysql
[root@prometheus ~]# grep 'mysq' /etc/passwd <--- passwd文件中的第 4 字段(GID)指的就是每个用户所属的主组,mysql用户的主组id是1000,也就是mysql用户的主组名是mysql。
mysql:x:1000:1000::/home/mysql:/bin/bash
[mysql@prometheus ~]$ touch 1
//文件属性对应的是用户的主组
[mysql@prometheus ~]$ ls -l
total 0
-rw-rw-r-- 1 mysql mysql 0 Nov 21 15:07 1
附加组
上个例子中虽然mysql用户的主组不是dba,但它也是属于dba这个组。所以看组文件的时候,会有关于mysql的成员信息。
[root@prometheus ~]# grep 'dba' /etc/group <--- dba的组id是1001
dba:x:1001:mysql
对于 mysql 用户同时属于 mysql 和dba 两个群组,所在,在读取\写入\运行文件时,只要是 mysql和 dba群组拥有的功能,mysql用户都拥有。
到此,我们已经学习了/etc/passwd、/etc/shadow、/etc/group,它们之间的关系可以这样理解,即先在 /etc/group 文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到
groups
使用 groups 命令可以知道用户有多少个组。
[root@localhost ~]# su - mysql
[mysql@localhost ~]$ groups
mysql dba
通过输出信息可以得知,mysql用户同时属于 mysql群组和 dba 群组,而且,第一个出现的为用户的初始组,后面的都是附加组,所以 mysql用户的初始组为 mysql群组,附加组为 dba群组。
passwd文件详解
/etc/passwd 文件是用户配置文件,存储用户的基本信息,这个文件对所有用户提供只读权限
查看文件内容
[root@localhost ~]# cat /etc/passwd
#查看一下文件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...省略部分输出...
文件格式
每行信息以 :作为分隔符,划分成 7 个字段,每个字段所表示的含义如下:
root:x:0:0:root:/root:/bin/bash
用户名 密码 UID GID 描述性信息 主目录 默认Shell
用户名
Linux 系统通过 UID 来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系。
密码
“x” 表示此用户设有密码,密码保存在 /etc/shadow 文件。 “x” 表示是否设置了密码,如果删除了 “x”,系统会认为这个用户没有密码,则用户可以免密钥登录。
UID
UID,用户 ID。每个用户有唯一的一个 UID,系统通过 UID 来识别不同的用户。操作系统版本不同,UID的保留范围也不同
UID 是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份。
范围 | 身份 |
---|---|
0 | 超级用户,0 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,把普通用户升级成管理员,只需把其他用户的 UID 修改为 0 就可以了,不建议操作 |
1-999 | 系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~999 分配给有系统账号需求的用户。 |
1000~65535 | 普通用户 |
GID
组ID,表示用户初始组的组 ID 号,也就是主组ID。
主目录
用户切换或者登录后的目录。有操作权限的访问目录,也称为用户的主目录。
root主目录为 /root,普通用户的默认主目录为 /home/用户名,即在 /home/ 目录下建立和用户名相同的目录作为主目录,如 mysql用户的主目录就是 /home/mysql/ 目录。
默认的Shell
Shell 命令解释器,是用户和 Linux 内核之间沟通的桥梁。Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
通常Linux 系统默认使用的命令解释器是 bash(/bin/bash),也有其他命令解释器,例如 sh、csh 等。如果是bash,表示这个用户可以执行命令
[root@prometheus ~]# grep -i 'mysql' /etc/passwd
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@prometheus ~]# su - mysql
Last login: Sun Nov 21 15:07:37 CST 2021 on pts/0
[mysql@prometheus ~]$ ls
1
如果把 mysql用户的 Shell 命令解释器修改为 /sbin/nologin,则这个用户就不能登录了,例如:
[root@prometheus ~]# grep -i 'mysql' /etc/passwd
mysql:x:1000:1000::/home/mysql:/sbin/nologin
[root@prometheus ~]# su - mysql
Last login: Sun Nov 21 21:51:58 CST 2021 on pts/0
This account is currently not available.
如果更改为指定命令,如 /usr/bin/passwd,例如:
[root@prometheus ~]# su - mysql
Last login: Sun Nov 21 21:55:20 CST 2021 on pts/0
/home/mysql
[root@prometheus ~]#
可以看到当切换用户的时候,用户并没有登录,只是执行了这个用户passwd这个命令。
shadow文件详解
/etc/shadow 文件用于存储用户的密码信息,称为“影子文件”。
/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
文件格式
介绍此文件之前,我们先打开看看,执行如下命令:
[root@prometheus ~]# cat /etc/shadow
root:$6$k85NeopLTiGz4bS/$V0wa/dmxQu5/aI52iCwqWyAu5NTJcyPs0WKREJSTOsvVVlCvPymExcOx5s.f/2MdPRmmn09g7djbZ0FyryGYy1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
....
文件中每行代表一个用户,使用 : 作为分隔符,这一行九个字段含义:
用户名 加密密码 最后一次修改时间 最小修改时间间隔 密码有效期 密码需要变更前的警告天数 密码过期后的宽限时间 账号失效时间 保留字段
用户名
同 /etc/passwd 文件中用户名。
加密密码
保存真正加密的密码。目前密码采用的是 SHA512 散列加密算法。
所有伪用户的密码都是 !! 或 *,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录(可以通过root切换)。
[root@prometheus ~]# useradd zhangsan
[root@prometheus ~]# grep -i 'zhangsan' /etc/shadow
zhangsan:!!:18075:0:99999:7:::
最后一次修改时间
最后一次修改密码的时间,当前zhangsan用户显示的是 18075 ,因为时间是以 1970 年 1 月 1 日起始,不断累加+1得到的数值,18075 代表的是哪一天呢?可以使用如下命令进行换算:
[root@prometheus ~]# date -d "1970-01-01 18075 days"
Fri Jun 28 00:00:00 CST 2019
最小修改时间间隔
最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
密码有效期
经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。通过这个字段强制用户定期修改密码。
密码需要变更前的警告天数
与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。
该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
密码过期后的宽限天数
也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆。
比如此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。
账号失效时间
同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用
group文件详解
/ect/group 文件是组配置文件,用户组的所有信息存放在此文件中。
文件格式
[root@prometheus ~]# grep -i 'dba' /etc/group
dba:x:1001:mysql,oracle
[root@prometheus ~]# grep -i 'mysql' /etc/group
mysql:x:1000:
dba:x:1001:mysql,oracle
每一行代表一个用户组。创建 的mysql 用户,系统默认生成一个 mysql 用户组,在此可以看到,此用户组的 GID 为 1000,目前它仅作为 mysql 用户的初始组。
以 “:” 作为字段之间的分隔符,分为 4 个字段,每个字段对应的含义为: 组名 密码 GID 该用户组中的用户列表
组名
也就是是用户组的名称,有字母或数字构成。组名不能重复。
组密码
和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。 很少设置组密码。
组ID (GID)
系统就是通过 GID 来区分用户组的。这里的 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。
组中的附加用户
此字段列出每个群组包含的所有用户。如果该用户组是这个用户的初始组,则该用户不会写入这个字段,该字段显示的用户都是这个用户组的附加用户。
[root@prometheus ~]# grep -i 'mysql' /etc/group
mysql:x:1000:
dba:x:1001:mysql,oracle
第四个字段没有写入 mysql 用户,因为 mysql 组是 mysql 用户的初始组。
每个用户都可以加入多个附加组,但是只能属于一个初始组。一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。
gshadow文件(了解)
组信息存储在 /etc/group 文件中,而将组的密码信息存储在/etc/gshadow 文件中。
文件格式
[root@localhost ~]#cat /etc/gshadow
root:::
bin:::bin, daemon
daemon:::bin, daemon
...省略部分输出...
mysql:!::
每行代表一个组的密码信息,各行信息用 “:” 作为分隔符分为 4 个字段,每个字段的含义如下:
组名:加密密码:组管理员:组附加用户列表
组名
同 /etc/group 文件中的组名相对应。
组密码
对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员。
组管理员
从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢?
考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root 了。这个功能很少使用,因为可以使用sudo来操作。
组中的附加用户
该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。
login.defs文件(了解 )
login.defs文件用途
/etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。
该文件的用户默认配置对 root 用户无效。另外当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。
设置项
设置项 | 含义 |
---|---|
MAIL_DIR /var/spool/mail | 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 mysql 用户的邮箱是 /var/spool/mail/mysql。 |
PASS_MAX_DAYS 99999 | 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。 |
PASS_MIN_DAYS 0 | 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。 |
PASS_MIN_LEN 5 | 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。 |
PASS_WARN_AGE 7 | 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。 |
UID_MIN 500 | 指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。 |
UID_MAX 60000 | 指定用户最大的 UID 为 60000。 |
GID_MIN 500 | 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。 |
GID_MAX 60000 | 用户 GID 最大为 60000。 |
CREATE_HOME yes | 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。 |
UMASK 077 | 用户主目录的权限默认设置为 077。 |
USERGROUPS_ENAB yes | 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。 |
ENCRYPT_METHOD SHA512 | 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。 |
useradd命令
useradd: 用于创建新的用户
[root@localhost ~]#useradd [选项] 用户名
常用选项
选项 | 含义 |
---|---|
-u UID | 手工指定用户的 UID,注意 UID 的范围(不要小于 1000)。 |
-d 主目录 | 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限; |
-c 用户说明 | 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置; |
-g 组名 | 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。 |
-G 组名 | 指定用户的附加组。把用户加入其他组,使用附加组; |
-s shell | 手工指定用户的登录 Shell,默认是 /bin/bash; |
-e 曰期 | 指定用户的失效曰期,格式为 “YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段; |
-o | 允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0; |
-m | 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的; |
-r | 创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。 |
useradd mysql
系统已经设置了很多默认值,无需使用任何选项也可成功创建用户。
[root@zaishu ~]# useradd mysql
创建 mysql 用户。
这条会完成以下几项操作:
- 在 /etc/passwd 文件中创建一行与 mysql 用户相关的数据:
[root@zaishu ~]# grep -i 'mysql' /etc/passwd
mysql:x:1003:1003::/home/mysql:/bin/bash
可以看到,用户的 UID 是从 1000 开始计算的。同时默认指定了用户的家目录为 /home/mysql/,用户的登录 Shell 为 /bin/bash。
- 在 /etc/shadow 文件中新增了一行与 mysql 用户密码相关的数据:
[root@zaishu ~]# grep -i 'mysql' /etc/shadow
mysql:!!:18953:0:99999:7:::
用户还没有设置密码,所以密码字段是 “!!”,代表用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段,例如密码有效期有 99999 天,距离密码过期 7 天系统会提示用户“密码即将过期”等。
- 在 /etc/group 文件中创建一行与用户名一样的组:
[root@zaishu ~]# grep -i 'mysql' /etc/group
mysql:x:1003:
该群组会作为新建用户的初始组。
- 在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息:
[root@zaishu ~]# grep -i 'mysql' /etc/gshadow
mysql:!::
没有设定组密码,也没有组管理员。
- 默认创建用户的主目录和邮箱:
[root@zaishu ~]# ll -d /home/mysql/
drwx------ 3 mysql mysql 4096 1月6 00:19 /home/mysql/
[root@zaishu ~]#ll /var/spod/mail/mysql
-rw-rw---- 1 mysql mail 0 1月6 00:19 /var/spool/mail/mysql
useradd 命令创建用户的过程,是修改与用户相关的几个文件或目录.
useradd 执行选项
除了默认创建用户,在创建用户的时候,指定选项。
[root@zaishu ~]# groupadd mysql1 //创建组
[root@zaishu ~]# useradd -u 1100 -g mysql1 -G root -d /home/mysql1 -c "test user" -s /bin/bash mysql1
#建立mysql1用户,指定UID(1100 )、初始组(mysql1)、附加组(root)、家目录(/home/mysql1/)、用户说明(test user)和用户登录Shell(/bin/bash)
[root@zaishu ~]# grep 'mysql1' /etc/passwd
mysql1:x:1100:1004:test user:/home/mysql1:/bin/bash
#用户的UID、初始组、用户说明、家目录和登录Shell都和命令手工指定的一致
[root@zaishu ~]# grep 'mysql1' /etc/shadow
mysql1:!!:18953:0:99999:7:::
#mysql1用户还没有设定密码
[root@zaishu ~]# grep 'mysql1' /etc/group
root:x:0:mysql1
mysql1:x:1004:
#mysql1用户加入了root组,root组是mysql1用户的附加组
#GID为1004的组是mysql1组
[root@zaishu ~]# ll -d /home/mysql1
drwx------ 2 mysql1 mysql1 62 Nov 22 17:22 /home/mysql1
#自动建立家目录
手工创建用户
useradd 命令创建用户的过程,系统首先读取 /etc/login.defs 和 /etc/default/useradd,根据这两个配置文件中定义的规则添加用户,向 /etc/passwd、/etc/group、/etc/shadow、/etc/gshadow 文件中添加用户数据,接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录,最后复制 /etc/skel 目录中的所有文件到此主目录中,由此,一个新的用户就创建完成了。明白原理完全可以手动创建用户。
/etc/default/useradd 文件
创建用户的时候可以指定任何参数,通过默认值得到相关配置。默认值文件有两个,分别是 /etc/default/useradd 和 /etc/login.defs。上一段落讲过 /etc/login.defs,在这一段详细讲解 /etc/default/useradd 文件。
文件格式
首先,使用 Vim 命令查看 /etc/default/useradd 文件中包含哪些内容:
[root@zaishu ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
或者通过命令行查看
useradd -D
-D 选项指的就是查看新建用户的默认值。
[root@zaishu ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
设置项
参数 | 含义 |
---|---|
GR0UP=100 | 这个选项用于建立用户的默认组,在添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。但 CentOS 是在添加用户时会自动建立和用户名相同的组作为此用户的初始组。也就是说这个选项并不会生效。 |
Linux | 中默认用户组有两种机制:一种是私有用户组机制,会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是 100 的用户组作为所有新建用户的初始组。默认采用的是私有用户组机制。 |
HOME=/home | 指的是用户主目录的默认位置,所有新建用户的主目录默认都在 /home/下,刚刚新建的 mysql1 用户的主目录就为 /home/mysql1/。 |
INACTIVE=-1 | 指的是密码过期后的宽限天数,也就是 /etc/shadow 文件的第七个字段。这里默认值是 -1,代表所有新建立的用户密码永远不会失效。 |
EXPIRE= | 表示密码失效时间,也就是 /etc/shadow 文件的第八个字段。默认值是空,代表所有新建用户没有失效时间,永久有效。 |
SHELL=/bin/bash | 表示所有新建立的用户默认 Shell 都是 /bin/bash。 |
SKEL=/etc/skel | 在创建一个新用户后,你会发现,该用户主目录并不是空目录,而是有 .bash_profile、.bashrc 等文件,这些文件都是从 /etc/skel 目录中自动复制过来的。因此,更改 /etc/skel 目录下的内容就可以改变新建用户默认主目录中的配置文件信息。 |
CREATE_MAIL_SPOOL=yes | 指的是给新建用户建立邮箱,默认是创建。也就是说,对于所有的新建用户,系统都会新建一个邮箱,放在 /var/spool/mail/ 目录下,和用户名相同。例如,mysql1 的邮箱位于 /var/spool/mail/mysql1。 |
修改默认设置
修改方式有 2 种,一种Vim 文本编辑器修改,另一种使用useradd 命令修改
useradd -D [选项] 参数
用此命令修改 /etc/default/useradd 文件
选项 | 含义 |
---|---|
-b HOME | 设置所创建的主目录所在的默认目录,只需用目录名替换 HOME 即可,例如 useradd -D -b /gargae。 |
-e EXPIRE | 设置密码失效时间,EXPIRE 参数应使用 YYYY-MM-DD 格式,例如 useradd -D -e 2019-10-17。 |
-f INACTIVE | 设置密码过期的宽限天数,例如 useradd -D -f 7。 |
-g GROUP | 设置新用户所在的初始组,例如 useradd -D -g bear。 |
-s SHELL | 设置新用户的默认 shell,SHELL 必须是完整路径,例如 useradd -D -s /usr/bin/csh。 |
修改新用户默认 Shell 为 /bin/csh:
[root@zaishu ~]# useradd -D -s /bin/csh
[root@zaishu ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
其他一些默认值,例如修改用户默认的 UID、GID,以及密码的设置,对这些默认值需要在 /etc/login.defs 文件中修改
passwd命令
passwd 用于设置密码的命令 。
常用选项
[root@localhost ~]#passwd [选项] 用户名
选项|含义
|-S:|查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;
|-l:|暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 “!”,使密码失效。
|-u:|解锁用户,和 -l 选项相对应,也是只能 root 用户使用;
|–stdin:|可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
|-n 天数:|设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段;
|-x 天数:|设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段;
|-w 天数:|设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段;
|-i 日期:|设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。
修改密码
[root@zaishu~]#passwd mysql
Changing password for user mysql.
New password: // 直接输入新的口令
BAD PASSWORD: it is WAY too short // 口令太简单或过短的警告信息
Retype new password: // 再次验证输入的密码,再输入一次即可
passwd: all authentication tokens updated successfully. // 修改成功
[root@zaishu~]#passwd //修改当前用户密码
注意,普通用户只能使用 passwd 命令修改自己的密码,而不能修改其他用户的密码。
查看密码属性
[root@zaishu~]# passwd -S mysql
mysql PS 2021-01-06 0 99999 7 -1 (Password set, SHA512 crypt.)
用户名 密码 设定时间(2021 01 06) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1),密码已使用
修改密码属性
通过命令选项修改密码属性,例如#修改 mysql的密码,使其具有 60 天变更、10 天密码失效
[root@zaishu~]# passwd -x 60 -i 10 mysql
[root@zaishu~]# passwd -S mysql
mysql PS 2021-01-06 0 60 7 10 (Password set, SHA512 crypt.)
锁定 mysql 用户
[root@zaishu ~]# passwd -l mysql
Locking password for user mysql.
passwd: Success
#用"-S"选项査看状态,很清楚地提示密码已被锁定
[root@zaishu ~]# passwd -S mysql
mysql LK 2021-11-22 0 99999 7 -1 (Password locked.)
解锁mysql
锁定 用户后,用户就不能登录系统。需要解锁使用如下命令即可:
#解锁 mysql 用户
[root@zaishu ~]# passwd -u mysql
Unlocking password for user mysql.
passwd:Success
[root@localhost ~]# passwd -S mysql
mysql PS2021-11-22 0 99999 7 -1(Password set, SHA512 crypt.)
管道符修改密码
passwd 命令提供了 --stdin 选项,用于批量给用户设置初始密码。
[root@在数~]# echo "zaishu.cn" | passwd --stdin mysql
Changing password for user mysql.
passwd: all authentication tokens updated successfully.
usermod
Linux usermod命令:修改用户信息
常用选项
[root@zaishu ~]#usermod [选项] 用户名
选项 | 含义 |
---|---|
-c 用户说明 | 修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段; |
-d 主目录 | 修改用户的主目录,即修改 /etc/passwd 文件中目标用户信息的第 6 个字段,需要注意的是,主目录必须写绝对路径; |
-e 日期 | 修改用户的失效曰期,格式为 “YYYY-MM-DD”,即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段; |
-g 组名 | 修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段(GID); |
-u UID | 修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID); |
-G 组名 | 修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件; |
-l 用户名 | 修改用户名称; |
-L | 临时锁定用户(Lock); |
-U | 解锁用户(Unlock),和 -L 对应; |
-s shell: | 修改用户的登录 Shell,默认是 /bin/bash。 |
接下来,给大家分别讲解 usermod 命令几个选项的具体用法。
锁定用户
对用户的临时锁定,同 passwd 命令一样,在 /etc/passwd 文件目标用户的加密密码字段前添加 “!”,使密码失效
[root@zaishu ~]# usermod -L mysql1
[root@zaishu ~]# grep 'mysql1' /etc/shadow
mysql1:!$6$w4ctx1dF$ArGbKhuQ/.V9mZdzk.oT3smRYDWbrvWQ2DChGbRFa5RaqpW5ti399p/SQqXqInKvOk6r5bJ8/ApC.oSn1ZRyT1:18954:0:99999:7:::
解锁用户
取消了密码字段前的 “!”
[root@zaishu ~]# usermod -U mysql1
[root@zaishu ~]# grep ‘mysql1’ /etc/shadow
mysql1:
6
6
6w4ctx1dF$ArGbKhuQ/.V9mZdzk.oT3smRYDWbrvWQ2DChGbRFa5RaqpW5ti399p/SQqXqInKvOk6r5bJ8/ApC.oSn1ZRyT1:18954:0:99999:7:::
添加附加组
mysql1用户加入root组
[root@zaishu ~]# usermod -G root mysql1
[root@zaishu ~]# grep 'mysql1' /etc/group
root:x:0:mysql1 //mysql用户已经加入了root组
修改用户说明
[root@zaishu ~]# usermod -c 'test test' mysql1
[root@zaishu ~]# grep 'mysql1' /etc/passwd
mysql1:x:1100:1004:test test:/home/mysql1:/bin/bash //说明已经被修改
Linux chage
修改用户密码状态
chage 命令 显示更加详细的用户密码信息,并且和 passwd 命令一样,可以修改用户密码。chage 常和 passwd 批量初始化用户密码功能结合使用。
常用选项
[root@zaishu ~]#chage [选项] 用户名
选项 | 含义 |
---|---|
-l | 列出用户的详细密码状态; |
-d 日期 | 修改 /etc/shadow 文件中指定用户密码信息的第 3 个字段,也就是最后一次修改密码的日期,格式为 YYYY-MM-DD; |
-m 天数 | 修改密码最短保留的天数,也就是 /etc/shadow 文件中的第 4 个字段; |
-M 天数 | 修改密码的有效期,也就是 /etc/shadow 文件中的第 5 个字段; |
-W 天数 | 修改密码到期前的警告天数,也就是 /etc/shadow 文件中的第 6 个字段; |
-i 天数 | 修改密码过期后的宽限天数,也就是 /etc/shadow 文件中的第 7 个字段; |
-E 日期 | 修改账号失效日期,格式为 YYYY-MM-DD,也就是 /etc/shadow 文件中的第 8 个字段。 |
查看用户密码状态
[root@zaishu ~]# chage -l mysql1
Last password change : Nov 23, 2021
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
配置初始密码强制修改
chage 更大的用途是强制用户在第一次登录后,必须先修改密码,用新密码重新登陆系统
- 添加用户,配置初始密码
[root@zaishu ~]# useradd oracle
[root@zaishu ~]# echo 'oracle' | passwd --stdin oracle
Changing password for user oracle.
passwd: all authentication tokens updated successfully.
- 设置初始密码强制修改
chage命令设置账号密码创建日期为 1970 年 1 月 1 日(0 表示这一天),这样用户登陆后就必须修改密码。
[root@zaishu ~]# chage -d 0 oracle
- 验证
[mysql@zaishu ~]$ su - oracle
Password: //输入初始密码
You are required to change your password immediately (root enforced)
Changing password for oracle.
(current) UNIX password: //输入初始密码
New password: //设置新密码
Retype new password:
Last failed login: Tue Nov 23 09:59:10 CST 2021 on pts/2
userdel
用于删除用户,只有 root 用户可以使用。
常用选项
[root@zaishu ~]# userdel -r 用户名
-f:强制删除用户,即使用户当前已登录;
-r:删除用户,并且删除家目录和其它用户相关目录。
手工删除用户
用户基本信息:存储在 /etc/passwd 文件中;
用户密码信息:存储在 /etc/shadow 文件中;
用户群组基本信息:存储在 /etc/group 文件中;
用户群组信息:存储在 /etc/gshadow 文件中;
用户个人文件:主目录默认位于 /home/用户名,邮箱位于 /var/spool/mail/用户名。
userdel 命令的作用就是从以上文件中,删除与指定用户有关的数据信息。除了使用 userdel 命令删除用户,还可以手动方式删除。
手动删除指定用户的具体操作如下:
删除oracle用户
[mysql@zaishu ~]$ id oracle
uid=1101(oracle) gid=1101(oracle) groups=1101(oracle)
1. /etc/passwd
[root@zaishu ~]# sed -i /oracle/'d' /etc/passwd //删除oracle的行
2. /etc/shadow
[root@zaishu ~]# sed -i /oracle/'d' /etc/shadow //删除oracle的行
3. /etc/group
[root@zaishu ~]# sed -i /oracle/'d' /etc/group //删除oracle的行
4. /etc/gshadow
[root@zaishu ~]# sed -i /oracle/'d' /etc/gshadow //删除oracle的行
5. 删除目录
[root@zaishu ~]# rm -rf /var/spool/mail/oracle #删除用户邮箱
[root@zaishu ~]# rm -rf /home/oracle/ #删除用户的家目录
用户彻底删除,可再重新新建用户mysql。
id命令
查看用户的UID和GID。id 命令可以查询用户UID、GID 和附加组的信息。
[root@localhost ~]# id 用户名
[root@localhost ~]# id mysql
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql)
#能看到uid(用户ID)、gid(初始组ID), groups是用户所在所有组
[root@localhost ~]# usermod -G root mysql
#把用户加入root组
[root@localhost ~]# id mysql
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql),0(root)
#大家发现root组中加入了mysql用户的附加组信息
su
su 是用户切换命令,注意从 root 用户切换至其他用户,不需要输入密码切换。
选项
[root@localhost ~]# su [选项] 用户名
选项 | 含义 |
---|---|
- | 当前用户切换为指定用户身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),su - 不加用户名,会切换为 root 用户。 |
-l | 同 - 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。 |
-p / -m | 表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。 |
-c 命令 | 仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。 |
最常见切换形式
[mysql@localhost ~]$ su -root //代表连带环境变量一起切换,不能省略
密码:
仅执行命令
[mysql@localhost ~]$ whoami
mysql
[mysql@localhost ~]$ su - -c "useradd user1" root
密码:
#不切换成root,但是用root执行useradd命令添加user1用户
[mysql@localhost ~]$ whoami
mysql
#我还是mysql
su 和 su - 的区别
使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。
- 切换到root用户
[mysql@zaishu ~]$ su root
密码:
<-输入root密码
#切换到root,但是没有切换环境变量。注意:普通用户切换到root需要密码
- 查看环境变量,还是mysql用户的环境变量
[root@zaishu ~]# env | grep mysql
#查看环境变量
USER=mysql
#用户名还是mysql,而不是root
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/mysql/bin
#命令査找的路径不包含超级用户路径
MAIL=/var/spool/mail/mysql
PWD=/home/mysql
LOGNAME=mysql
#邮箱、主目录、目前用户名还是mysql
可以看到,在不使用 su - 的情况下,虽然用户身份成功切换,但环境变量依旧用的是原用户的,切换并不完整。
whoami和who am i
whoami 命令和 who am i 命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名。
为地区分这 2 个命令的功能,举例如下:
举例示范
- 切换之前查看
[Zhang@localhost ~]$ whoami
Zhang
[Zhang@localhost ~]$ who am i
Zhang pts/0 2017-10-09 15:30 (:0.0)
- 切换用户
在此基础上,使用 su 命令切换到 root 用户下,再执行一遍上面的命令:
[Zhang@localhost ~] su - root
[root@localhost ~]$ whoami
root
[root@localhost ~]$ who am i
Zhang pts/0 2017-10-09 15:30 (:0.0)
在未切换用户身份之前,whoami 和 who am i 命令的输出是一样的,但使用 su 命令切换用户身份后,使用 whoami 命令打印的是切换后的用户名,而 who am i 命令打印的仍旧是登陆系统时所用的用户名。
实际用户和有效用户
使用 su 或者 sudo 命令切换用户身份,骗得过 whoami,但骗不过 who am i。要解释这背后的运行机制,需要搞清楚什么是实际用户(UID)和有效用户(EUID,即 Effective UID)。
所谓实际用户,指的是登陆 Linux 系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的;而有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su 或者 sudo 命令进行任意切换的。
一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,它们会出现差异。
应用场景
那么,whoami 和 who am i通常应用在哪些场景中呢?通常,对那些经常需要切换用户的系统管理员来说,经常需要明确当前使用的是什么身份;另外,对于某些 shell 脚本,或者需要特别的用户才能执行,这时就需要利用 whoami 命令来搞清楚执行它的用户是谁;甚至还有一些 shell 脚本,一定要某个特别用户才能执行,即便使用 su 或者 sudo 命令切换到此身份都不行,此时就需要利用 who am i 来确认。
groupadd
添加用户组
选项
[root@zaishu ~]# groupadd [选项] 组名
选项:
-g GID:指定组 ID;
-r:创建系统群组。
[root@zaishu ~]# groupadd group1
#添加group1组
[root@zaishu ~]# grep "group1" /etc/group
/etc/group:group1:x:1005:
/etc/gshadow:group1:!::
groupmod
修改用户组
选项
[root@localhost ~]# groupmod [选项] 组名
选项:
-g GID:修改组 ID;
-n 新组名:修改组名;
例子:
[root@localhost ~]# groupmod -n testgrp group1
#把组名group1修改为testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:1005:
#注意GID还是1005,但是组名已经改变
groupdel
刪除用户组
[root@localhost ~]#groupdel 组名
使用 groupdel 命令删除群组,其实就是删除 /etc/group 文件和 /etc/gshadow 文件中有关目标群组的数据信息。
[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
/etc/group:group1:x:505:
/etc/gshadow:group1:!::
[root@localhost ~]#groupdel group1
[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
[root@localhost ~]#
如果有群组还是某用户的初始群组,无法使用 groupdel 命令删除。
[root@localhost ~]# useradd temp
#运行如下命令temp 用户建立的同时,还创建了 temp 群组,且将其作为 temp用户的初始组
[root@localhost ~]# grep "temp" /etc/passwd /etc/group /etc/gshadow
/etc/passwd:temp:x:505:505::/home/temp:/bin/bash
/etc/group:temp:x:505:
/etc/gshadow:temp:!::
#下面尝试删除 temp 群组
[root@localhost ~]# groupdel temp
groupdel:cannot remove the primary group of user 'temp'
如果要删除初始组,要么修改 用户的 GID,将其初始组改为其他群组,要么先删除 用户。
gpasswd
可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。
选项
[root@zaishu ~]# gpasswd 选项 组名
设置项 | 含义 |
---|---|
选项为空时 | 表示给群组设置密码。 |
-A u1,… | 将群组的控制权交给 u1,… 等用户管理,设置 u1,… 等用户为群组的管理员 |
-M u1,… | 将 u1,… 加入到此群组中,仅 root 用户可用。 |
-r | 移除群组的密码 |
-R | 让群组的密码失效 |
-a user | 将 user 用户加入到群组中。 |
-d user | 将 user 用户从群组中移除。 |
示范
1. 设置组的管理员
[root@prometheus ~]# groupadd grp1 //创建grp1
[root@prometheus ~]# gpasswd grp1 // 设置组密码
Changing the password for group grp1
New Password:
Re-enter new password:
[root@prometheus ~]# gpasswd -A mysql grp1
// 添加组grp1的管理员
[root@prometheus ~]# grep 'grp' /etc/gshadow
//查看组密码文件,可看到mysql 用户即为 grp1组的管理员。
grp1:$6$cfXLu/RIT3ZzR1l$em3s7eJiTlI9rhr8CL.7LInPaD0C/oQY2895eSrvjLNEfgnAnijb3/zSvHnsydGLjNq0x7o2XbJSmnABp4Kn/.:mysql:
2. 添加组成员(用添加的组管理员)
使用mysql将 oracle加入grp1组。
[root@prometheus ~]# su - mysql
[mysql@prometheus ~]# gpasswd -a oracle grp1
Adding user oracle to group grp1
[mysql@prometheus ~]# grep 'grp1' /etc/group
grp1:x:1004:oracle
使用root用户的usermod -G 命令也可以将用户加入群组。
newgrp
含义和用途
每个用户可以属于一个初始组,和多个附加组。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是初始组(主组),用户属于多个用户组,可以使用命令 newgrp 切换初始组。
newgrp的用途是切换用户的有效组,可以从用户的附加组中选择一个组,作为用户的初始组。此命令的基本格式如下:
[root@localhost ~]# newgrp 组名
示例
- 创建组
[root@zaishu ~]# groupadd group1
[root@zaishu ~]# groupadd group2
[root@zaishu ~]# groupadd group3
- 创建用户
创建用户 user1,初始组为 group1,附加组为 group2 和 group3
[root@localhost ~]# useradd -g group1 -G group2,group3 user1
[root@localhost ~]# more /etc/group | grep user1
group2:x:501:user1
group3:x:1005:user1
- newgrp
使用 newgrp 命令切换 user1 的初始组
[user1@localhost ~]# mkdir user1_doc
[user1@localhost ~]# newgrp group2
[user1@localhost ~]# mkdir user2_doc
[user1@localhost ~]# newgrp group3
[user1@localhost ~]# mkdir user3_doc
- 查看文件信息
通过使用 newgrp 命令切换用户的初始组,所创建的文件各自属于不同的群组。
[user1@localhost ~]# ll
total 12
drwxr-xr-x 2 user1 group1 4096 Oct 24 01:18 user1_doc
drwxr-xr-x 2 user1 group2 4096 Oct 24 01:18 user2_doc
drwxr-xr-x 2 user1 group3 4096 Oct 24 01:19 user3_doc
newgrp底层实现原理
newgrp 命令每一次切换用户的初始组,该用户都会以另外一个 shell登陆,在新 shell 上登陆的该用户,其初始组改变了而已。
每次使用 newgrp 命令,都会切换到一个新的进程。
[user1@localhost ~]$
[user1@localhost ~]$ echo $$
1181
[user1@localhost ~]$ newgrp group2
[user1@localhost~]$ echo $$
1200
使用 newgrp 命令切换用户初始组的整个过程,如图 所示:
每一次使用 newgrp 切换用户的初始组,用户都会切换到一个新的子 shell 中,user1 用户的初始组从最初的 group1,切换成了 group2,再切换成 group3。
回到原本的环境,需要通过 exit 命令回退到当前进程的父进程。
总结
本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义和使用,对常见的用户相关命令如useradd,usermod,chage,userdel,id,su,whoami,who am i,groupadd,groupmod,groupdel,gpasswd,newgrp等命令的使用方法和实际演练
友情链接
目录 | 章节 |
---|---|
版本说明 | 版本说明 |
安装MySQL规范 | 1 安装方式 2 安装用户 3 目录规范 |
MySQL 5.7 安装部署 | 1 操作系统配置 2 创建用户 3 创建目录 4 安装 5 配置文件 6 安装依赖包 7 配置环境变量 8 初始化数据库 9 重置密码 |
MySQL8 安装 | MySQL8 安装 |
源码安装 | 1 安装依赖包 2 生成源码包 3 创建用户 4 编译安装 5 配置数据库 6 连接mysql |
多实例部署及注意事项 | 1 多实例概念 2 多实例安装 3 mysqld_multi(多实例第二种安装方式) |
目录 | 章节 |
---|---|
生产中MySQL启动方式 | 1、 启动原理 2、参数文件默认位置及优先级 3、 以server方式启动 4、 mysqld_safe方式 5、 mysqld 方式 6、 systemctl 方式 |
关库 | 1、相关参数innodb_fast_shutdown 2、相关参数innodb_force_recovery 3、关闭mysql多种方式 |
常见MySQL启动失败案例 | 1.、目录权限 2、参数问题 3、配置文件 4、端口占用 5、误删二进制文件 6、undo表空间异常 7、binlog缓冲异常 |
MySQL启动失败排查方法 | MySQL启动失败排查方法 |
连接MySQL数据库的方式 | 连接MySQL数据库的方式 |
MySQL数据库用户安全策略 | 1、初始化数据库 2、修改密码 3、删除无用的用户 4、mysql_secure_installation |
找回丢失的用户密码 | 找回丢失的用户密码 |
目录 | 章节 |
---|---|
MySQL字符集和校验规则 | MySQL字符集和校验规则 |
查看字符集方法 | 1、查看mysql支持的字符集 2、查看字符集的校对规则 3、查看当前数据库的字符集 4、查看当前数据库的校对规则 |
MySQL字符集设置 | 1、字符集设置层级关系 2、设置MySQL服务器级别字符集 3、设置创建对象的字符集 |
字符集案例 | 1、常用字符集每个汉字占用字节多少 2、大小案例 |
插入中文乱码解决 | 插入中文乱码解决 |
数据库常见字符集及如何选择字符集 | 数据库常见字符集及如何选择字符集 |
生产中如何彻底避免出现乱码 | 生产中如何彻底避免出现乱码 |
目录 | 章节 |
---|---|
访问控制 | 1、连接验证(阶段一) 2、允许的连接 3、连接优先级 4、请求验证(阶段二) |
用户管理 | 1、新增用户 2、修改用户 3、删除用户 4、查看用户 |
密码管理 | 1、密码修改 2、密码过期设置 3、set password 4、密码过期策略 5、密码插件 |
MySQL用户权限管理 | 1、权限粒度 2、显示账户权限 3、显示账户非权限属性 4、库级权限 5、表级权限 6、列级权限 7、权限回收 |
资源限制 | 1、用户创建指定配额 2、修改配额 |
MySQL用户权限案例 | 1、断掉已清理的用户 2、忘记密码 3、如何禁止一个ip段的某个用户登录 4、创建开发账号 5、创建复制账号 6、创建管理员账号 |
目录 | 章节 |
---|---|
缓冲池 | 1、默认引擎 2、设置缓冲池大小 3、优化缓冲池 4、管理缓冲池 5、数据页类型 |
线程 | 1、IO线程 2、主线程 |
index page | index page |
insert buffer page | insert buffer page |
重做日志 | 重做日志 |
回滚日志 | 回滚日志 |
checkpoint,刷写脏页check point | checkpoint |
关键特性 | 1、插入缓冲 2、数据写入可靠性提升技术-doublewrite 3、自适应哈希索引-AHI |
innodb预读预写技术 | 预读写 |
目录 | 章节 |
---|---|
参数和配置文件 | 1、文件位置 2、查找参数 3、参数类型 4、参数修改 5、示例一 6、示例二 7、注意事项 |
错误日志文件 | 错误日志 |
通用日志 | 通用日志 |
慢查询日志 | 慢日志 |
binlog | 1、记录什么 2、用途 3、开启和参数配置 4、日志查看 5、日志刷新 6、删除日志 7、日志分析(mysqlbinlog) 8、利用二进制日志文件恢复误删的表 |
InnoDB存储引擎表空间文件 | 表空间文件 |
主从同步相关文件 | 主从同步文件 |
套接字文件 | 套接字文件 |
pid 文件 | pid 文件 |
redo log | 1、redo初识 2、日志组 3、与oracle redo的区别 4、相关参数 5、和binlog的区别 6、redo 缓冲区(innodb_flush_log_at_trx_commit) |
InnoDB存储引擎逻辑结构 | 1、表空间 2、段 3、区 4、页 |
表碎片清理 | 1、判断是否有碎片 2、整理碎片 |
表空间文件迁移 | 1、需求 2、操作 |
目录 | 章节 |
---|---|
常用语句 | 1、导入数据 2、库操作 3、表操作 4、数据操作 5、use性能影响 6、delete、truncate、drop的区别 7、SQL语句分类 |
数据类型与性能 | 1、整型 2、浮点型 3、字符串类型 4、日期类型 |
MySQL约束 | 1、unsigned/signed 2、not null 3、count(*) 为什么慢 4、default 5、unique 6、 auto_increment 7、primary key |
SQL编程高级 | 1、查询Syntax 2、查询列 3、where子句 4、group by … having子句 5、order by子句 6、limit子句(分页) 7、聚合函数 8、合并查询 9、多表查询 10、子查询 |
表的元数据库管理 | 1、统计应用库哪些表没有使用innodb存储引擎 2、如何查看表中是否有大对象 3、统计数据库大小 4、统计表的大小 |
目录 | 章节 |
---|---|
MySQL索引与二分查找法 | 1、什么是索引 2、索引的优缺点 3、索引的最大长度 4、二分查找法:折半查找法 5、mysql一张表存多少数据后,索引性能就会下降? |
剖析b+tree数据结构 | 1、B和B+树的区别 2、索引树高度 3、非叶子节点 4、指针 5、叶子节点 6、双向指针 7、b+tree插入操作 8、b+tree删除操作 |
相辅相成的聚集索引和辅助索引 | 1、聚集索引 2、聚集索引特点 3、聚集索引的优势 4、辅助索引 |
覆盖索引与回表查询 | 1、回表查询 2、覆盖索引 |
创建高性能的主键索引 | 1、主键索引创建的原则 2、主键索引的特点 3、为什么建议使用自增列作为主键 |
唯一索引与普通索引的性能差距 | 1、唯一索引特点 2、普通索引特点 3、唯一索引与普通索引的性能差距 |
前缀索引带来的性能影响 | 1、作用 2、坏处 |
如何使用联合索引 | 1、什么是联合索引 2、创建原则 3、排序 |
Online DDL影响数据库的性能和并发 | 1、5.6版本之前 2、新版本 3、online ddl语法 4、相关参数 5、示例 6、影响 |
pt-ocs原理与应用 | 1、安装pt-osc 2、pt-osc语法 3、案例 4、pt-osc原理 |
生产中索引的管理 | 1、建表时创建索引 2、建表后创建索引 3、查看索引 |
SQL语句无法使用索引的情况 | 1、where条件 2、联合索引 3、联表查询 4、其他情况 |
目录 | 章节 |
---|---|
最常用的STATISTICS和TABLES | 1、STATISTICS:用于存放索引的信息 2、TABLES:用于存放库表的元数据信息 |
判断索引创建是否合理 | 1、选择性 2、索引创建的建议 |
检查联合索引创建是否合理 | 1、联合索引创建是否合理 2、有了联合索引(a,b),还需要单独创建a索引吗? |
如何查找冗余索引 | 查找冗余索引 |
查找产生额外排序的sql语句 | 额外排序的sql语句 |
查找产生临时表的sql语句 | 临时表的sql语句 |
全表扫描的sql语句 | 全表扫描的sql语句 |
统计无用的索引 | 无用的索引 |
索引统计信息 | 1、存储索引统计信息 2、如何查看索引统计信息 |
目录 | 章节 |
---|---|
简单嵌套查询算法-simple nested-loop join | simple nested-loop join |
基于索引的嵌套查询算法-index nested-loop join | index nested-loop join |
基于块的嵌套查询算法- block nested-loop join | block nested-loop join |
Multi-Range Read | MRR |
bached key access join | BKA |
mysql三层体系结构 | 体系结构 |
Index Condition Pushdown | 索引条件下推 |
一条查询SQL语句是怎样运行的 | 查询SQL语句 |
一条更新SQL语句是怎样运行的 | 更新SQL语句 |
MySQL长连接与短连接的选择 | 1、相关参数 2、断开连接 |
执行计划explain | 1、语法 2、执行计划解析 |
目录 | 章节 |
---|---|
MySQL查询优化技术 | 概览 |
子查询优化 | 1、优化器自动优化 2、优化措施:子查询合并 3、优化措施:子查询上拉技术 |
外连接消除 | 外连接消除 |
生产环境不使用join联表查询 | 不使用join |
group by分组优化 | 1、group by执行流程 2、为什么group by要创建临时表 |
order by排序优化 | 排序优化 |
MySQL性能抖动问题 | 性能抖动问题 |
count(*)优化 | count(*)优化 |
磁盘性能基准测试 | 1、安装sysbench 2、生成文件 3、测试文件io 4、清除文件 |
MySQL基准测试 | 1、生成数据 2、测试(读) 3、测试(写) 4、清理数据 |
目录 | 章节 |
---|---|
认识事务 | 认识事务 |
事务控制语句 | 1、开启事务 2、事务提交 3、事务回滚 |
事务的实现方式 | 1、原子性 2、一致性 3、隔离性 4、持久性 |
purge thread线程 | purge thread线程 |
事务统计QPS与TPS | 1、QPS 2、TPS |
事务隔离级别 | 1、隔离级别 2、查看隔离级别 3、设置隔离级别 4、不同隔离级别下会产生什么隔离效果 |
事务组提交group commit | 组提交 |
事务两阶段提交 | 两阶段提交 |
MVCC多版本并发控制 | 1、MVCC原理 2、MVCC案例 |
目录 | 章节 |
---|---|
认识锁 | 1、锁的作用 2、加锁的过程 3、锁对象:事务 |
innodb行锁 | 1、行锁类型 2、共享锁(S锁) 3、排他锁(X锁) |
索引对行锁粒度的影响 | 1、行锁粒度有哪些 2、在RC隔离级别下不同索引产生的锁的范围 3、RR隔离级别下不同索引产生锁的范围 |
FTWRL全局读锁 | FTWRL全局读锁 |
innodb表锁 | innodb表锁 |
innodb意向锁与MDL锁 | 1、意向锁 2、意向锁作用 3、意向锁冲突情况 4、MDL锁 |
自增锁 | 自增锁 |
插入意向锁 | 插入意向锁 |
死锁 | 1、什么是死锁 2、相关参数 3、避免死锁 4、锁的状态 |
两阶段锁协议 | 两阶段锁协议 |
目录 | 章节 |
---|---|
1. 系统状态 | show status |
2. 慢查询 | 2.1 慢查询开启 2.2 简单示例 2.3 数据准备 |
3. mysqldumpslow | 3.1 语法 3.2 常见用法 |
4. pt-query-digest | 4.1 安装 4.2 语法选项 4.3 报告解读 4.4 用法示例 |
5. 优化工具(soar) | 5.1 安装配置 5.2 添加数据库 5.3 语句优化 |
15、备份恢复原理和实战_逻辑备份_物理备份_金融行业备份还原脚本
目录 | 章节 |
---|---|
1.生产中备份方式 | 1.1 物理备份与逻辑备份 1.2 联机与脱机备份 1.3 完整备份与增量备份 1.4 常用命令 |
2.mysqldump备份 | 2.1 相关参数 2.2 备份所有数据库 2.3 备份指定数据库 2.4 备份指定表 2.6 只导出结构 2.7 只导出数据 2.8 --tab(生成文本,类似load) 2.8 mysqldump原理 2.9 binlog异步备份 2.10 利用mysqldump全备及binlog恢复数据 |
3.xtrabackup | 3.1 Xtrabackup安装 3.2 原理 3.2 备份过程 3.4 恢复原理 3.3 相关参数 3.4 xtrabackup相关文件 3.5 备份示例 3.6 还原示例 |
4.binlog备份和恢复(数据库恢复) | 4.1 找到恢复时间点 4.2 增量恢复 |
5. 生产环境的备份恢复实战 | 5.1 实施部署 5.1.1 环境清单 5.1.2 备份目的 5.1.3 备份说明 5.1.4 实施步骤 5.1.5 全备脚本 5.1.6 差异备份脚本 5.2 实施部署备份还原 5.2.1 Xtraback还原全量/差异备份 5.2.2 故障点数据恢复 5.2.3 增量恢复 |
16、主从复制,gtid,并行复制_半同步复制_实操案例_常用命令_故障处理
目录 | 章节 |
---|---|
1.认识主从复制 | 1.1 主从复制原理深入讲解 1.2 主从复制相关参数 1.3.主从复制架构部署 1.4从库状态详解 1.5 .过滤复制 |
2 .gtid复制 | 2.1 什么是GTID? 2.2 GTID主从配置 2.5 gtid维护 2.4 GTID的特点 2.3 工作原理 2.4 gtid相关状态行和变量 |
3. 并行复制 | 3.1 延迟的原因 3.2 并行复制设置 3.3 查看并行复制 |
4. 增强半同步复制 | 4.1 异步复制 4.2 半同步复制 4.3 增强半同步复制 4.4 配置增强半同步 |
5. 案例 | 5.1 主库删除操作导致sql线程关闭案例 5.2 主从复制中断解决方案及案例 5.3 延迟复制 5.4 主库drop误操作利用延迟复制恢复案例 |
6 常用命令 | 6.1 启动线程 6.2 关闭线程 6.3 查看 6.4 重置 6.5 主从数据一致性校验 |
目录 | 章节 |
---|---|
MHA | 介绍 |
架构和相关组件 | 架构和相关组件 |
工作流程 | 工作流程 |
MHA高可用架构部署 | 1、环境准备 2、软件安装 3、创建软链接 4、配置各节点互信 5、节点免密验证 6、mha管理用户 7、配置文件 8、状态检查 9、开启MHA |
主库宕机故障模拟及处理 | 主库宕机故障模拟及处理 |
MHA VIP自动切换 | VIP自动切换 |
MHA主从数据自动补足 | MHA主从数据自动补足 |
目录 | 章节 |
---|---|
Atlas读写分离高性能架构 | 介绍 |
安装配置 | 安装配置 |
配置注解 | 配置注解 |
启动和关闭 | 启动和关闭 |
读写分离架构应用 | 读写分离架构应用 |
创建应用用户 | 创建应用用户 |
Atlas在线管理 | Atlas在线管理 |
读写分离避坑指南 | 读写分离避坑指南 |
目录 | 章节 |
---|---|
1.MyCAT分布式架构入门及双主架构 | 1.1 主从架构 1.2 MyCAT安装 1.3 启动和连接 1.4 配置文件介绍 |
2.MyCAT读写分离架构 | 2.1 架构说明 2.2 创建用户 2.3 schema.xml 2.4 连接说明 2.5 读写测试 2.6 当前是单节点 |
3.MyCAT高可用读写分离架构 | 3.1 架构说明 3.3 schema.xml(配置) 3.4 文件详解 3.4.1 schema标签 3.4.2 table标签 3.4.3 dataNode标签 3.4.4 dataHost 3.4 读写测试 3.5 故障转移 |
4.MyCAT垂直分表 | 4.1 架构 4.2 新建表 4.3 配置mycat 4.4 验证 |
5 MyCAT水平分表-范围分片 | 5.1 新建表 5.2 schema.xml 5.2 rule.xml 5.3 autopartition-long.txt 5.4 验证 |
6. MyCAT水平分表-取模分片 | 取模分片 |
7. MyCAT水平分表-枚举分片 | 枚举分片 |
8. MyCAT全局表与ER表 | 全局与ER表 |
8.1 全局表 | 8.1.1 特性 8.1.2 建表 8.1.3 配置 8.1.4 验证 8.1.5 分析总结(执行计划) |
8.2 ER表 | 8.2.1 特性 8.2.2 建表 8.2.3 配置 8.2.4 测试验证,子表是否跟随父表记录分片 8.2.5 分析总结(执行计划) |
目录 | 章节 |
---|---|
1. sysbench | 1.1 用途 1.2 安装 1.3 版本 1.4 查看帮助 1.5 测试过程阶段 |
2 CPU 性能测试 | 2.1 测试原理 2.2 查看帮助 2.3 测试 |
3. 内存性能测试 | 3.1 查看帮助信息 3.2 测试过程 |
4.磁盘性能基准测试 | 4.1 查看帮助 4.2 生成文件(prepare) 4.3 测试文件io(run) 4.4 结果分析 4.5 清除文件(cleanup) |
5. 线程测试 | 5.1 查看帮助信息 5.2 测试过程 |
6. MySQL基准测试 | 6.1 语法参数 6.2 生成数据 6.3 测试(读) 6.4 测试(写) 6.5 清理数据 |