mysql用户管理和权限设置
mysql到底都有哪些权限呢?
从官网复制一个表来看看:
权限 | 权限级别 | 权限说明 |
create | 数据库、表或索引 | 创建数据库、表或索引权限 |
drop | 数据库或表 | 删除数据库或表权限 |
grant option | 数据库、表或保存的程序 | 赋予权限选项 |
references | 数据库或表 | |
alter | 表 | 更改表,比如添加字段、索引等 |
delete | 表 | 删除数据权限 |
index | 表 | 索引权限 |
insert | 表 | 插入权限 |
select | 表 | 查询权限 |
update | 表 | 更新权限 |
create view | 视图 | 创建视图权限 |
show view | 视图 | 查看视图权限 |
alter routine | 存储过程 | 更改存储过程权限 |
create routine | 存储过程 | 创建存储过程权限 |
execute | 存储过程 | 执行存储过程权限 |
file | 服务器主机上的文件访问 | 文件访问权限 |
create temporary tables | 服务器管理 | 创建临时表权限 |
lock tables | 服务器管理 | 锁表权限 |
create user | 服务器管理 | 创建用户权限 |
process | 服务器管理 | 查看进程权限 |
reload |
服务器管理 | 执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限 |
replication client | 服务器管理 | 复制权限 |
replication slave | 服务器管理 | 复制权限 |
show databases | 服务器管理 | 查看数据库权限 |
shutdown | 服务器管理 | 关闭数据库权限 |
super | 服务器管理 | 执行kill线程权限 |
mysql的权限如何分布,就是针对表可以设置什么权限,针对列可以设置什么权限等等
这个可以从官方文档中的一个表来说明:
权限分布 | 可能的设置的权限 |
表权限 | 'select', 'insert', 'update', 'delete', 'create', 'drop', 'grant', 'references', 'index', 'alter' |
列权限 | 'select', 'insert', 'update', 'references' |
过程权限 | 'execute', 'alter routine', 'grant' |
mysql权限经验原则
权限控制主要是出于安全因素,因此需要遵循一下几个经验原则:
- 1、只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。
- 2、创建用户的时候限制用户的登录主机,一般是限制成指定ip或者内网ip段。
- 3、初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。
- 4、为每个用户设置满足密码复杂度的密码。
- 5、定期清理不需要的用户。回收权限或者删除用户。
mysql权限实战
1. 创建用户
命令:
create user 'username'@'host' identified by 'password';
说明:
username
:你将创建的用户名host
:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
password
:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
例子:
create user 'dog'@'localhost' identified by '123456'; create user 'pig'@'192.168.1.101' idendified by '123456'; create user 'pig'@'%' identified by '123456'; create user 'pig'@'%' identified by ''; create user 'pig'@'%';
2. 授权
命令:
grant privileges on databasename.tablename to 'username'@'host'
说明:
privileges
:用户的操作权限,如select
,insert
,update
等,如果要授予所的权限则使用all
databasename
:数据库名tablename
:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*
表示,如*.*
例子:
grant select, insert on test.user to 'pig'@'%'; grant all on *.* to 'pig'@'%'; grant all on maindataplus.* to 'pig'@'%';
需要注意的是:
用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
grant privileges on databasename.tablename to 'username'@'host' with grant option;
3. 设置与更改用户密码
命令:
set password for 'username'@'host' = password('newpassword');
如果是当前登录用户用:
set password = password("newpassword");
例子:
set password for 'pig'@'%' = password("123456");
需要注意的是,从mysql 5.7.6版本开始,mysql不推荐使用此语法,会在将来的版本中将password函数删除。
作为代替的解决方案,在8.0版本中直接使用明文密码:
set password for 'pig'@'%' = 'newpasswd2';
4. 撤销用户权限
命令:
revoke privilege on databasename.tablename from 'username'@'host';
说明:
privilege
, databasename
, tablename
:同授权部分
例子:
revoke select on *.* from 'pig'@'%';
注意:
假如你在给用户'pig'@'%'
授权的时候是这样的(或类似的):
grant select on test.user to 'pig'@'%'
则在使用
revoke select on *.* from 'pig'@'%';
命令并不能撤销该用户对test数据库中user表的select
操作。
相反,如果授权使用的是
grant select on *.* to 'pig'@'%';
则
revoke select on test.user from 'pig'@'%';
命令也不能撤销该用户对test数据库中user表的select
权限。
具体信息可以用命令
show grants for 'pig'@'%';
查看。
5. 删除用户
命令:
drop user 'username'@'host';
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论