MySQL:除了root用户外,用户'test'@'localhost'被拒绝访问(使用密码:是)

130

我在mysql非root/admin用户方面遇到问题,我正在按照以下步骤创建用户及其权限,如果我做错了,请纠正我:

我正在安装mysqlRHEL 5.7 64bit上,以下是所需的软件包。一旦完成了rpm install,我们就会:

  1. 使用mysql_install_db创建mysql数据库,然后
  2. 启动mysql服务,然后
  3. 使用mysql_upgrade也对服务器进行操作。

完成此过程后,我可以使用root登录,但是使用非root用户无法登录到服务器:

[root@clustertest3 ~]# rpm -qa | grep MySQL
MySQL-client-advanced-5.5.21-1.rhel5
MySQL-server-advanced-5.5.21-1.rhel5


[root@clustertest3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[root@clustertest3 ~]# ls -ld /var/lib/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0 Nov  30 11:09 /var/lib/mysql/mysql.sock

mysql> CREATE USER 'golden'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON * . * TO 'golden'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT USER(),CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)

[root@clustertest3 ~]# mysql -ugolden -p
Enter password:
ERROR 1045 (28000): Access denied for user 'golden'@'localhost' (using password: YES)

这是我面临的问题,有没有解决方案?


你能以root身份登录,然后执行“SELECT * FROM mysql.user”吗? - Noam Rathaus
1
请接受解决了您问题的答案,这样其他用户就会知道您是如何解决问题的。 - ReinstateMonica3167040
19个回答

74

不要将所有数据库的所有特权授予非root用户,这是不安全的(而您已经拥有具有该角色的“root”)

GRANT <privileges> ON database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这个语句创建一个新用户并授予选定的权限。

例如:

GRANT INSERT, SELECT, DELETE, UPDATE ON database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

请查看文档以查看所有详细的权限

编辑:您可以使用此查询(以“root”身份登录)查找更多信息:

select Host, User from mysql.user;
为了查看发生了什么事情。

5
关于 root 的说法,我不同意。是的,你不应该随意授予超级权限。然而,通常也不应该使用共享帐户,因为在数据库中没有适当的审计跟踪。如果您必须拥有共享帐户(如 root),则需要其他措施来确保审计跟踪完整。 - krad

47

如果您正在使用远程机器(例如工作台)等连接到MySQL,请按照以下步骤在安装了MySQL的操作系统上消除此错误

mysql -u root -p

CREATE USER '<<username>>'@'%%' IDENTIFIED BY '<<password>>';
GRANT ALL PRIVILEGES ON * . * TO '<<username>>'@'%%';
FLUSH PRIVILEGES;
尝试登录MYSQL实例。
对我来说,这样做可以消除这个错误。

2
即使运行“mysql -u root -p”,它仍然提示错误,因此连那个也无法工作。 - Marian Klühspies

32

尝试:

CREATE USER 'golden'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'golden'@'localhost';
FLUSH PRIVILEGES;

或者更好的方法是使用:mysql_setpermission来创建该用户。


1
这并不能解决问题。CREATE USER 'goldy'@'%' IDENTIFIED BY 'some_pass'; 是一个有效的查询。 - pratim_b
由于某些原因,他的“%”应该适用于所有主机,但却没有解决问题。因此,通过指定“localhost”,它应该可以工作。如果这样仍然不起作用,则mysql中有问题。 - Noam Rathaus

18

看起来你正在试图创建一个用户'golden'@'%',但是名为'golden'@'localhost'的不同用户正在干扰/拥有优先权。

执行此命令以查看用户:

SELECT user,host FROM mysql.user;

你应该看到两个条目:

1)用户=golden,主机=%

2)用户=golden,主机=localhost

执行这些命令:

DROP User 'golden'@'localhost';
DROP User 'golden'@'%';

重新启动MySQL Workbench。

然后再执行您原来的命令:

CREATE USER 'golden'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'golden'@'%';

然后当您尝试登录MySQL时,请按以下方式输入:

在此输入图像描述

点击“测试连接”,并输入您的密码“password”。


2
这是我在这里找到的唯一有些意义的解决方案。谢谢您,先生。 - Sumuk Shashidhar

12

First I created the user using :

CREATE user user@localhost IDENTIFIED BY 'password_txt';

经过谷歌搜索并查看此链接,我使用以下方法更新了用户密码:

SET PASSWORD FOR 'user'@'localhost' = PASSWORD('password_txt');

然后我可以随后连接。


3

对于所有尝试了所有建议但问题仍然存在的人。

检查存储过程和视图定义者。这些定义者可能已经不存在了。

我的问题出现在我们将通配符主机(%)更改为特定IP时,使数据库更加安全。不幸的是,有一些视图仍在使用'user'@'%',即使'user'@'172....'在技术上是正确的。


感谢让我找到正确的方向。我甚至不知道视图和存储过程上的SQL安全设置。最终,我将视图的SQL安全设置为Invoker,以便它使用执行命令的用户的权限,而不是创建视图的用户的权限。以下是参考链接:https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html - Justin

3

我也遇到了类似的问题,后来发现是因为我更改了主机名(不是localhost)。

因此,我通过指定--host=127.0.0.1来解决了这个问题。

mysql -p mydatabase --host=127.0.0.1

3
根据您创建用户的方式,MySQL解释的方式也不同。例如,如果您像这样创建用户:
create user user01 identified by 'test01';

MySQL希望您授予一些权限,使用grant all on <your_db>.* to user01;

不要忘记flush privileges;

但是,如果您像这样创建用户(通过传递IP地址),则必须将其更改为:

create user 'user02'@'localhost' identified by 'teste02';

所以,要给予一些特权,你需要这样做:
grant all on <your_db>.* to user02@localhost;
flush privileges;

2

请确保用户在用户表中有本地主机条目。这就是我遇到的问题。例如:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

2

试试这个:

如果您已经创建了用户,则可能使用错误的密码创建了用户。

因此,请删除该用户并通过以下方式创建另一个用户,以查看当前用户:

SELECT Host,User FROM mysql.user;

要删除用户:

DROP User '<your-username>'@'localhost';

之后,您可以使用正确的密码再次创建用户:

CREATE USER '<your-username>'@'localhost' IDENTIFIED WITH mysql_native_password BY '<correct password>';

然后执行:

FLUSH PRIVILEGES;

如果您仍然遇到访问数据库的其他错误,请运行以下命令进行授权:

GRANT ALL PRIVILEGES ON *.* to '<your-username>'@'localhost';


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接