本节书摘来自异步社区出版社《MySQL排错指南》一书中的第1章,第1.9节,作者:【美】Sveta Smirnova(斯维特 斯米尔诺娃),更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.9 许可问题

MySQL有复杂的权限方案,这使得你可以精确地设置哪些用户和主机可以或不可以执行这个或那个操作。从5.5版本开始,MySQL也有了可插拔式的身份验证模式。

尽管它有很多优势,但是这个方案很复杂。例如,让user1@hostA、user2@hostA和user1@hostB不同会很容易混淆它们的权限。当用户名相同而主机名变化的时候更是如此。

MySQL允许在对象和连接层面设置访问规则。可以限制某个用户对于特定的表、列等的访问权限。

用户通常会遇到两类权限问题:

应该有权限连接到服务器的用户无法连接,或者没有权限的用户可以连接;
用户可以连接到服务器,但是无法使用他们本应该可以访问的对象,或者可以访问他们无权访问的对象。
在解决这些问题之前,应该确认你是否可以连接到服务器。

当你作为解决问题的用户成功连接到服务器之后(后面的章节将讨论无法连接的情况),执行以下查询:

USER()函数会返回当用户连接到服务器时使用的连接参数。这些参数通常为指定的用户名和运行客户端的主机名。CURRENT_USER()函数会返回从权限表中选择的与访问权限相关的用户名和主机名对。mysqld用这些用户名和主机名对来检查数据库对象访问权限。通过比较这些函数的结果,可以找到mysqld使用的权限和预期不同的原因。一个典型的问题是对主机名使用通配符%:

如果此时我以sveta身份连接并尝试创建一个表,我就会获得下面的错误:

该问题在于,MySQL服务器认为sveta是sveta@localhost,而不是通配符:

 

如果你不理解为什么选择一台或另一台主机,可以进行如下查询:

MySQL在表中按照从访问最多的主机到访问最少的主机的顺序对行进行排序,然后使用第一个找到的值。因此,它把我当作sveta@localhost用户进行连接,此时该用户没有CREATE权限。

USER()、CURRENT_USER()函数和“SELECT user, host FROM mysql.user ORDER BY host DESE”查询语句是遇到权限问题时的首选。
另一种权限问题是你无法作为指定用户进行连接。在这种情况下,通常可以从错误消息中了解问题产生的原因,错误消息一般如下所示:

在看到这条消息以后,你了解了用户凭证。作为root超级用户进行连接,然后检查该用户是否存在以及是否拥有所需权限:

在这个输出信息中,你可以看到用户'sveta'@'localhost'仅仅对book数据库有权限,而对books数据库没有权限。现在,可以修复这个错误:赋予sveta@localhost用户必要的权限。

前面的示例讨论用户缺失必要权限的情况。对于用户被授予过多权限的情况也可以同样处理;仅需要移除不必要的权限。

警告 警告

MySQL的权限与其管控对象是分离的:这意味着当你赋予某用户权限时mysqld 不会检查其是否存在,同时当授权对象被删除时也不会移除相应权限。这样做的好处是允许我们预先授予必要的权限,但同时也有可能在不经意的使用中带来潜在的问题。
作为最佳实践,我推荐你仔细学习MySQL的权限工作机制。尤其是在你想要在用户对象级别授予权限的时候,因为你需要理解在一个级别授权是如何影响其他授权的。同样,对于撤消权限情形也一样重要,甚至更重要,因为如果你以为已经撤消了某个权限但它依然存在,这就会造成意外的访问。

[1] 版本5.6.3开始,也可以在UPDATE和DELETE上使用EXPLAIN方法,不过把语句转换成SELECT查询仍然有效,因为你可以方便地检查和操作实际的结果集,而不是仅使用EXPLAIN命令。这尤其适用于复杂的JOIN操作,尤其是当EXPLAIN输出的检查的行比实际更新的行还要多的时候。

[2] 你可以在http://dev.mysql.com/doc/refman/5.5/en/c.html找到关于C API的详细描述。

[3] 第5章将详细介绍如何解决复制失败的问题,因此这里不再详细解释。

[4] MySQL企业级备份(MEB)以前也称作InnoDB热备份,是InnoDB表进行在线热备份和其他存储引擎的表进行在线备份的一个工具。第7章将讨论备份的方法。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

