简而言之,关于MariaDB
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
在这里,您将使用您想要的密码替换NEWPASSWORD,并且其他内容保持不变。
问题在于当安装/更新MariaDB或MySQL时(特别是如果在某个时候设置了root而没有密码),则在用户表中实际上密码为空(或被忽略),登录取决于与MySQL用户对应的系统用户。
您可以通过切换到系统根目录,然后输入以下命令来测试:
mysql -uroot -p
然后输入无密码或者错误的密码。你很可能会被放行。(甚至可以通过简单地使用
# mysql
作为密码并定义用户来从unix root登录)。
那么发生了什么呢?如果你以root身份登录并执行以下操作:
select User,host,plugin from mysql.user;
+----------------+-----------+-----------------------+
| User | host | plugin |
+----------------+-----------+-----------------------+
| root | localhost | auth_socket |
+----------------+-----------+-----------------------+
你会注意到
auth_socket
(在MariaDB上可能是
unix_socket
)。这些套接字忽略密码,并允许相应的Unix用户在没有密码检查的情况下登录。这就是为什么你可以用
root登录,但不能用其他用户登录的原因。
所以解决方案是更新用户,不使用
auth_socket/unix_socket
,并正确设置密码。
在MariaDB(<10.2,请参见下面的评论)上,这对于Ubuntu 16版本(截至2017年)应该足够了。NEWPASSWORD是你的密码。
mysql_native_password
你要逐字输入。
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
(将插件设置为空可能会起作用。结果因人而异。我没有尝试过这个方法,所以这是一个替代方案。)
UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
否则:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';
然后
FLUSH PRIVILEGES;
就记录而言,涉及删除用户并使用“%”重新创建用户的解决方案使我完全被锁定在数据库之外,并且除非您完全正确地编写
grant
语句,否则可能会引起其他问题 - 更容易的方法是简单地更新您已经拥有的root用户。
根据我的经验,这个问题只会发生在root用户上,因为其他用户将手动添加,而不是作为初始安装/更新的一部分。
UPDATE mysql.user SET plugin='unix_socket' WHERE user='root'; flush privileges```
- Wolfgang Fahlalter user root@localhost identified by unix_socket
。操作mysq.user表的时代已经过去了。请使用提供的SQL语句。 - danblack