无法重置MySQL(MariaDB)根密码


35

今天,我想在PMA中创建一个数据库。它说:“无法登录到MySQL服务器”。我通过终端尝试了同样的问题,这是因为我的密码错误。我不明白为什么。

我尝试了通常的方法来重置根密码(跳过安装授权表并重置密码),但似乎不起作用。

看到:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Answers:


56

我发现了一个与问题本身一样奇怪的解决方案。

使用--skip-grant-tables(在Web上搜索教程)重新启动MySQL / MariaDB 。(完全没有必要,请在文章末尾阅读我的编辑内容)

查看表中的plugin字段mysql.user

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

我必须将每个条目的插件字段重置为空白字符串。

UPDATE user SET plugin="";   // without WHERE clause

另外,请确保已定义密码,因为有时密码似乎已被删除(在user, password字段中选择)。如果不是,请使用以下命令进行更新:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

特权参数需要显式保存:

FLUSH PRIVILEGES;

然后,以正常模式重启MySQL,您应该能够连接到root帐户。

这不一定会禁用通过Unix套接字的连接。修复MySQL VA之后,在PMA中,我可以看到该连接是通过Unix套接字建立的。

编辑,几个月后:我现在经常会经常出现此问题,我认为在MariaDB的每次更新中(或类似的东西)。因此我对探针有了更好的理解; 有一个UNIX_SOCKET插件,可以让您登录MariaDB帐户而无需创建密码,因为它使用外壳程序的凭据信任您,而无需输入任何密码。实际上,此插件是身份验证插件,而不是与SQL Server通信的方法。因此,如果您不使用unix套接字作为登录方法,则可以安全地禁用它。我唯一无法解释的是为什么在数据库的每个帐户上都定期设置UNIX_SOCKET插件,而无需采取任何措施。

这样做的好处是,发生这种情况时,您无需重新启动MariaDB即可登录SQL Server --skip-grant-tables:只需登录到系统的root帐户,然后使用mysql -u root不带密码的方式连接,然后在上面说明的方式。

编辑2:确认,它发生在Ubuntu上的每个MariaDB升级上。


1
这至少会中断Ubuntu 16.04上的维护cron作业,因为该脚本希望使用套接字插件在没有密码的情况下登录。有关详细信息,请参见superuser.com/questions/957708/…
科兰

好的,很有趣,但是这不再发生了(我的旧密码设置现在不会随机中断)。也许现在仅在root用户上设置Unix套接字插件?现在无法检查。但是我不喜欢操作系统为我决定要使用哪种身份验证设置的想法。
Morgan Touverey Quilling '16

这个问题很糟糕,发生在Debian 9上,当我安装MariaDB时没有询问root密码,甚至无法重置它。我希望升级后不会再次发生。我们应该用MySQL代替MariaDB以避免此类问题吗?
baptx

不确定它是否仍会发生,它可能已修复(如果有人知道,我可以编辑该帖子)。也许它仅在安装时发生,这将是一个很好的默认设置。
Morgan Touverey Quilling

1
我只是注意到,如果我们不为root用户使用unix套接字插件,它将无法在最新的Debian:上安装phpmyadmin软件包ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)。因此,最好的解决方案是继续将默认的unix套接字身份验证与command一起使用sudo mysql -u root,我认为这也是更安全和高效的。
baptx '17

5

通过此答案,http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227

Mysql尝试使用插件而非密码对root进行身份验证。您需要为root禁用插件使用。

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
这正是我发布的答案。
Morgan Touverey Quilling

1
与您的更新有关的汇总更加简洁。
小马

我什至无法获得mysql shell,因此即使我Could not open mysql.plugin table.在错误日志中看到了该信息,在我的情况下也无法使用。
戴夫·埃弗里特

0

如前所述进行连接:

mysqld_safe --skip-grant-tables

日志文件将显示:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

搜索列出的日志(在本例中为/usr/local/mysql/data/ab123456.domain.com.err)以查找正确的套接字:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

并在mysql连接中使用它:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

我得到了,$ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/var但是被扔回了bash提示符。
戴夫·埃弗里特

0

默认情况下,marriadb使用“ unix_socket”身份验证插件设置密码,该密码应为“ mysql_native_password”,因此

切换数据库

use mydatabase;

首先看到女巫插件设置好了。

SELECT user, plugin FROM user;

将其设置为“ mysql_native_password”

UPDATE user SET plugin="mysql_native_password"; 

设置新密码...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.