《MySQL排错指南》——1.9 许可问题相关推荐

  1. mysql 客户服务号获取_《MySQL排错指南》——1.4 获取查询信息-阿里云开发者社区...

    本节书摘来自异步社区出版社<MySQL排错指南>一书中的第1章,第1.4节,作者:[美]Sveta Smirnova(斯维特 斯米尔诺娃),更多章节内容可以访问云栖社区"异步社区 ...

  2. AjaxPro排错指南

    AjaxPro排错指南 之前有用过AjaxPro.dll,感觉前台调用后台的DataTable时非常好用.结果昨天在项目中使用时怎么都一直报未定义错误.上火啊,头疼啊. 翻遍了资料,还是没有找到问题的 ...

  3. mysql访问类型最好的_【干货满满】最全的MySQL性能指南(一):选择最佳的数据类型...

    对于 MySQL 数据库来说,好的逻辑表和物理表的规划至关重要,我们需要根据查询语句来针对性地设计 Schema ,没有万能好用的 Schema.一个 denormalized 的 schema 可以 ...

  4. 网络包排错指南-类linux 平台

    网络包排错指南-类linux 平台 背景信息 最近一直在测试k8s,如果你了解或者解接触过docker,那你一定知道docker 相关的网络很大部分在桥接.路由.Iptables 上做文章.如果你凑巧 ...

  5. 神了!阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南

    为什么要学习Oracle+MySQL? Oracle在金融.电信.交通.医疗.制造业.能源等诸多领域的使用非常广泛,其拥有完善的生态体系,多样化的数据库选件,在高可用性.高性能.高安全性.高数据服务能 ...

  6. 神了,阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南

    为什么要学习Oracle+MySQL? Oracle在金融.电信.交通.医疗.制造业.能源等诸多领域的使用非常广泛,其拥有完善的生态体系,多样化的数据库选件,在高可用性.高性能.高安全性.高数据服务能 ...

  7. mysql权威指南 代码_mysql权威指南学习札记

    mysql权威指南学习笔记 1,mysql的标示符最多就64个字符 2,drop table table1,table2,table3;删除多个table的时候用,号分隔开,为了避免不必要的错误,我们 ...

  8. MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题

    MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 参考文章: (1)MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 (2)https://ww ...

  9. 排错指南 - Pod k8s

    排错指南 - Pod 本文档介绍 Pod 的异常状态,可能原因和解决办法. 排查 Pod 异常的常用命令如下: 查看 Pod 状态:kubectl get pods <pod-name> ...

最新文章

  1. (0079)iOS开发之安全策略之HTTPS(1)
  2. 在C#中利用Keep-Alive处理Socket网络异常断开的方法
  3. 图片太多加载过慢?学学图片懒加载吧
  4. NHibernate实例化类部分属性
  5. mongodb统计函数
  6. 塑源码是什么_注塑机源代码
  7. puppet变量、数据类型及类(03)
  8. JDK,SDK,API之间的概念汇总
  9. jquery的Dom操作查找节点
  10. 炫酷个人引导页主页自适应HTML源码
  11. 零基础怎么学好3D建模?只需要了解下面几点
  12. outlook登陆Exchange邮箱不断掉线并弹出需要登陆的窗口
  13. linux实训心得体会范文
  14. [Swift]UIButton文本添加下划线
  15. 有趣的python小程序(附效果和程序)
  16. 涛思 TDengine 表设计及SQL
  17. 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行
  18. 如何以创新驱动增长战略
  19. 网络篇 OSPF的路由器类型-42
  20. MyBatis从0到1快速入门

热门文章

  1. C++std命名空间和头文件详解
  2. C++(9)--裸指针、智能指针、引用
  3. Linux加密框架crypto crypto_alg|cipher_alg数据结构|AES例子
  4. C++primer第一章 开始
  5. C++中lock_guard的学习
  6. mininet 应用实践
  7. 运营商取消话费余额有效期后改收闲置费
  8. 分享11款主流的开源编程工具
  9. 国内外软件开发上的差距与分析
  10. 《 第一本Docker书 》读书笔记 --- Docker 各项操作命令及参数说明(docker run 命令各个参数说明)