无法重置 MySQL(MariaDB)根密码

无法重置 MySQL(MariaDB)根密码

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

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

看到这个:

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'

答案1

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

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

看一下pluginmysql.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 帐户而不必创建密码,因为它使用 shell 的凭据来信任你,而无需输入任何密码。事实上,这个插件是一个身份验证插件而不是与 SQL 服务器通信的方法。因此,如果您不使用 unix 套接字作为登录方法,则可以安全地禁用它。我唯一无法解释的是,为什么 UNIX_SOCKET 插件定期在数据库的每个帐户上设置,而我这边没有任何操作。

这有一个很好的副作用,当它发生时,您可以登录到 SQL 服务器而不必重新启动 MariaDB --skip-grant-tables:只需登录到系统的根帐户,然后只需mysql -u root无需密码连接,然后按照上面解释的方式重置插件字段。

编辑2:已确认,它发生在 Ubuntu 上每次 MariaDB 升级时。

答案2

从这个答案来看,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

答案3

按前面所述进行连接:

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

答案4

默认情况下,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';

相关内容