无法诊断我的 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”、“*503872B3FA065DCF60您的评论显示了您当前的 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.1
或your-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 根用户问题的主要内容,如果未能解决你的问题,请参考以下文章