首先让我提一下,我已经经历了许多建议的问题,并没有找到相关的答案 . 这就是我正在做的事情 .
我已连接到我的Amazon EC2实例 . 我可以使用以下命令使用MySQL root登录:
mysql -u root -p
然后我用主机%创建了一个新的用户账单
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
授予用户账单的所有权限:
grant all privileges on *.* to 'bill'@'%' with grant option;
然后我从root用户退出并尝试使用bill登录:
mysql -u bill -p
输入正确的密码并收到此错误:
ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:YES)
30 回答
超级到此为止
我尝试了所有这些其他答案并运行了许多不同版本的
mysql -u root -p
但从未运行过mysql -u root -p
只需按
[ENTER]
输入密码即可 .一旦我做到了,它就有效了 . 希望这有助于某人 .
您可能有一个匿名用户
''@'localhost'
或''@'127.0.0.1'
.根据the manual:
因此,当从
localhost
连接时,这样的匿名用户会"mask"任何其他用户,如'[any_username]'@'%'
.'bill'@'localhost'
与'bill'@'%'
匹配,但会匹配(例如)''@'localhost'
beforehands .推荐的解决方案是删除这个匿名用户(这通常是一件好事) .
以下编辑主要与主要问题无关 . 这些仅用于回答本主题中其他评论中提出的一些问题 .
Edit 1
通过套接字认证为
'bill'@'%'
.Edit 2
完全相同的设置,除了我重新激活网络,我现在创建一个匿名用户
''@'localhost'
.Edit 3
与编辑2中的情况相同,现在提供匿名用户的密码 .
结论1,来自编辑1:可以通过套接字认证为
'bill'@'%'
.结论2,从编辑2:无论是通过TCP连接还是通过套接字连接都不会对身份验证过程产生影响(除了一个人不能像其他任何人一样通过套接字连接
'something'@'localhost'
) .结论3,来自编辑3:虽然我指定了
-ubill
,但我被授予了匿名用户的访问权限 . 这是因为上面提到的"sorting rules" . 请注意,在大多数默认安装中,a no-password, anonymous user exists(应该加以保护/删除) .尝试:
当你跑
并得到了这个错误
mysqld期待你连接为
bill@localhost
尝试创建
bill@localhost
如果要远程连接,则必须使用TCP / IP指定DNS名称,公共IP或127.0.0.1:
登录后,请运行此命令
USER()报告了您如何尝试在MySQL中进行身份验证
CURRENT_USER()报告了如何允许您从 mysql.user 表中在MySQL中进行身份验证
这将使您更好地了解允许您登录mysql的方式和原因 . 为什么这个观点很重要?它与用户身份验证订购协议有关 .
这是一个例子:我将在我的桌面MySQL上创建一个匿名用户
好的,请注意以匿名用户身份登录:
身份验证排序非常严格 . 它从最具体到最低的检查 . I wrote about this authentiation style in the DBA StackExchange .
不要忘记在必要时显式调用TCP作为mysql客户端的协议 .
当您键入
mysql -u root -p
时,您将通过本地unix套接字连接到mysql服务器 .但是,你给予的资助,
'bill'@'%'
只是奇怪地匹配TCP / IP连接 .如果要授予对本地unix套接字的访问权限,则需要授予'bill'@'localhost'权限,这与'bill'@'127.0.0.1'不一样 .
您还可以使用TCP / IP与mysql命令行客户端进行连接,以匹配您已授予的权限,例如:运行
mysql -u root -p -h 192.168.1.123
或您的盒子所具有的本地IP地址 .我的案例中的一个相关问题是尝试连接使用:
Whitespace 显然允许在-u#uname#之间允许但在-p和#password#之间使用 NOT
因此需要:
否则在-p mypass 之间有空格_ mysql需要'mypass'作为 db 名称
如果您忘记了密码或想要修改密码 . 您可以按照以下步骤操作:
Bingo!您可以使用您的用户名和新密码连接数据库:
避免主要问题...你的问题可能是你错过了密码周围的引号 . 至少那是我的情况,绕了我3个小时 .
http://dev.mysql.com/doc/refman/5.7/en/option-files.html
搜索“这是一个典型的用户选项文件:”并查看它们在那里说明的示例 . 祝你好运,我希望能节省一些时间 .
解决方案是删除匿名(Any)用户!
我在其他人的服务器设置上也遇到了同样的问题 . 我通常不会在安装MySQL时选择创建匿名用户,所以没有注意到这一点 . 最初我以“root”用户身份登录并创建了几个“普通”用户(也就是用户只在dbs上使用其用户名作为前缀的权限),然后注销,然后继续验证第一个普通用户 . 我无法登录 . 既不通过phpMyAdmin,也不通过shell . 事实证明,罪魁祸首是这个“任何”用户 .
我找到的最佳解决方案是 .
我的用户是声纳,每当我尝试从外部或其他机器连接到我的数据库时,我收到错误
另外,当我从另一台机器和Jenkins工作尝试这个时,我的访问URL是
如果要远程连接,可以使用以下不同方式指定它:
要使用URL访问它,您只需执行以下查询 .
好吧,我不确定但是这可能是my.cnf文件里面的mysql安装目录是罪魁祸首 . 注释掉这一行,问题可能会得到解决 .
只是想让你知道一个不寻常的情况,我收到了同样的错误 . 也许这有助于未来的某些人 .
我开发了一些基础视图,在开发站点创建并将它们传输到 生产环境 站点 . 那个星期晚些时候我改变了一个PHP脚本,突然出现了一些错误,即用户'local-web-user'@'localhost'拒绝访问Access . 数据源对象没有改变,所以我专注于MySQL中的数据库用户,同时担心有人入侵了我的网站 . 幸运的是,该网站的其余部分似乎没有受到伤害 .
后来证明这些观点是罪魁祸首 . 我们的对象传输是使用另一个(和远程:admin @ ip-address)用户完成的,而不是本地网站用户 . 因此,视图是使用'admin'@'ip-address'作为定义者创建的 . 视图创建SECURITY默认为
当local-web-user尝试使用视图时,它会发现定义器缺少使用表的特权 . 安全性更改为:
问题得到了解决 . 实际问题与基于错误消息的预期完全不同 .
这是一个区别:
和
核实:
命令
访问隐含于'bill'@'localhost'而不是'bill'@'%' .
“bill”@“localhost”没有权限
你得到错误:
解决问题:
当您的密码包含一些特殊字符(如@,$等)时,也会发生这种情况 . 要避免这种情况,您可以用单引号包装密码:
或者输入时不要使用密码 . 将其留空,然后在终端询问时输入 . 这是推荐的方式 .
不确定是否有其他人会发现这有用,但我遇到了同样的错误并搜索了所有匿名用户......并且没有任何人 . 问题最终是用户帐户被设置为“要求SSL” - 我在PHPMyAdmin中找到了,通过转到用户帐户并单击用户的编辑权限 . 一旦我取消选中此选项,一切都按预期工作!
对我来说,这个问题是由MySQL 5.7.2的一个新功能引起的:如果
user
字段为空,则忽略user
个条目 .将其设置为例如
mysql_native_password
重新启用它们:请参阅«认证说明»下的the release notes for MySQL 5.7.2 .
出于某种原因(可能因为我的4.1之前的密码哈希被删除),
mysql_upgrade
脚本没有设置默认的插件值 .通过注意
/var/log/mysql/error.log
中的以下警告消息我发现:我发布这个答案这可能是为了挽救某人使用与我相同的荒谬时间 .
Debugging Summary
检查拼写错误:用户名或密码 .
检查主机名并将其与mysql.user表主机名进行比较 .
检查用户是否存在 .
检查主机是否包含IP地址或主机名 .
您很可能在工作中多次遇到此问题 . 由于输入的用户名或密码不正确,我很多时候都会遇到此问题 . 虽然这是其中一个原因,但还有很多机会可能会遇到这个问题 . 有时,它看起来非常相似,但是当你深入挖掘时,你会发现导致这个错误的多种因素 . 这篇文章将详细解释,解决这个问题的大多数常见原因和解决方法 .
Possible reasons:
这是此错误的最常见原因 . 如果您错误地输入了用户名或密码,肯定会收到此错误 .
Solution:
这类错误的解决方案非常简单 . 只需输入正确的用户名和密码即可 . 此错误将得到解决 . 如果您忘记了密码,可以重置用户名/密码 . 如果您忘记了admin / root帐户的密码,有很多方法可以重置/重新获取root密码 . 如果忘记root密码,我将发布另一篇关于如何重置root密码的帖子 .
MySQL为用户访问提供基于主机的限制作为安全功能 . 在我们的 生产环境 环境中,我们过去仅将访问请求限制为应用程序服务器 . 此功能在许多 生产环境 方案中非常有用 .
Solution:
遇到此类问题时,首先检查mysql.user表,检查是否允许主机 . 如果未定义,则可以将新记录更新或插入mysql.user表 . 通常,由于安全问题,禁用从远程计算机以root用户身份进行访问,这不是最佳做法 . 如果您有从多台计算机访问服务器的要求,请仅授予对这些计算机的访问权限 . 最好不要使用通配符(%)并进行通用访问 . 让我更新mysql.user表,现在demouser可以从任何主机访问MySQL服务器 .
当您尝试访问的用户不存在于MySQL服务器上时,会发生此类错误 .
Solutions:
当您遇到此类问题时,只需检查用户是否存在于mysql.user表中 . 如果记录不存在,则用户无法访问 . 如果要求该用户访问,请使用该用户名创建新用户 .
Important points
建议在定义用户主机时使用通配符,尝试使用确切的主机名 .
禁用远程计算机的root登录 .
使用代理用户概念 .
与此主题相关的其他概念很少,并且了解这些主题的详细信息是本文的非常不同的范围 . 我们将在即将发表的文章中研究以下相关主题 .
怎么办,如果忘记了MySQL服务器的root密码 .
MySQL Access权限问题和用户相关表 .
MySQL安全功能和最佳实践 .
我希望这篇文章能帮助您修复MySQL中用户拒绝的MySQL错误代码1045访问权限 .
我希望你删除mysql中的debian-sys-maint用户也没有造成更多伤害
让你的mysql守护进程以正常方式运行 . 启动你的mysql客户端,如下所示
在另一个终端,
cat
文件/etc/mysql/debian.cnf
. 该文件包含密码;在提示时粘贴该密码 .http://ubuntuforums.org/showthread.php?t=1836919
我有一个类似的问题 - 在我第一次尝试以root身份进入MySql时,它告诉我拒绝访问 . 结果我忘了使用sudo ...
因此,如果您在root首次尝试失败,请尝试:
sudo mysql -u root -p
然后输入你的密码,这应该工作 .
我通过删除旧的错误用户'bill'条目来解决这个问题(这是重要的部分:来自 mysql.user 和 mysql.db ),然后创建了与之前悲伤相同的用户:
工作,用户正在连接 . 现在我将从中删除一些流行病:)
在窗口中,如何解决ERROR 1045(28000):拒绝访问用户'root'@'localhost'(使用密码:NO)
我遇到了同样的错误 . 无效的设置如下:
下面编辑的设置是让它工作的设置 . 请注意区别?
区别在于双引号 . 它们似乎在PHP中非常重要而不是Java,它们在转义字符,设置URL以及现在将参数传递给函数时都会产生影响 . 它们更漂亮(我知道),但总是尽可能使用单引号,然后双引号可以嵌入其中,如果有必要的话 .
当我在Linux机器上测试我的应用程序而不是Windows时,出现了这个错误环境 .
操作系统:Windows
我的错误消息是:“MySQL ERROR 1045(28000):拒绝访问用户'root'@'localhost'(使用密码:YES)”
我的理由是不用
administrator permission
打开cmd所以我的解决方案:用
administrator permission
打开cmd,然后就可以了 .MySQL帐户名由用户名和主机名组成,主机名中的“localhost”名称也表示本地主机您可以在主机名或IP地址值中使用通配符“%”和“_” . 这些与使用LIKE运算符执行的模式匹配操作具有相同的含义 . 例如,主机值'%'匹配任何主机名,而值'%.mysql.com'匹配mysql.com域中的任何主机 . '192.168.1 . %'匹配192.168.1 C类网络中的任何主机 .
以上只是介绍:
实际上,用户
'bill'@'localhost'
和'bill'@'%'
都是不同的MySQL帐户,因此两者都应该使用自己的身份验证详细信息,如密码 .有关更多信息,请参阅http://dev.mysql.com/doc/refman//5.5/en/account-names.html
当您运行
mysql -u bill -p
时,localhost
已解析为您的IP,因为它是127.0.0.1并且在您的/etc/hosts
文件中,因为默认值为127.0.0.1 localhost
. 因此,mysql将您解释为bill@localhost
,但未授予bill@'%'
. 这就是为什么在select host, user from mysql.user;
查询结果中root
用户有2条不同的记录 .有两种方法可以解决此问题 .
一种是在尝试登录时指定
/etc/hosts
文件未反向解析的ip . 例如,服务器的IP是10.0.0.2
. 当您运行命令mysql -u bill -p -h 10.0.0.2
时,您将能够登录 . 如果您输入select user();
,您将获得bill@10.0.0.2
. 当然,任何域名都不应该在/etc/hosts
文件中解析为此IP .其次,您需要为此特定域名授予访问权限 . 对于
bill@localhost
,您应该调用命令grant all privileges on *.* to bill@localhost identified by 'billpass';
. 在这种情况下,您将能够使用命令mysql -u bill -p
登录 . 登录后,select user();
命令返回bill@localhost
.但这只是因为您尝试在同一主机中登录mysql服务器 . 从远程主机,mysql表现出预期的行为,'%'将授予您登录权限 .
确保没有其他正在运行的SQL实例正在使用localhost帖子 . 在我们的例子中,另一个实例在与登录冲突的localhost上运行 . 关闭它解决了这个问题 .
如果您使用旧版本的MySQL UI(如SQLYoug)生成具有错误哈希的密码,也会出现此问题 .
使用SQL脚本创建用户将解决问题 .
我遇到了同样的问题,但在我的情况下,解决方案是由eggyal的评论解决的 . 我也有一个匿名用户,但删除它并没有解决问题 . “FLUSH PRIVILEGES”命令有效 .
令我惊讶的是,我使用MySQL Workbench创建了用户,我希望能够执行所有必要的功能来完成任务 .
百分号表示所有ip,因此localhost是多余的...不需要localhost的第二条记录 .
实际上,'localhost'在mysql中是特殊的,它意味着通过unix套接字(或我认为的Windows上的命名管道)的连接,而不是TCP / IP套接字 . 使用%作为主机不包含'localhost'
MySQL用户帐户有两个组件:用户名和主机名 . 用户名标识用户,主机名指定用户可以连接的主机 . 组合用户名和主机名以创建用户帐户:
'<user_name>'@'<host_name>'
您可以为主机名指定特定的IP地址或地址范围,或使用百分比字符("%")使该用户能够从任何主机登录 .请注意,用户帐户由用户名和主机名定义 . 例如,
'root'@'%'
是与'root'@'localhost'
不同的用户帐户 .在尝试访问使用具有非常长密码的compose构建的MYSQL docker容器时,我遇到了与OP相同的问题:
Reducing the password length并通过compose重建使我能够使用像Workbench这样的客户端访问MYSQL容器 .