我尝试了很多步骤来纠正这个问题。 对于这个问题有很多可能解决方案的来源很难从废话中过滤出来。 我终于找到了一个很好的解决方案:
第1步:确定数据库版本
$ mysql --version
你会看到MySQL的一些输出:
$ mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
或者为MariaDB输出如下:
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
记下您正在运行的数据库和版本,稍后您将使用它们。 接下来,您需要停止数据库,以便手动访问它。
第2步:停止数据库服务器
要更改root密码,必须事先关闭数据库服务器。
你可以用MySQL做到这一点:
$ sudo systemctl stop mysql
对于MariaDB:
$ sudo systemctl stop mariadb
步骤3:在没有权限检查的情况下重新启动数据库服务器
如果在不加载有关用户权限的信息的情况下运行MySQL和MariaDB,则可以使用root权限访问数据库命令行而无需提供密码。 这将允许您在不知情的情况下访问数据库。
为此,您需要停止数据库加载存储用户权限信息的授权表。 因为这有一点安全风险,所以您也应该跳过网络以防止其他客户端连接。
在不加载授权表或启用网络的情况下启动数据库:
$ sudo mysqld_safe --skip-grant-tables --skip-networking &
此命令末尾的&符号将使此进程在后台运行,以便您可以继续使用终端。
现在,您可以以root用户身份连接到数据库,root用户不应该要求输入密码。
$ mysql -u root
您将立即看到数据库shell提示符。
MySQL提示
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
MariaDB提示
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
现在您具有root访问权限,您可以更改root密码。
第4步:更改Root密码
mysql> FLUSH PRIVILEGES;
现在我们可以实际更改root密码。
对于MySQL 5.7.6及更高版本以及MariaDB 10.1.20及更高版本,请使用以下命令:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
对于MySQL 5.7.5及更早版本以及MariaDB 10.1.20及更早版本,请使用:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
请务必使用您选择的新密码替换ALTER USER。
注意:如果ALTER USER命令不起作用,则通常表示更大的问题。 但是,您可以尝试UPDATE ... SET重置root密码。
[重要]这是修复我的特定问题的具体行:
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
请记住在此之后重新加载授权表。
在任何一种情况下,您都应该看到命令已成功执行的确认。
Query OK, 0 rows affected (0.00 sec)
密码已更改,因此您现在可以停止数据库服务器的手动实例并按原样重新启动它。
步骤5:正常重启数据库服务器
本教程进入了一些重新启动数据库的步骤,但我使用的唯一部分是:
对于MySQL,使用: $ sudo systemctl启动mysql
对于MariaDB,请使用:
$ sudo systemctl start mariadb
现在,您可以通过运行以下命令确认已正确应用新密码:
$ mysql -u root -p
该命令现在应该提示新分配的密码。 输入它,您应该按预期访问数据库提示。
结论
您现在可以恢复对MySQL或MariaDB服务器的管理访问权限。 确保您选择的新root密码强大且安全,并将其保存在安全的地方。