我是靠谱客的博主 爱撒娇苗条,最近开发中收集的这篇文章主要介绍mysql 全局权限入门,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

为了便于说明,我先创建一个用户:

create user 'ua'@'%' identified by 'pa';

这条语句的逻辑是创建一个用户’ua’@’%’,密码是 pa

注意,在 MySQL 里面,用户名 (user)+ 地址 (host) 才表示一个用户,因此 ua@ip1 和 ua@ip2
代表的是两个不同的用户。

这条命令做了两个动作:

  • 磁盘上,往 mysql.user 表里插入一行,由于没有指定权限,所以这行数据上所有表示权限的字段的值都是 N;
  • 内存里,往数组 acl_users 里插入一个 acl_user 对象,这个对象的 access 字段值为 0。

图 1 就是这个时刻用户 ua 在 user 表中的状态。

SELECT * FROM mysql.user WHERE USER='ua'
Host                                                                                                                                                                                User                                                                                            Select_privInsert_privUpdate_privDelete_privCreate_privDrop_priv  Reload_privShutdown_privProcess_privFile_priv  Grant_priv References_privIndex_priv Alter_priv Show_db_privSuper_priv Create_tmp_table_privvLock_tables_priv_privvExecute_privRepl_slave_privRepl_client_priv_privvCreate_view_priv_privvShow_view_privCreate_routine_privivvAlter_routine_privvivvCreate_user_privivvivvEvent_priv Trigger_privCreate_tablespace_privssl_type                   max_questionsmax_updatesmax_connectionsmax_user_connectionsivplugin                                                                                                                                                                                          password_expiredionsivpassword_last_changedpassword_lifetimeonsivaccount_locked
%                                                                                                                                                                                   ua                                                                                              N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N          N                                     0          0          0          0          mysql_native_password                                                                                                                                                                           N          2021-07-09 08:08:59     N             

在 MySQL 中,用户权限是有不同的范围的。接下来,我就按照用户权限范围从大到小的顺序依次和你说明。

全局权限

全局权限,作用于整个 MySQL 实例,这些权限信息保存在 mysql 库的 user 表里。如果我要给用户 ua 赋一个最高权限的话,语句是这么写的:

grant all privileges on *.* to 'ua'@'%' with grant option;

这个 grant 命令做了两个动作:

  • 磁盘上,将 mysql.user 表里,用户’ua’@’%'这一行的所有表示权限的字段的值都修改为‘Y’;
  • 内存里,从数组 acl_users 中找到这个用户对应的对象,将 access 值(权限位)修改为二进制的“全 1”。

在这个 grant 命令执行完成后,如果有新的客户端使用用户名 ua 登录成功,MySQL 会为新连接维护一个线程对象,然后从 acl_users 数组里查到这个用户的权限,并将权限值拷贝到这个线程对象中。之后在这个连接中执行的语句,所有关于全局权限的判断,都直接使用线程对象内部保存的权限位。

基于上面的分析我们可以知道:grant 命令对于全局权限,同时更新了磁盘和内存。命令完成后即时生效,接下来新创建的连接会使用新的权限。对于一个已经存在的连接,它的全局权限不受 grant 命令的影响。

需要说明的是,一般在生产环境上要合理控制用户权限的范围。我们上面用到的这个 grant 语句就是一个典型的错误示范。如果一个用户有所有权限,一般就不应该设置为所有 IP 地址都可以访问。

如果要回收上面的 grant 语句赋予的权限,你可以使用下面这条命令:

revoke all privileges on *.* from 'ua'@'%';

这条 revoke 命令的用法与 grant 类似,做了如下两个动作:

  • 磁盘上,将 mysql.user 表里,用户’ua’@’%'这一行的所有表示权限的字段的值都修改为“N”;
  • 内存里,从数组 acl_users 中找到这个用户对应的对象,将 access 的值修改为 0。

总结

  • 授予全局权限 就是grant all privileges on *.* to 'ua'@'%' with grant option;

最后

以上就是爱撒娇苗条为你收集整理的mysql 全局权限入门的全部内容,希望文章能够帮你解决mysql 全局权限入门所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部