如何在Ubuntu18.04上重置您的MySQL或MariaDB根密码

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。

介绍

忘记密码经常发生在我们当中。 如果您忘记或丢失了 MySQL 或 MariaDB 数据库的 root 密码,如果您有权访问服务器和具有 sudo 权限的用户帐户,您仍然可以访问并重置密码。

注意: 在全新的 Ubuntu 18.04 安装中,默认的 MySQL 或 MariaDB 配置通常允许您在不提供密码的情况下访问数据库(具有完全管理权限),只要您从系统的 进行连接即可根 帐户。 在这种情况下,可能不需要重置密码。 在重置数据库 root 密码之前,请尝试使用 sudo mysql 命令访问数据库。 仅当更改了身份验证的默认配置并导致 access denied 错误时,请按照本教程中的步骤进行操作。


本教程演示如何在 Ubuntu 18.04 上为使用 apt 包管理器安装的 MySQL 和 MariaDB 数据库重置 root 密码。 更改 root 密码的过程会有所不同,具体取决于您是否安装了 MySQL 或 MariaDB,以及随发行版或其他供应商的软件包附带的默认 systemd 配置。 虽然本教程的说明可能适用于其他系统或数据库服务器版本,但它们已通过 Ubuntu 18.04 和分发提供的软件包进行了明确测试。

先决条件

要恢复您的 MySQL 或 MariaDB root 密码,您需要:

  • 使用 sudo 用户或其他以 root 权限访问服务器的方式访问运行 MySQL 或 MariaDB 的 Ubuntu 18.04 服务器。 为了在不影响生产服务器的情况下尝试本教程中的恢复方法,请使用 初始服务器设置教程 使用具有 sudo 权限的普通非 root 用户创建测试服务器。 然后按照 How to install MySQL on Ubuntu 18.04 安装 MySQL。

第 1 步 — 识别数据库版本并停止服务器

Ubuntu 18.04 运行 MySQL 或 MariaDB,这是一种与 MySQL 完全兼容的流行替代品。 您需要使用不同的命令来恢复 root 密码,具体取决于您安装了哪些密码,因此请按照本节中的步骤确定您正在运行的数据库服务器。

使用以下命令检查您的版本:

mysql --version

如果您正在运行 MariaDB,您将在输出中看到“MariaDB”前面带有版本号:

MariaDB outputmysql  Ver 15.1 Distrib 10.1.47-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

如果您正在运行 MySQL,您将看到如下输出:

MySQL outputmysql  Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using  EditLine wrapper

记下哪个数据库,因为这决定了在本教程的其余部分中要遵循的适当命令。

为了更改 root 密码,您需要关闭数据库服务器。 如果您正在运行 MariaDB,则可以使用以下命令执行此操作:

sudo systemctl stop mariadb

对于 MySQL,通过运行以下命令关闭数据库服务器:

sudo systemctl stop mysql

数据库停止后,您可以在安全模式下重新启动它以重置 root 密码。

第 2 步 — 在没有权限检查的情况下重新启动数据库服务器

在没有权限检查的情况下运行 MySQL 和 MariaDB 允许在不提供有效密码的情况下以 root 权限访问数据库命令行。 为此,您需要停止数据库加载存储用户权限信息的 授权表 。 由于这有点安全风险,您可能还需要禁用网络以防止其他客户端连接到临时易受攻击的服务器。

根据您安装的数据库服务器,在不加载 授权表 的情况下启动服务器的方式会有所不同。

将 MariaDB 配置为在没有授权表的情况下启动

为了在没有授权表的情况下启动 MariaDB 服务器,我们将使用 systemd 单元文件来设置 MariaDB 服务器守护进程的附加参数。

执行以下命令,设置 MariaDB 在启动时使用的 MYSQLD_OPTS 环境变量。 --skip-grant-tables--skip-networking 选项告诉 MariaDB 在不加载授权表或网络功能的情况下启动:

sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"

然后启动 MariaDB 服务器:

sudo systemctl start mariadb

此命令不会产生任何输出,但会重新启动数据库服务器,同时考虑到新的环境变量设置。

您可以确保它以 sudo systemctl status mariadb 开头。

现在您应该能够以 MariaDB root 用户身份连接到数据库,而无需提供密码:

sudo mysql -u root

您将立即看到一个数据库 shell 提示:

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

MariaDB [(none)]>

现在您可以访问数据库服务器,您可以更改 root 密码,如步骤 3 所示。

将 MySQL 配置为在没有授权表的情况下启动

为了在没有授权表的情况下启动 MySQL 服务器,您将更改 MySQL 的 systemd 配置,以便在启动时将额外的命令行参数传递给服务器。

