Mysql 8 user 授权常用操作

Mysql8 user 授权常用操作

1. 命令示例及说明

-- 创建用户,指定多个访问ip调用多次即可,密码可以一样也可以不一样。 
-- ip通配: 
--    localhost=127.0.0.1   
--    % 通配任意字符,只有%则表示所有网段访问,0.0.0.0
--    192.168.% 指 192.168.xxx.xxx 网段访问   
create user 'username'@'access host' identified by 'password';


-- 修改用户密码
alter user 'username'@'access host' identified by 'password';


-- 删除用户
drop user 'username'@'access host';


-- 赋予用户权限,mysql8以下可以分配权限的同时创建用户, 语法不同   all privileges 和 all 都表示全部权限, 权限后面会列举
-- mysql 8 
grant all privileges on 'database'.'table' to 'username'@'access host';
-- mysql 5
grant all on 'database'.'table' to 'username'@'access host' identified by 'password' with grant option;


-- 取消用户权限
revoke all privileges on 'database'.'table' from 'username'@'access host';

-- 查看用户权限
show grants for 'username'@'access host';

-- 等价于 show grants for 'username'@'%'
show grants for 'username';

-- 刷新权限, 所有与用户有关的操作都需要刷新权限后才生效
flush privileges;

关于用户的所有操作,也可以直接进入mysql 数据库,查询编辑用户表, 然后刷新权限 也可以。

直接操作表格如果不是非常熟练,请谨慎!!!

