无法诊断我的 MySQL 根用户问题

Posted

技术标签:

【中文标题】无法诊断我的 MySQL 根用户问题【英文标题】:Can't diagnose my MySQL root user problem 【发布时间】:2010-11-28 07:07:12 【问题描述】:

我的 mysql 设置中的 MySQL root 用户有问题,我终其一生都想不出如何解决它。看来我搞砸了root用户,现在我对数据库的访问非常不稳定。

作为参考,我在 OS X 上使用 MAMP 来提供 MySQL 服务器。不过我不确定这有多重要 - 我猜我所做的任何事情都需要命令行修复来解决它。

我可以像往常一样使用 MAMP 启动 MySQL,并使用我为我的 php 应用程序创建的“标准”用户访问数据库。但是,我在 MySQL GUI 客户端和 phpMyAdmin 中使用的 root 用户只能访问“information_schema”数据库,以及我手动创建的两个数据库,并且可能(并且错误地)留下了完全开放的权限。我的 root 用户无法访问我的 15 个左右的其他数据库。当我加载 phpMyAdmin 时,主屏幕显示:“创建新数据库:无权限”。

我确实在某个阶段使用 MAMP 对话框更改了我的 root 用户的密码。但我不记得我是否做了任何其他可能导致这个问题的事情。我再次尝试更改密码,问题似乎没有任何变化。

我也尝试过使用命令行重置 root 密码,包括使用 --skip-grant-tables 手动启动 mysql,然后刷新 privs,但同样,似乎无法解决问题。

我的想法已经结束,非常感谢这里的一位专家提供的一些分步建议和诊断!

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题:只有一个用户帐户可以通过管理控制台或查询浏览器访问 mysql 数据库。当我突然使用 skip-grant-tables 时,所有帐户都可以登录,包括 root。

我看到了as a bug as far back as 2006,但是最后一个条目没有在skip-grant-tables模式下可以执行的命令,所以我仍然没有解决这个问题。

什么帮助了我 这个答案类似于 Ben Bakelaar in the above link 描述的答案。当您的my.ini 禁用名称解析标志(skip-name-resolve)时,问题就出现了。这会破坏 mysql 解析 'localhost' 的能力,并且 mysql.user 表只有 localhost / root 的条目。

将 mysql.user 表的 localhost 条目改为 127.0.0.1,即使启用了 skip-name-resolve 功能,您也可以登录到本地控制台。

【讨论】:

备份数据库并清除 mysql-server 以重新开始有时是个好主意。【参考方案2】:

尝试使用 --skip-grant-tables 启动服务器,然后检查 mysql 数据库中的权限表:

select * from user where User='root';
select * from tables_priv where User='root';
select * from db where User='root';

你也可以试试:

show grants for root@localhost;
show grants for root@'%';
show grants for root@'hostname';

一旦进入,您就可以尝试授予 root 完全权限:

grant all privileges on *.* to root@localhost identified by 'password' with grant option;

【讨论】:

嗨克雷格,谢谢你的帖子。以下是您的建议的结果: select * from user where User='root';给出 1 行:“localhost”、“root”、“*503872B3FA065DCF60B67224E”然后加载 'Y's --- select * from tables_priv where User='root';并选择 * from db where User='root';两者都给出“空集”---所有“显示授权”命令都给出错误:“MySQL 服务器正在使用 --skip-grant-tables 选项运行,因此它无法执行此语句”---“授予所有权限”命令给出相同的错误 哇,我认为这里的 cmets 允许格式化,但显然不允许!希望您能阅读所有内容。 当我在没有 --skip-grant-tables 的情况下启动服务器时,我得到以下信息:“show grants for root@localhost;”给出:“在 . 上授予 'root'@'localhost' 的所有权限,通过密码 '*503872B3FA065DB67224E' 使用授予选项” --- “显示 root@'%' 的授权;"给出:“主机'%'上没有为用户'root'定义这样的授权”——这有什么启示吗?我仍然完全不知道出了什么问题。 能否通过命令行命令访问数据库:mysql -u root -p -h localhost DBNAME mysql -u root -p -h 127.0.0.1 DBNAME 怎么样【参考方案3】:

您的评论显示了您当前的 root 权限(没有 --skip-grant-tables)。 'root'@'%' 没有任何条目很好,默认情况下没有,您可以将其视为一种安全措施。

您似乎弄乱了您的'root'@'localhost' 权限。 GRANT ALL PRIVILEGES ON . 很奇怪。通常,您有类似GRANT ALL PRIVILEGES ON *.*GRANT ALL PRIVILEGES ON myDatabase.myTable 的内容。您的 GRANT 没有指定要授予权限的数据库和/或表。我不知道您的客户是如何制作它的。我无法使用 mysql 命令行客户端重现它(尝试了空字符串、空格、任何类型的引号......),mysql 拒绝 GRANT 语句(当然,这是正确的行为)。看起来 MAMP 正在做一些非常奇怪的事情。由于我无法重现像你这样的GRANT,我不能说mysql是如何解释它的,但我猜它已经在全局级别将权限设置为'N'

要修复它,您需要一个具有适当权限的用户。通常,您有一个用户'root'@'localhost' 和一个'root'@'your-hostname'。如果幸运的话,'root'@'your-hostname' 仍然可以。公平地说,mysql连接工作如下:如果你连接到localhost,你连接为'root'@'localhost'(不确定127.0.0.1,我猜它也是'root'@'localhost')。如果您连接到your-hostname,则连接为'root'@'your-hostname'。如果这个用户的权限还可以,你可以更新'root'@'localhost'的权限,就大功告成了。

在您的评论中,您说您无法通过127.0.0.1 连接,因为套接字位于不寻常的位置。我猜你误解了这个错误。 IIRC 如果连接到'localhost',则通过套接字连接,但如果连接到127.0.0.1your-hostname,则通过TCP/IP 连接。如果 mysql 尝试通过套接字连接并且找不到套接字(因为您没有指定正确的位置),错误消息会提到 mysql 尝试找到套接字的位置。您的错误消息没有。我猜你的错误是网络错误。也许您已经使用 --skip-networking 选项启动了 mysql-server,或者您的配置指定了不正确的绑定地址。你需要先解决这个问题,否则你无法连接为'root'@'your-hostname'

【讨论】:

【参考方案4】:

那是因为 MAMP 和命令行 mysql(以及除了 MAMP 之外的一切 mysql)是不同的。

MAMP 有自己的内置 mysql,您无法通过命令行访问它,只能在 phpmyadmin 中构建。

这是我的经验,我有 MAMP 并使用其他 mysql 进行 ruby​​ on rails 和其他东西。

【讨论】:

以上是关于无法诊断我的 MySQL 根用户问题的主要内容,如果未能解决你的问题,请参考以下文章

由于删除根数据库,无法访问 PHPmyadmin

MySQL故障诊断常用方法手册(含脚本案例)

设置 MySQL 根密码时无法连接到“localhost”的服务器

无法为图像阵列的表达式生成诊断

Mamp phpMyAdmin - 无法连接:无效设置

SwiftUI 搜索栏无法产生诊断错误