MySQL的权限

来源:互联网 发布:小说改编的悬疑网络剧 编辑:程序博客网 时间:2024/05/24 05:16

几天没更了,今天把之前的都补上,这里先写点关于MySQL权限的一些认知。


一、首先权限是什么,数据库的权限就是决定某个连接用户能够做什么的一种控制形式。

MySQL的权限是通过白名单的形式来控制的,也就是说它可以规定用户做什么,但是不能明确规定用户不能做什么。

1、MySQL的权限按粒度可分为5个层级,从大到小一次为全局级权限、数据库级权限、表级权限、列级权限、程序级权限

2、MySQL的权限按使用方式可分为两种:

a、数据库连接申请权限:

用户发起连接申请时,数据库服务会对用户提交的username、password、host三项值进行验证,看该用户是否有权限进行连接。

b、数据库操作权限:

用户连接上数据库之后,提交对数据库的操作请求后,数据库服务会根据用户请求的类型,按粒度由粗到细的方式对权限进行搜寻匹配,任意粒度匹配成功则进行操作,否则拒绝访问。(搜寻方式:mysql.user ==> mysql.db ==> mysql.tables_priv ==> mysql.columns_priv ==> mysql.procs_priv)


二、创建一个用户来测试(注意MySQL通过user@host来唯一标识一个用户,好比来自北京的张三跟来自上海的张三不是同一个人),创建用户有以下几种方式:

1、create user方式创建

create user user_name1;                #创建时可以不指定密码,缺省的情况下可进行免密登录,user_name不能超过16字符

create user user_name2@‘host’ identified by PWD;                #这种方式创建的用户只能从指定的host发起连接

2、grant方式创建

grant select on mysql.* to user_name@'host' identified by PWD;                #赋权的同时创建用户

3、操作权限表方式创建

insert into mysql.user values(...);                #直接修改权限表创建用户,需重新加载权限表生效(flush privileges)


三、然后是修改用户密码,修改密码有两种方式:

1、set password方式修改

set password for user_name=password('PWD');                #for user_name子句在修改当前用户的密码时可省略,user_name的格式为user@host

2、alter user方式修改(MySQL5.6.6版本之前不支持alter user命令)

update mysql.user set password=password('') ...                #MySQL5.7版本之后password字段更名为 authentication_string

密码过期的问题:

MySQL的alter user支持将用户密码置为过期状态,该情况下用户可进行登录但是不能做任何操作。

alter user user_name password expire;


四、管理员口令忘记了怎么办。。。

1、首先得关闭数据库服务

service mysqld stop

2、然后以忽略密码检查模式启动数据库服务(启动时指定skip-grant-tables选项,表示有用户连接时跳过检查授权表)

mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &                #安全起见指定skip-networking选项,不监听任何来自网络的连接请求

3、连接至数据库

mysql -uroot

4、修改用户密码

update user set authentication_string=PASSWORD('123456') where USER='root';

5、重启数据库服务

service mysqld stop

service mysqld start


五、数据库用户权限的变更

1、查看用户的权限

show grants;                #查看当前用户

show grants for user_name;                #查看指定用户

2、对用户赋权

grant all on csh.* to user_name with grant option;                #with grant option允许将权限赋给其他用户

3、对用户进行权限回收

revoke all on csh.* from test;                #必须使用同级权限进行回收,也就是说 revoke all on *.* from test 是无法回收csh.*的权限的。

revoke all,grant option from test;                #可用于一次回收所有权限,usage除外(普通用户的usage权限是新建用户默认都有的,无法进行回收)

权限变更了何时生效呢?

a、通过grant、revoke对用户权限进行的变更会触发数据库系统重载授权表,权限立马生效。

b、通过修改权限控制字典表进行的权限变更需重启或手动重载授权表生效。

对于当前已连接的客户端,权限变更之后的生效方式为:

c、对表、列进行的权限变更,下次执行操作时生效;

d、数据库级的权限变更需要客户端切换数据库时生效,即use database_name生效;

e、全局权限和密码修改,对当前已连接的客户端无效,下次连接生效。


六、删除用户

drop user user_name;                #删除用户之后,该用户已经连接上的会话并不会断开,并且可以继续以之前的权限进行操作数据库,这有意思吧。


权限的大概这么多了,欢迎大家指正补充。接下来会写写对MySQL字符集的认识。