Ali*_*Ali 399 mysql access-denied
首先让我提一下,我已经经历了许多建议的问题,并没有找到相关的答案.这就是我正在做的事情.
我已连接到我的Amazon EC2实例.我可以使用以下命令使用MySQL root登录:
mysql -u root -p
Run Code Online (Sandbox Code Playgroud)
然后我用主机%创建了一个新的用户账单
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Run Code Online (Sandbox Code Playgroud)
授予用户账单的所有权限:
grant all privileges on *.* to 'bill'@'%' with grant option;
Run Code Online (Sandbox Code Playgroud)
然后我从root用户退出并尝试使用bill登录:
mysql -u bill -p
Run Code Online (Sandbox Code Playgroud)
输入正确的密码并收到此错误:
ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:YES)
Ran*_*eed 421
您可能有一个匿名用户''@'localhost'或''@'127.0.0.1'.
根据手册:
当可能存在多个匹配项时,服务器必须确定要使用哪些匹配项.它解决了这个问题如下:(...)
- 当客户端尝试连接时,服务器按排序顺序查看[表mysql.user]的行.
- 服务器使用与客户端主机名和用户名匹配的第一行.
(...)服务器使用排序规则,首先对具有最特定主机值的行进行排序.文字主机名[例如"localhost"]和IP地址是最具体的.
因此,这样的匿名用户将"屏蔽"任何其他用户,就像'[any_username]'@'%'连接时一样localhost.
'bill'@'localhost'匹配'bill'@'%',但会匹配(例如)''@'localhost'beforehands.
推荐的解决方案是删除这个匿名用户(这通常是一件好事).
以下编辑主要与主要问题无关.这些仅用于回答本主题中其他评论中提出的一些问题.
编辑1
'bill'@'%'通过套接字进行身份验证.
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
Welcome to the MySQL monitor (...)
mysql> SELECT user, host FROM mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| bill | % |
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| bill@localhost | bill@% |
+----------------+----------------+
1 row in set (0.02 sec)
mysql> SHOW VARIABLES LIKE 'skip_networking';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | ON |
+-----------------+-------+
1 row in set (0.00 sec)
编辑2
完全相同的设置,除了我重新激活网络,我现在创建一个匿名用户''@'localhost'.
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Welcome to the MySQL monitor (...)
mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
Query OK, 0 rows affected (0.00 sec)
mysql> Bye
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket=/tmp/mysql-5.5.sock
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
编辑3
与编辑2中的情况相同,现在提供匿名用户的密码.
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Welcome to the MySQL monitor (...)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| bill@localhost | @localhost |
+----------------+----------------+
1 row in set (0.01 sec)
结论1,来自编辑1:可以'bill'@'%'通过套接字进行身份验证.
结论2,从编辑2:无论是通过TCP连接还是通过套接字连接都不会对身份验证过程产生影响(除了一个人不能像其他人一样连接,但'something'@'localhost'通过套接字,显然).
结论3,来自编辑3:虽然我指定了-ubill,但我被授予了匿名用户的访问权限.这是因为上面提到的"排序规则".请注意,在大多数默认安装中,存在无密码的匿名用户(应该保护/删除).
小智 136
尝试:
~$ mysql -u root -p
Enter Password:
mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Run Code Online (Sandbox Code Playgroud)
Rol*_*DBA 71
当你跑
mysql -u bill -p
Run Code Online (Sandbox Code Playgroud)
并得到了这个错误
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)
mysqld期待你连接为 bill@localhost
尝试创建 bill@localhost
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
Run Code Online (Sandbox Code Playgroud)
如果要远程连接,则必须使用TCP/IP指定DNS名称,公共IP或127.0.0.1:
mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP
Run Code Online (Sandbox Code Playgroud)
登录后,请运行此命令
SELECT USER(),CURRENT_USER();
Run Code Online (Sandbox Code Playgroud)
USER()报告您尝试在MySQL中进行身份验证的方式
CURRENT_USER()报告如何允许您从mysql.user表中在MySQL中进行身份验证
这将使您更好地了解允许您登录mysql的方式和原因.为什么这个观点很重要?它与用户身份验证订购协议有关.
这是一个例子:我将在我的桌面MySQL上创建一个匿名用户
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)
mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| x | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| | % |
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
好的,请注意以匿名用户身份登录:
C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select user(),current_user();
+---------------+----------------+
| user() | current_user() |
+---------------+----------------+
| rol@localhost | @% |
+---------------+----------------+
1 row in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
身份验证排序非常严格.它从最具体到最低的检查.我在DBA StackExchange中写了关于这种身份验证风格的文章.
不要忘记在必要时显式调用TCP作为mysql客户端的协议.
gar*_*mac 20
超级到此为止
我尝试了所有这些其他答案并运行了许多不同的版本mysql -u root -p但从未运行过
mysql -u root -p
只需按[ENTER]密码即可.
一旦我做到了,它就有效了.希望这有助于某人.
Dav*_*eli 18
我有一个有点类似的问题 - 在我第一次尝试进入 MySQL 时root,它告诉我拒绝访问。原来我忘记使用sudo...
因此,如果您root第一次尝试失败,请尝试:
sudo mysql -u root -p
Run Code Online (Sandbox Code Playgroud)
然后输入您的密码,这应该可以工作。
nos*_*nos 17
键入时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地址.
mst*_*ram 16
我的案例中的一个相关问题是尝试连接使用:
mysql -u mike -p mypass
Run Code Online (Sandbox Code Playgroud)
空白显然是允许的-u#UNAME#之间,但不是在-p和#密码#之间
因此需要:
mysql -u mike -pmypass
Run Code Online (Sandbox Code Playgroud)
否则在-p mypass mysql 之间使用空格将'mypass'作为数据库名称
Li *_*jun 16
如果您忘记了密码或想要修改密码.您可以按照以下步骤操作:
1:停止你的mysql
[root @maomao~] #service mysqld stop
停止MySQL:[确定]2:使用"--skip-grant-tables"重启mysql
[root @mcy400~] #mysqld_safe --skip-grant-tables
[root @ cy400~]#用/ var/lib/mysql中的数据库启动mysqld守护进程3:打开一个新窗口并输入mysql -u root
[root @ cy400~] #mysql -u root
欢迎使用MySQL监视器.命令以;结尾; 或\ g.4:更改用户数据库
mysql>使用mysql
读取表信息以完成表名和列名您可以关闭此功能以更快地启动-A数据库已更改5:修改密码你的新密码应输入"()"
mysql> update user set password = password('root123')where user ='root';
查询正常,3行受影响(0.00秒)
匹配的行数:3已更改:3警告:06:同花顺
mysql> flush特权;
7:退出
mysql>退出
再见8:重启mysql
[root @ cy400~] #service mysqld restart;
停止MySQL:[确定]
启动MySQL:[确定]
Bingo!您可以使用您的用户名和新密码连接数据库:
[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor. Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye
Run Code Online (Sandbox Code Playgroud)
mim*_*lea 14
避开主要问题...你的问题可能是你错过了密码周围的引号.至少那是我的情况,绕了我3个小时.
[client]
user = myusername
password = "mypassword" # <----------------------- VERY IMPORTANT (quotes)
host = localhost
Run Code Online (Sandbox Code Playgroud)
http://dev.mysql.com/doc/refman/5.7/en/option-files.html
搜索"这是一个典型的用户选项文件:"并查看它们在那里说明的示例.祝你好运,我希望能节省一些时间.
fev*_*lou 12
解决方案是删除匿名(Any)用户!
我在其他人的服务器设置上也遇到了同样的问题.我通常不会在安装MySQL时选择创建匿名用户,所以没有注意到这一点.最初我以"root"用户身份登录并创建了几个"普通"用户(也就是用户只在dbs上使用其用户名作为前缀的权限),然后注销,然后继续验证第一个普通用户.我无法登录.既不通过phpMyAdmin,也不通过shell.事实证明,罪魁祸首是这个"任何"用户.
我找到的最佳解决方案是.
我的用户是声纳,每当我尝试从外部或其他机器连接到我的数据库时,我收到错误
ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)
此外,当我从另一台机器和Jenkins工作尝试这个时,我的访问URL是
alm-lt-test.xyz.com
Run Code Online (Sandbox Code Playgroud)
如果要远程连接,可以使用以下不同方式指定它:
mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP
Run Code Online (Sandbox Code Playgroud)
要使用URL访问它,您只需执行以下查询.
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';
Run Code Online (Sandbox Code Playgroud)
这是以下之间的区别:
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Run Code Online (Sandbox Code Playgroud)
和
CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';
Run Code Online (Sandbox Code Playgroud)
核实:
mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user | host |
+---------------+----------------------------+
| bill | % | <=== created by first
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
| bill | localhost | <=== created by second
+---------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)
命令
mysql -u bill -p
Run Code Online (Sandbox Code Playgroud)
隐式访问 'bill'@'localhost' 而不是 'bill'@'%'。
'bill'@'localhost' 没有权限
你得到错误:
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)
解决问题:
CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';
grant all privileges on . to 'bill'@'localhost' with grant option;
Run Code Online (Sandbox Code Playgroud)
好的,我不确定,但可能这是 mysql 安装目录中的 my.cnf 文件是罪魁祸首。注释掉这一行,问题可能会得到解决。
bind-address = 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
不确定其他人是否会觉得这有帮助,但我遇到了同样的错误,并搜索了所有匿名用户……但没有。问题最终是用户帐户设置为“需要 SSL” - 我在 PHPMyAdmin 中通过转到用户帐户并单击用户的编辑权限找到了它。一旦我取消选中此选项,一切都按预期进行!
当您的密码包含一些特殊字符(如 @、$ 等)时,也会发生这种情况。为了避免这种情况,您可以将密码用单引号引起来:
$ mysql -usomeuser -p's0mep@$$w0Rd'
Run Code Online (Sandbox Code Playgroud)
或者输入时不使用密码。将其留空,然后在终端询问时键入。这是推荐的方式。
$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Run Code Online (Sandbox Code Playgroud)
更新:在 v8.0.15(可能是这个版本)上该PASSWORD()功能不起作用。
你必须:
sudo mysqld_safe --skip-grant-tablesmysql -u rootUPDATE mysql.user SET authentication_string=null WHERE User='root';FLUSH PRIVILEGES;exit; mysql -u rootALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';