《MySQL排错指南》——1.9 许可问题

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章将讨论备份的方法。

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

时间: 2024-09-19 09:52:44

《MySQL排错指南》——1.9 许可问题的相关文章

《MySQL排错指南》导读

前言 MySQL排错指南我从2006年5月开始,作为首席技术支持工程师在MySQL AB公司MySQL支持团队的bug校验组工作,然后我到了Sun公司,最后是在Oracle公司.在日常工作中,我经常遇到用户受困于某个问题而不知所措的情况.虽然有已经被证实可用的方法去定位并快速修复问题,但是用户往往很难从大量的信息中筛选出这些可用的信息.尽管有数以千百计的著名书籍.博文和网页都详细介绍了MySQL服务器方方面面的问题,但这正是我感觉困难的地方:这些信息都关注于如何让MySQL服务器正常地工作,而忽

《MySQL排错指南》——第4章 MySQL环境

第4章 MySQL环境 MySQL排错指南MySQL服务器在运行环境中不是孤立的.即使它运行在专用服务器环境中,你依然需要考虑硬件资源和操作系统限制.在共享环境中,MySQL服务器仍然会受到其他进程的影响.关于MySQL操作系统层面的调优,这个主题可以另写一本书了.所以本章不深入讨论,只是从排错角度切入并展开.MySQL的其中一个优势就是能运行在不同环境中,但这也导致了本章很难将其细化说明.最终我决定写下你需要关心的部分,剩下的留给你去查找操作系统对应的手册来决定如何调优.

《MySQL排错指南》——第1章 基础

第1章 基础 MySQL排错指南当解决疑难问题的时候,为了节约时间,你可以从最简单的情况开始,然后一步步从简入繁.在MySQL支持团队工作的时候,我每个月解决成百上千的问题.其中的大部分都是从零散的请求信息开始的,最终的解决方案可能也很基础,我们将会从一些示例中看到这点.不过有些时候,我们确实会遭遇很大的挑战.所以,我们应时刻牢记从最基础的开始. 典型的基础类问题不外乎执行一个查询但是返回非预期的结果.这类问题的表现形式可能是很明显的错误,也可能是在你明知有匹配记录的情况下却没有返回结果,或者其

《MySQL排错指南》——1.1 语法错误

1.1 语法错误 这个错误听起来十分简单,但仍可能很难发现.我建议你像处理其他问题一样,非常细心地查找可能出现的SQL语法错误. 类似如下错误,很容易被发现: 在这个示例中,很显然用户少转入了个"m",错误消息也很清楚(输出结果根据页面设置进行宽度调整): 遗憾的是,不是所有的语法错误都这么显而易见.我曾经处理过一个问题,它的查询语句是这样的: 这是一个版本迁移导致的问题:该语句在5.0版本中运行正常,但是在5.1版本中出现错误.问题的原因在于,在5.1版本中,"access

《MySQL排错指南》——1.7 当服务器无响应的时候

1.7 当服务器无响应的时候 有时候,MySQL客户端会收到严重的错误消息"在请求中丢失与服务器的连接"或者"服务器已停止".尽管我希望你永远不会遇到这个错误,但是有所准备总是有好处的.由MySQL安装本身引起的这个问题主要有两个原因:服务器问题(最有可能是崩溃)或者滥用连接选项(通常是超时选项或者max_allowed_packet). 第3章将讨论连接相关的配置.第4章会讨论硬件问题和第三方软件相关的问题.这里简短地介绍一下如果遇到服务器崩溃该做些什么. 首先,

《MySQL排错指南》——4.1 物理硬件限制

4.1 物理硬件限制 对性能有不切实际的期望是通常会犯的错.我们要求MySQL服务器在忽略硬件组件延迟的情况下进行优化.因此,理解什么导致了延迟很重要. 下面列出了影响MySQL服务器的硬件资源: 内存CPU内核数量磁盘I/O网络带宽我们依次讨论每个细节. 4.1.1 内存 内存对于MySQL是非常宝贵的资源.服务器在没有磁盘交换的情况下运行很快.理想情况是数据驻留在内存中.因此,在物理内存的限制内合理配置缓冲区是非常重要的.关于这一点,1.6.4小节和3.9.3小节提供了更多详细的介绍和指导.

《MySQL排错指南》——1.3 当错误可能由之前的更新引起时

1.3 当错误可能由之前的更新引起时 如果SELECT查询返回了非预期的结果集,这并不总是意味着查询语句本身有错误,也有可能是因为你以为已经进行了插入.更新或者删除等操作,而事实上它们并未生效. 在你调查这种可能之前,你应该先完全仔细检查前一节讨论的SELECT语句编写错误的问题.在SELECT语句编写正确并且能够返回你想要的值的情况下,现在我开始调查由数据本身的问题导致错误的可能性.为了确认问题是由数据本身而非SELECT语句产生的,我尝试精简语句,使其变成某个独立表的简单查询.如果是小表,那

《MySQL排错指南》——1.2 SELECT返回错误结果

1.2 SELECT返回错误结果 这是用户反馈的另一个非常常见的问题,主要的现象有:用户看不到更新的结果.展示的顺序错误或者查询到了非预期的结果. 这个问题主要有两方面的原因:一方面是你的SELECT查询有误:另一方面是数据库中的数据和你想象的不同.我先介绍第一种情况. 在我规划本节示例的时候,我考虑要么使用真实的示例,要么使用我自己设计的小场景.真实的示例可能占用大量篇幅,但是我自己设计的示例可能对你没有什么帮助,因为没有人会写出那样的代码.因此,我选择使用典型的真实示例作为示例,只是大幅简化

《MySQL排错指南》——1.4 获取查询信息

1.4 获取查询信息 正如前一节看到的一样,数据库会返回一些关于每个查询的重要信息,有些信息直接展现在MySQL的访问客户端中,而有些信息则需要通过如SHOW WARNINGS等命令才能得到.当从应用程序中调用SQL语句的时候,获取这些返回信息并确认没有异常情况发生同样重要.所有语言的MySQL API都提供了获取服务器返回信息的接口.本节将讨论这些接口.这里仅涉及C的API,因为我必须选择一种语言的API,并且大部分其他语言的API都是基于C的API的[2]. 受影响的行数我们从之前见过的输出