我尝试了很多步骤来纠正这个问题。这个问题的可能解决方案有很多来源,很难从废话中过滤掉意义。我终于找到了一个很好的解决方案here:
第一步:识别数据库版本
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
第三步:不进行权限检查重启数据库服务器
如果您运行 MySQL 和 MariaDB 而没有加载有关用户权限的信息,它将允许您以 root 权限访问数据库命令行而无需提供密码。这将允许您在不知情的情况下访问数据库。
为此,您需要停止数据库加载存储用户权限信息的授权表。因为这有点安全风险,您还应该跳过网络以防止其他客户端连接。
在不加载授权表或启用网络的情况下启动数据库:
sudo mysqld_safe --skip-grant-tables --skip-networking &
此命令末尾的 & 符号将使此进程在后台运行,以便您可以继续使用您的终端。
现在您可以以 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');
确保用您选择的新密码替换new_password。
笔记:如果 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)
密码已更改,因此您现在可以停止数据库服务器的手动实例并像以前一样重新启动它。
第五步:正常重启数据库服务器
本教程进一步介绍了重新启动数据库的步骤,但我使用的唯一部分是:
对于 MySQL,使用:
sudo systemctl start mysql
对于 MariaDB,使用:
sudo systemctl start mariadb
现在您可以通过运行以下命令确认新密码已正确应用:
mysql -u root -p
该命令现在应提示输入新分配的密码。输入它,您应该可以按预期访问数据库提示符。
结论
您现在拥有对恢复的 MySQL 或 MariaDB 服务器的管理访问权限。确保您选择的新 root 密码安全可靠,并将其保存在安全的地方。