select、insert、update、delete、drop、create、alter、grant、references、index、create view、show view、trigger;
columns_priv表中的权限只有下面四个:select、insert、update,references
4、修改一个用户的密码,一般有以下几种方式:
set password for user@host = password('newpassword'); update mysql.user set authentication_string=password('pwd') where user='username' and host='hostname'; alter user user@host identified by 'newpassword'; mysqladmin -u username -h hostname -p password "new password";
最好的方式是alter user的方法,事实上,在新的版本8.0中,set password的方法已经不能使用了,所以建议使用alter user的方法设置新的密码。
除此之外,还有一种方法,不太常用,就是使用grant的方法覆盖掉之前的密码,这里我们简单实验一般,看看效果:
mysql:mysql 20:01:05>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' identified by '111111'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql:mysql 20:01:29>>select user,host,concat(user,'@','\'',host,'\''),authentication_string from mysql.user; +------------------+----------------+-----------------------------------+-------------------------------------------+ | user | host | concat(user,'@','\'',host,'\'') | authentication_string | +------------------+----------------+-----------------------------------+-------------------------------------------+ | dba_yeyz | 192.168.18.% | dba_yeyz@'192.168.18.%' | *FD571203974BA9AFE270FE62151AE967ECA5E0AA | +------------------+----------------+-----------------------------------+-------------------------------------------+ 11 rows in set (0.00 sec) mysql:mysql 20:01:31>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' identified by '123456'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql:mysql 20:01:57>>select user,host,concat(user,'@','\'',host,'\''),authentication_string from mysql.user; +------------------+----------------+-----------------------------------+-------------------------------------------+ | user | host | concat(user,'@','\'',host,'\'') | authentication_string | +------------------+----------------+-----------------------------------+-------------------------------------------+ | dba_yeyz | 192.168.18.% | dba_yeyz@'192.168.18.%' | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +------------------+----------------+-----------------------------------+-------------------------------------------+ 1 rows in set (0.00 sec)
上面的测试可以看到,当我们使用grant的方法给一个指定的用户重新设置密码的时候,之前的老密码会被覆盖,所以这个操作在线上应该慎用,在每次grant的时候看看有没有已经存在的账号,确认没有之后,再进行grant操作
5、如果我们不慎忘记了mysql的root密码,可以重新启动mysql服务,加上--skip-grant-tables这个参数来启动mysql服务,这样就可以直接免除了在权限表里面的匹配工作,直接登陆进mysql服务中,从而修改root账号的密码。
6、如果使用update或者insert记录到mysql.user表中的方法创建账户或者修改密码,在执行完语句之后,必须使用flush privileges的操作刷新权限表,否则该操作无法产生效果。
7、有几个权限会影响mysqladmin工具的执行,分别是
reload权限:影响flush操作
shutdown权限:影响shutdown操作
process权限:影响processlist操作
super权限:影响kill操作
8、之前提到了mysql.user表中的资源控制的字段,分别是
max_questions每小时最大请求数、max_updates每小时最大更新数、max_connections每小时最大连接数、max_user_connections单个用户可同时建立的最大连接数。
如果我们想给一个用户设置这个参数,可以使用如下的SQL来进行设置:
mysql:mysql 20:01:58>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' with max_queries_per_hour 1000; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql:mysql 20:13:13>>select user,host,max_questions from mysql.user where user='dba_yeyz'; +----------+--------------+---------------+ | user | host | max_questions | +----------+--------------+---------------+ | dba_yeyz | 192.168.18.% | 1000 | +----------+--------------+---------------+ 1 row in set (0.00 sec)
注意到,这里的grant语句中使用了with这个选项,with后面可以跟的选项有5个,分别是:
grant option:被授权的用户可以将这些权限赋予别的用户
max_queries_per_hour count:每个小时可以执行count次查询;
max_updates_per_hour count:每个小时可以执行count次更新;
max_connections_per_hour count:每个小时可以建立count个连接;
max_user_connections count:设置单个用户可以同时建立count个连接
9、设置全局变量:
SET GLOBAL default_password_lifetime = 180;
SET GLOBAL default_password_lifetime = 0;
可以设置密码的生命周期为6个月,6个月之后失效,如果设置为0,则一直有效。
当然,还可以在创建用户的时候就指定密码的修改周期或者禁用密码的修改周期:
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
10、有时候我们似乎已经删除了账号密码,但是却还可以通过账号密码进行访问,这个时候,需要检查一个设置,就是看看user表中是否有空记录:
select user,host from mysql.user where user='';
很有可能是你设置了user为空的记录,这样导致所有的用户都可以直接登陆。如果有,最好直接干掉它,因为它违背了安全的宗旨。
以上就是MySQL 权限控制细节分析的详细内容,更多关于MySQL 权限控制的资料请关注其它相关文章!
更多相关Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。