如何在 Ubuntu 18.04 上重置 MySQL 或 MariaDB 根密码

作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。

介绍

如果您忘记或丢失了您的MySQL或MariaDB数据库的 root密码,您仍然可以获得访问和重置密码,如果您有访问服务器和用户帐户具有sudo特权。

<$>[注] 注: 在新的 Ubuntu 18.04 安装中,默认 MySQL 或 MariaDB 配置通常允许您访问数据库(具有完整的管理权限)而不提供密码,只要您从系统的 root 帐户进行连接。在这种情况下,可能不需要重置密码。在重置您的数据库 root 密码之前,请尝试使用sudo mysql命令访问数据库。

本教程展示了如何重置在Ubuntu 1804上的apt包管理器上安装的MySQL和MariaDB数据库的 root密码。更改根密码的程序取决于您是否安装了MySQL或MariaDB以及与其他供应商的分发或包装的默认 systemd配置。

前提条件

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

  • 访问运行 MySQL 或 MariaDB 的 Ubuntu 18.04 服务器,使用 sudo 用户或其他方法访问具有 root 特权的服务器. 为了尝试本教程中的恢复方法而不会影响您的生产服务器,请使用 初始服务器设置教程创建一个测试服务器,使用普通的,非 root 用户,具有 sudo 特权。 然后安装 MySQL 以下 如何在 Ubuntu 18.04 上安装 MySQL

步骤 1 – 识别数据库版本并停止服务器

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

通过以下命令检查您的版本:

1mysql --version

如果您正在运行 MariaDB,则将在输出中看到MariaDB和版本号:

1[secondary_label MariaDB output]
2mysql Ver 15.1 Distrib 10.1.47-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

如果你正在运行MySQL,你会看到这样的输出:

1[secondary_label MySQL output]
2mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper

记住哪个数据库,因为这决定了本教程的其余部分要遵循的相应命令。

要更改 root密码,您需要关闭数据库服务器. 如果您正在运行 MariaDB,您可以使用以下命令:

1sudo systemctl stop mariadb

对于 MySQL,关闭数据库服务器,运行:

1sudo systemctl stop mysql

随着数据库停止,您可以在安全模式中重新启动数据库,以重置根密码。

步骤 2 — 重新启动数据库服务器而无需权限检查

运行 MySQL 和 MariaDB 无需权限检查,可以使用根权限访问数据库命令行,而无需提供有效密码. 要做到这一点,您需要阻止数据库加载 grant tables,该数据库存储用户权限信息。

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

设置 MariaDB 以启动没有 Grant 表

为了在没有授权表的情况下启动MariaDB服务器,我们将使用systemd单元文件为MariaDB服务器戴蒙设置额外参数。

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

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

然后开始 MariaDB 服务器:

1sudo systemctl start mariadb

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

您可以确保它始于sudo systemctl status mariadb

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

1sudo mysql -u root

您将立即看到数据库壳提示:

1[secondary_label MariaDB prompt]
2Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
3
4MariaDB [(none)]>

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

配置 MySQL 以便在没有 Grant 表的情况下启动

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

要做到这一点,请执行以下命令:

1sudo systemctl edit mysql

这个命令将打开一个新的文件在nano编辑器中,你将使用它来编辑MySQL的 service overrides。这些改变了MySQL的默认服务参数。

1[label MySQL service overrides]
2[Service]
3ExecStart=
4ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid --skip-grant-tables --skip-networking

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

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

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

1sudo systemctl daemon-reload

现在开始使用 MySQL 服务器:

1sudo systemctl start mysql

该命令不会显示输出,但数据库服务器将启动。

作为 root 用户连接到数据库:

1sudo mysql -u root

您将立即看到数据库壳提示:

1[secondary_label MySQL prompt]
2Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
3
4mysql>

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

步骤三:更改 root 密码

数据库服务器现在运行在有限模式下;授权表不加载,并且没有启用网络支持。这允许您在不提供密码的情况下访问服务器,但禁止您执行改变数据的命令。

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

1FLUSH PRIVILEGES;

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

更改MariaDB密码

如果您正在使用 MariaDB,请执行以下命令来为 root帐户设置密码,确保将new_password替换为您记住的强大新密码:

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

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

1[secondary_label Output]
2Query OK, 1 row affected (0.00 sec)

MariaDB 允许使用自定义身份验证机制,所以执行以下两个陈述,以确保 MariaDB 将使用其默认身份验证机制为您分配给 root 帐户的新密码:

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

您将看到每个陈述的下列输出:

1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)

现在,密码已更改. 输入退出以退出 MariaDB 控制台,然后转到步骤 4 以在正常模式下重新启动数据库服务器。

更改MySQL密码

对于 MySQL,执行以下语句来更改用户的 root密码,以你会记得的强有力的密码代替new_password:

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

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

1[secondary_label Output]
2Query OK, 1 row affected (0.00 sec)

MySQL 允许使用自定义身份验证机制,所以执行以下命令告诉 MySQL 使用其默认身份验证机制以使用新密码验证 root 用户:

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

你会看到类似于上一个命令的输出:

1[secondary_label Output]
2Query OK, 1 row affected (0.00 sec)

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

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

步骤 4 – 将数据库服务器恢复到正常设置

为了在正常模式下重新启动数据库服务器,您必须重启所做的更改,以便启用网络并加载授权表。

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

1sudo systemctl unset-environment MYSQLD_OPTS

然后,使用systemctl重新启动服务:

1sudo systemctl restart mariadb

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

1sudo systemctl revert mysql

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

1[secondary_label Output]
2Removed /etc/systemd/system/mysql.service.d/override.conf.
3Removed /etc/systemd/system/mysql.service.d.

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

1sudo systemctl daemon-reload

最后,重新启动服务:

1sudo systemctl restart mysql

数据库现在重新启动并恢复到正常状态. 通过登录为 root用户,确认新密码是否有效:

1mysql -u root -p

您将被要求提供密码. 输入您的新密码,您将按照预期获得访问数据库提示。

结论

您已恢复到 MySQL 或 MariaDB 服务器的管理访问权限,请确保您选择的新密码强大、安全,并将其保存在安全位置。

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

Published At
Categories with 技术
comments powered by Disqus