-- 切换数据库
use mysql;
-- 查询用户名, 访问host, 密码串(mysql会加密)
select user, host, authentication_string from user;
+------------------+-----------+------------------------------------------------------------------------+
| user             | host      | authentication_string                                                  |
+------------------+-----------+------------------------------------------------------------------------+
TMnwyk6(NT       LA72JZOMFFxJObWzR.UeR6pyRkfhaDKS3XDpj8VZgP5 |
| ddc              | localhost | $A$005$bZHju(o+`(~/|X6BxbYi.O1Kqy4flY9M70l7B2pWVEFFqlEiMRIwfbBqX4 |
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session    | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys        | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| root             | localhost | $A$005$5F]\~c-%b;NO<b#HoXQEUoCs3Ci5w3eJ7V4BGgb7WaQBI4FhJD6/nZx/iB |
+------------------+-----------+------------------------------------------------------------------------+
6 rows in set (0.00 sec)

1.1 user表说明

MySQL 在安装时会自动创建一个名为 mysql 的数据库,mysql 数据库中存储的都是用户权限表。用户登录以后,MySQL 会根据这些权限表的内容为每个用户赋予相应的权限。

user 表是 MySQL 中最重要的一个权限表,用来记录允许连接到服务器的账号信息。需要注意的是,在 user 表里启用的所有权限都是全局级的,适用于所有数据库。

user 表中的字段大致可以分为 4 类,分别是用户列、权限列、安全列和资源控制列,下面主要介绍这些字段的含义。

1.1.1 用户列

用户列存储了用户连接 MySQL 数据库时需要输入的信息。需要注意的是 MySQL 5.7 版本不再使用 Password 来作为密码的字段,而改成了 authentication_string。

MySQL 5.7 版本的用户列如表 1 所示。

字段名字段类型是否为空默认值说明
Hostchar(60)NO主机名
Userchar(32)NO用户名
authentication_stringtextYES密码

用户登录时,如果这 3 个字段同时匹配,MySQL 数据库系统才会允许其登录。创建新用户时,也是设置这 3 个字段的值。修改用户密码时,实际就是修改 user 表的 authentication_string 字段的值。因此,这 3 个字段决定了用户能否登录。

1.1.2 权限列

权限列的字段决定了用户的权限,用来描述在全局范围内允许对数据和数据库进行的操作。

权限大致分为两大类,分别是高级管理权限和普通权限:

  • 高级管理权限主要对数据库进行管理,例如关闭服务的权限、超级权限和加载用户等;
  • 普通权限主要操作数据库,例如查询权限、修改权限等。

user 表的权限列包括 Select_priv、Insert_ priv 等以 priv 结尾的字段,这些字段值的数据类型为 ENUM,可取的值只有 Y 和 N:Y 表示该用户有对应的权限,N 表示该用户没有对应的权限。从安全角度考虑,这些字段的默认值都为 N。

字段名字段类型是否为空默认值说明
Select_privenum(‘N’,‘Y’)NON是否可以通过SELECT 命令查询数据
Insert_privenum(‘N’,‘Y’)NON是否可以通过 INSERT 命令插入数据
Update_privenum(‘N’,‘Y’)NON是否可以通过UPDATE 命令修改现有数据
Delete_privenum(‘N’,‘Y’)NON是否可以通过DELETE 命令删除现有数据
Create_privenum(‘N’,‘Y’)NON是否可以创建新的数据库和表
Drop_privenum(‘N’,‘Y’)NON是否可以删除现有数据库和表
Reload_privenum(‘N’,‘Y’)NON是否可以执行刷新和重新加载MySQL所用的各种内部缓存的特定命令,包括日志、权限、主机、查询和表
Shutdown_privenum(‘N’,‘Y’)NON是否可以关闭MySQL服务器。将此权限提供给root账户之外的任何用户时,都应当非常谨慎
Process_privenum(‘N’,‘Y’)NON是否可以通过SHOW PROCESSLIST命令查看其他用户的进程
File_privenum(‘N’,‘Y’)NON是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令
Grant_privenum(‘N’,‘Y’)NON是否可以将自己的权限再授予其他用户
References_privenum(‘N’,‘Y’)NON是否可以创建外键约束
Index_privenum(‘N’,‘Y’)NON是否可以对索引进行增删查
Alter_privenum(‘N’,‘Y’)NON是否可以重命名和修改表结构
Show_db_privenum(‘N’,‘Y’)NON是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库
Super_privenum(‘N’,‘Y’)NON是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程;使用SET GLOBAL命令修改全局MySQL变量,执行关于复制和日志的各种命令。(超级权限)
Create_tmp_table_privenum(‘N’,‘Y’)NON是否可以创建临时表
Lock_tables_privenum(‘N’,‘Y’)NON是否可以使用LOCK TABLES命令阻止对表的访问/修改
Execute_privenum(‘N’,‘Y’)NON是否可以执行存储过程
Repl_slave_privenum(‘N’,‘Y’)NON是否可以读取用于维护复制数据库环境的二进制日志文件
Repl_client_privenum(‘N’,‘Y’)NON是否可以确定复制从服务器和主服务器的位置
Create_view_privenum(‘N’,‘Y’)NON是否可以创建视图
Show_view_privenum(‘N’,‘Y’)NON是否可以查看视图
Create_routine_privenum(‘N’,‘Y’)NON是否可以更改或放弃存储过程和函数
Alter_routine_privenum(‘N’,‘Y’)NON是否可以修改或删除存储函数及函数
Create_user_privenum(‘N’,‘Y’)NON是否可以执行CREATE USER命令,这个命令用于创建新的MySQL账户
Event_privenum(‘N’,‘Y’)NON是否可以创建、修改和删除事件
Trigger_privenum(‘N’,‘Y’)NON是否可以创建和删除触发器
Create_tablespace_privenum(‘N’,‘Y’)NON是否可以创建表空间

如果要修改权限,可以使用 GRANT 语句为用户赋予一些权限,也可以通过 UPDATE 语句更新 user 表的方式来设置权限。

1.1.3 安全列

安全列主要用来判断用户是否能够登录成功,user 表中的安全列如表 3 所示:

字段名字段类型是否为空默认值说明
ssl_typeenum(‘’,‘ANY’,‘X509’,‘SPECIFIED’)NO支持ssl标准加密安全字段
ssl_cipherblobNO支持ssl标准加密安全字段
x509_issuerblobNO支持x509标准字段
x509_subjectblobNO支持x509标准字段
pluginchar(64)NOmysql_native_password引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户
password_expiredenum(‘N’,‘Y’)NON密码是否过期 (N 未过期,y 已过期)
password_last_changedtimestampYES记录密码最近修改的时间
password_lifetimesmallint(5) unsignedYES设置密码的有效时间,单位为天数
account_lockedenum(‘N’,‘Y’)NON用户是否被锁定(Y 锁定,N 未锁定)

注意:即使 password_expired 为“Y”,用户也可以使用密码登录 MySQL,但是不允许做任何操作。

通常标准的发行版不支持 ssl,读者可以使用 SHOW VARIABLES LIKE “have_openssl” 语句来查看是否具有 ssl 功能。如果 have_openssl 的值为 DISABLED,那么则不支持 ssl 加密功能。

1.1.4 资源控制列

资源控制列的字段用来限制用户使用的资源,user 表中的资源控制列如表 4 所示。

字段名字段类型是否为空默认值说明
max_questionsint(11) unsignedNO0规定每小时允许执行查询的操作次数
max_updatesint(11) unsignedNO0规定每小时允许执行更新的操作次数
max_connectionsint(11) unsignedNO0规定每小时允许执行的连接操作次数
max_user_connectionsint(11) unsignedNO0规定允许同时建立的连接次数

以上字段的默认值为 0,表示没有限制。一个小时内用户查询或者连接数量超过资源控制限制,用户将被锁定,直到下一个小时才可以在此执行对应的操作。可以使用 GRANT 语句更新这些字段的值。

2. 用户操作权限

权限名称对应user表中的字段说明
SELECTSelect_priv表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。
INSERTInsert_priv表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。
DELETEDelete_priv表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。
UPDATEUpdate_priv表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。
REFERENCESReferences_priv表示授予用户可以创建指向特定的数据库中的表外键的权限。
CREATECreate_priv表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。
ALTERAlter_priv表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。
SHOW VIEWShow_view_priv表示授予用户可以查看特定数据库中已有视图的视图定义的权限。
CREATE ROUTINECreate_routine_priv表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。
ALTER ROUTINEAlter_routine_priv表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。
INDEXIndex_priv表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。
DROPDrop_priv表示授予用户可以删除特定数据库中所有表和视图的权限。
CREATE TEMPORARY TABLESCreate_tmp_table_priv表示授予用户可以在特定数据库中创建临时表的权限。
CREATE VIEWCreate_view_priv表示授予用户可以在特定数据库中创建新的视图的权限。
EXECUTE ROUTINEExecute_priv表示授予用户可以调用特定数据库的存储过程和存储函数的权限。
LOCK TABLESLock_tables_priv表示授予用户可以锁定特定数据库的已有数据表的权限。
ALL 或 ALL PRIVILEGES 或 SUPERSuper_priv表示以上所有权限/超级权限

版权声明:本文为weixin_43740223原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。