为此,请执行以下命令:

sudo systemctl edit mysql

此命令将在 nano 编辑器中打开一个新文件,您将使用它来编辑 MySQL 的 服务覆盖 。 这些更改了 MySQL 的默认服务参数。 该文件将为空,因此添加以下内容:

MySQL 服务覆盖

[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid --skip-grant-tables --skip-networking

第一个 ExecStart 语句清除默认值,而第二个语句为 systemd 提供新的启动命令,包括禁用加载授权表和网络功能的参数。

CTRL-x 退出文件,然后按 Y 保存所做的更改,然后按 ENTER 确认文件名。

重新加载 systemd 配置以应用这些更改:

sudo systemctl daemon-reload

现在启动 MySQL 服务器:

sudo systemctl start mysql

该命令将不显示任何输出,但数据库服务器将启动。 授权表和网络将不会启用。

以 root 用户身份连接到数据库:

sudo mysql -u root

您将立即看到一个数据库 shell 提示:

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

mysql>

现在您可以访问服务器,您可以更改 root 密码。

第 3 步 — 更改 Root 密码

数据库服务器现在以受限模式运行; 授权表没有加载,也没有启用网络支持。 这使您可以在不提供密码的情况下访问服务器,但它会禁止您执行更改数据的命令。 要重置 root 密码,您必须加载授权表,因为您已经获得了对服务器的访问权限。

通过发出 FLUSH PRIVILEGES 命令告诉数据库服务器重新加载授权表:

FLUSH PRIVILEGES;

您现在可以更改 root 密码。 您使用的方法取决于您使用的是 MariaDB 还是 MySQL。

更改 MariaDB 密码

如果您使用 MariaDB,请执行以下语句为 root 帐户设置密码,确保将 new_password 替换为您会记住的强新密码:

UPDATE mysql.user SET password = PASSWORD('new_password') WHERE user = 'root';

您将看到此输出表明密码已更改:

OutputQuery OK, 1 row affected (0.00 sec)

MariaDB 允许使用自定义身份验证机制,因此请执行以下两个语句以确保 MariaDB 将使用其默认身份验证机制来处理您分配给 root 帐户的新密码:

UPDATE mysql.user SET authentication_string = '' WHERE user = 'root';
UPDATE mysql.user SET plugin = '' WHERE user = 'root';

您将看到每个语句的以下输出:

OutputQuery OK, 0 rows affected (0.01 sec)

密码现在已更改。 输入 exit 退出 MariaDB 控制台并继续执行步骤 4 以正常模式重新启动数据库服务器。

更改 MySQL 密码

对于 MySQL,执行以下语句来更改 root 用户的密码,将 new_password 替换为您会记住的强密码:

UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE user = 'root';

您将看到此输出表明密码已成功更改:

OutputQuery OK, 1 row affected (0.00 sec)

MySQL 允许使用自定义身份验证机制,因此执行以下语句告诉 MySQL 使用其默认身份验证机制使用新密码对 root 用户进行身份验证:

UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root';

您将看到类似于上一个命令的输出:

OutputQuery OK, 1 row affected (0.00 sec)

密码现在已更改。 通过键入 exit 退出 MySQL 控制台。

让我们以正常操作模式重新启动数据库。

第 4 步 — 将您的数据库服务器恢复为正常设置

为了以正常模式重新启动数据库服务器,您必须恢复所做的更改,以便启用网络并加载授权表。 同样,您使用的方法取决于您使用的是 MariaDB 还是 MySQL。

对于 MariaDB,取消设置您之前设置的 MYSQLD_OPTS 环境变量:

sudo systemctl unset-environment MYSQLD_OPTS

然后,使用 systemctl 重启服务:

sudo systemctl restart mariadb

对于 MySQL,删除修改后的 systemd 配置:

sudo systemctl revert mysql

您将看到类似于以下内容的输出:

OutputRemoved /etc/systemd/system/mysql.service.d/override.conf.
Removed /etc/systemd/system/mysql.service.d.

然后,重新加载 systemd 配置以应用更改:

sudo systemctl daemon-reload

最后,重启服务:

sudo systemctl restart mysql

数据库现在重新启动并恢复到正常状态。 通过使用密码以 root 用户身份登录,确认新密码有效:

mysql -u root -p

系统将提示您输入密码。 输入您的新密码,您将按预期访问数据库提示。

结论

您已恢复对 MySQL 或 MariaDB 服务器的管理访问权限。 确保您选择的新密码安全可靠,并将其保存在安全的地方。

有关其他版本的 MySQL 或 MariaDB 的用户管理、身份验证机制或重置数据库密码的方法的更多信息,请参阅官方 MySQL 文档MariaDB 文档