我正在建立一个新的服务器,一直遇到这个问题。
当我试图用根用户登录到MySQL数据库时,我得到了错误。
ERROR 1698 (28000):用户'root'@'localhost'的访问被拒绝。
如果我通过终端(SSH)、PHPMyAdmin或MySQL客户端(如Navicat)连接,这并不重要。他们都失败了。
我查看了mysql.user表,得到以下结果。
+------------------+-------------------+
| user | host |
+------------------+-------------------+
| root | % |
| root | 127.0.0.1 |
| amavisd | localhost |
| debian-sys-maint | localhost |
| iredadmin | localhost |
| iredapd | localhost |
| mysql.sys | localhost |
| phpmyadmin | localhost |
| root | localhost |
| roundcube | localhost |
| vmail | localhost |
| vmailadmin | localhost |
| amavisd | test4.folkmann.it |
| iredadmin | test4.folkmann.it |
| iredapd | test4.folkmann.it |
| roundcube | test4.folkmann.it |
| vmail | test4.folkmann.it |
| vmailadmin | test4.folkmann.it |
+------------------+-------------------+
如你所见,root应该有权限。
服务器很简单,因为我已经尝试解决这个问题有一段时间了。
它运行的是Ubuntu 16.04.1 LTS,带有Apache、MySQL和PHP,因此它可以托管网站,还有iRedMail 0.9.5-1,因此它可以托管邮件。
在我安装iRedMail之前,登录到MySQL数据库的工作很正常。我也试过,只安装iRedMail,但然后root,也不工作......
如果有人能告诉我如何解决我的MySQL登录问题或如何在现有的MySQL安装基础上安装iRedMail。是的,我试过安装提示,我在配置文件中找不到这些变量。
一些系统如Ubuntu,mysql默认使用UNIX auth_socket插件。
基本上意味着。db_users使用它,将通过系统用户credentias进行"auth"。你可以通过以下操作查看你的root
用户是否被设置成这样。
$ sudo mysql -u root # I had to use "sudo" since is new installation
mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------------------+
| User | plugin |
+------------------+-----------------------+
| root | auth_socket |
| mysql.sys | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+
正如你在查询中看到的,root'用户正在使用
auth_socket'插件
有2种方法来解决这个问题。
1.你可以设置根用户使用mysql_native_password
插件
2.2. 你可以用你的system_user
创建一个新的db_user
(推荐)。
选项1:__
$ sudo mysql -u root # I had to use "sudo" since is new installation
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ service mysql restart
选项2:(用你的用户名替换YOUR_SYSTEM_USER)。
$ sudo mysql -u root # I had to use "sudo" since is new installation
mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ service mysql restart
记住,如果你使用选项2,你就必须以你的系统用户名连接到mysql(mysql -u YOUR_SYSTEM_USER
)。
注意:在一些系统(例如,Debian stretch)中,'auth_socket'插件被称为['unix_socket'](https://mariadb.com/kb/en/library/authentication-plugin-unix-socket/),因此相应的SQL命令应该是。`UPDATE user SET plugin='unix_socket' WHERE User='YOUR_SYSTEM_USER';`。
更新:
从@andy'的评论来看,似乎mysql 8.x.x更新/替换了auth_socket
用于caching_sha2_password
,我没有设置mysql 8.x.x的系统来测试,但是上面的步骤应该可以帮助你理解这个问题。以下是答复。
从MySQL 8.0.4开始的一个变化是,新的默认认证插件是'caching_sha2_password'。新的'YOUR_SYSTEM_USER'将有这个认证插件,你现在可以用"mysql -u YOUR_SYSTEM_USER -p"从bash shell登录,并在提示中提供该用户的密码。不需要进行"UPDATE user SET plugin"步骤。关于8.0.4的默认auth插件的更新,请参见,https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/。
我建议删除Mysql连接----。
UPDATE-这是针对Mysql 5.5版本的,如果你的版本不同,请相应地改变第一行的内容
sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.5 mysql-client-core-5.5
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt-get autoremove
sudo apt-get autoclean
然后重新安装,但这次要自己设置一个root密码。 这将节省大量的精力。
sudo apt-get update
sudo apt-get install mysql-server
你想用root用户访问MySQL,但你没有提供root的正确密码。
如果你需要为root设置一个新的密码,MySQL网站有关于如何做的很好的文档:http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html
我不会在这里展示这个过程,因为MySql文档在上述链接中它是清晰而简洁的**。