用户管理
用户信息在哪里
默认数据库有四个:
- information_schema
- mysql
- performance_schema
- sys
其中 “mysql” 数据库有一个表名为user,存储着用户信息。
通常默认有四个用户:
root ,mysql.infoschema,mysql.session,mysql.sys 。
ubuntu 或 debian 用户还会有个maint用户。
debian-sys-maint中Debian系统对MySQL维护用的,可以理解为通过系统的某个“非常规”程序对Mysql进行备份恢复等行为时,改程序所使用的用来登录Mysql的账户。
具体作用是重启及运行mysql服务,不过有一个安全问题:该用户的权限和ROOT是一样的,并且密码可以在/etc某个文件中找到,这需要对账户进行一些限制。
root 的权限最高,顾名思义为“根”,拥有最高权限,创建其他用户,它不能没有。
user 的联合主键
用户信息里两个列很关键:host 和 user。
- host : 主机,用来区分用户的连接段。
- user : 用户名,区分用户
user 表的主键有两个:host和user,即联合主键。
所以不同连接段允许有重名用户出现,就像不同作用域能够有重名变量一样。
创建、修改、删除
创建用户指令:
1 | CREATE USER 用户名 [@主机名称] [IDENTIFIED BY '密码'] #[]为可选 |
tips:
- 该语句可以同时创建多个用户。
- 用户名参数由用户和主机名构成。
- 需要有CREATE权限,新账户什么权限都没有。
修改
1 | UPDATE mysql.user set user = "wang5" where user = "li4" [and host = 'xxx'] |
修改用户就是直接操作 user 表。
修改完需要``fs;
删除
两个方法:DROP 和 DELETE (user 表里删)。
DROP
1
2
3
4DROP USER user,[user].... #user即用户名参数,可包含 host
DROP USER 'li4'; # 默认删除host为%的用户
DROP USER 'li4'@'localhost';DELETE
1
2
3
4DELETE FROM mysql.user WHERE Host='hostname' AND User = 'username';
#必须有 host ,联合主键的两个字段,才能唯一确定一条记录。
FLUSH PRIVILEGES;
#立即生效。DELETE 删除会有系统信息残留。DROP 指令能同时删去 mysql.user 表和 mysql.db 表内容。
设置当前用户密码
1. 使用ALTER USER命令来修改当前用户密码
1 | ALTER USER USER() IDENTIFIED BY 'new_password'; |
2. 使用SET语句来修改当前用户密码
1 | SET PASSWORD='new_password'; |
修改其他用户密码
1. 使用ALTER语句来修改普通用户的密码
1 | ALTER USER user [IDENTIFIED BY '新密码'] |
2. 使用SET命令来修改普通用户的密码
1 | SET PASSWORD FOR 'username'@'hostname'='new_password'; |
密码过期关键词 EXPIRE
你可以通过ALTER和CREATE 时 手动设置用户密码过期,这样用户可以登入数据库,但无法查询。除非重新设置密码。
你也可以修改系统全局变量
Default password lifetime。改变量默认为0,即不过期。设置为N代表密码生存期,N天后密码必须修改,否则将自动过期。
密码重用关键词 INTERVAL 、REUSE
分两类:时间和更改数量
- 时间(周期):修改后密码不能用最近N天时间使用过的密码相同。
- 更改数量 :修改后密码与最近N个密码不能相同。
系统变量:password_history , password_reuse_interval
权限管理
1 | show privileges; #查看权限 |
CREATE和DROP权限,可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的数据库。SELECT、INSERT、UPDATE和DELETE权限允许在一个数据库现有的表上实施操作。SELECT权限只有在它们真正从一个表中检索行时才被用到。INDEX权限允许创建或删除索引,INDEX适用于已有的表。如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义。ALTER权限可以使用ALTER TABLE来更改表的结构和重新命名表。CREATE ROUTINE权限用来创建保存的程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序,EXECUTE权限用来执行保存的程序。GRANT权限允许授权给其他用户,可用于数据库、表和保存的程序。FILE权限使用户可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。
授予权限
1 | GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’]; |
- 该权限如果发现没有该用户,则会直接新建一个用户。
- 给li4用户用本地命令行方式,授予atguigudb这个库下的所有表的插删改查的权限。
1 | GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost; |
- 授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包括grant的权限
1 | GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123'; |
授予权限的原则
权限控制主要是出于安全因素,因此需要遵循以下几个
经验原则:1、只授予能
满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。2、创建用户的时候
限制用户的登录主机,一般是限制成指定IP或者内网IP段。3、为每个用户
设置满足密码复杂度的密码。4、
定期清理不需要的用户,回收权限或者删除用户。
查看权限
- 查看当前用户权限
1 | SHOW GRANTS; |
- 查看某用户的全局权限
1 | SHOW GRANTS FOR 'user'@'主机地址'; |
收回权限
注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。
- 收回权限命令
1 | REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址; |
- 举例
1 | #收回全库全表的所有权限 |
- 注意:
须用户重新登录后才能生效
权限表
user表
user表是MySQL中最重要的一个权限表, 记录用户账号和权限信息 ,有49个字段。
这些字段可分为四类:
范围列:
==host== : 表示连接类型
% 表示所有远程通过 TCP方式的连接
IP 地址 如 (192.168.1.2、127.0.0.1) 通过制定ip地址进行的TCP方式的连接
机器名 通过制定网络中的机器名进行的TCP方式的连接
::1 IPv6的本地ip地址,等同于IPv4的 127.0.0.1
localhost 本地方式通过命令行方式的连接 ,比如mysql -u xxx -p xxx 方式的连接。
==user== : 表示用户名,同一用户通过不同方式链接的权限是不一样的。
==password== :mysql 5.7 及之后版本的密码保存到 authentication_string 字段中不再使用password 字
段。
权限列:是否拥有一些特定权限
安全列 :加密,表示用户,验证用户身份。
资源控制列:限制用户使用的资源。共4个字段。
①max_questions,用户每小时允许执行的查询操作次数;
②max_updates,用户每小时允许执行的更新操作次数;
③max_connections,用户每小时允许执行的连接操作次数;
④max_user_connections,用户允许同时建立的连接次数。
查看字段:
1 | DESC mysql.user; |
查看用户, 以列的方式显示数据:
1 | SELECT * FROM mysql.user \G; |
查询特定字段:
1 | SELECT host,user,authentication_string,select_priv,insert_priv,drop_priv |
db表
- 用户列
db表用户列有3个字段,分别是Host、User、Db。这3个字段分别表示主机名、用户名和数据库名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。
- 权限列
Create_routine_priv和Alter_routine_priv这两个字段决定用户是否具有创建和修改存储过程的权限。
结构查看:
1 | DESCRIBE mysql.db; |
tables_priv 和 column_priv 表
tables_priv表:对表设置操作权限columns_priv表 :对表的某一列设置权限 。
procs_priv 表
procs_priv 表可以对存储过程和存储函数设置操作权限
上面几个表都在 database → mysql 里,想看自己 DESC 去。
角色
角色的创建、删除和权限操作
创建角色
1 | CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]... |
角色名称的命名规则和用户名类似。如果host_name省略,默认为%,role_name不可省略,不可为空。
给角色赋予权限
1 | GRANT privileges ON table_name TO 'role_name'[@'host_name']; |
上述语句中privileges代表权限的名称,多个权限以逗号隔开。可使用SHOW语句查询权限名称
1 | SHOW PRIVILEGES\G |
查看角色的权限
1 | SHOW GRANTS FOR 'role_name'; |
只要你创建了一个角色,系统就会自动给你一个“USAGE”权限,意思是连接登录数据库的权限。
回收角色的权限
1 | REVOKE privileges ON tablename FROM 'rolename'; |
删除角色
1 | DROP ROLE role [,role2]... |
注意,如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限。
角色和用户
给用户赋予角色
角色创建并授权后,要赋给用户并处于激活状态才能发挥作用。
1 | GRANT role [,role2,...] TO user [,user2,...]; |
查询当前已激活的角色
1 | SELECT CURRENT_ROLE(); |
激活角色
方式1:使用set default role 命令激活角色
1 | SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost'; |
方式2:将activate_all_roles_on_login设置为ON
1 | SET GLOBAL activate_all_roles_on_login=ON; |
这条 SQL 语句的意思是,对所有角色永久激活。
撤销用户的角色
1 | REVOKE role FROM user; |
设置强制角色(mandatory role)
方式1:服务启动前设置
1 | [mysqld] |
方式2:运行时设置
1 | SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后仍然有效 |
配置文件
**文件里会定义许多组(用 [ ] 括起来),组下边可以定义启动选项。**通常称组为标签。
1 | [server] |
配置文件中不同选项组是给不同的启动命令使用的。
有两个选项组比较特别:
- [server]组的启动选项作用于所有服务器程序
- [client]组的启动选项作用于所有客户端程序。
像
mysql这个启动命令,就会调用 [mysql] 和 [client] 两个组
tips:
[mysql-‘版本号’]:只适用于特定版本的专用选项组
两个组里出现重复配置项,以最后一个为准。
一个选项既出现在命令行,又出现在配置文件里,以命令行为准。
如 defaults-extra-file 和 defaults-file 本身就是为了指定配置文件路径的。