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

825 阅读8分钟

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站

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

介绍

忘记数据库密码?你真是各小机灵鬼。如果忘记或丢失了MySQL 或 MariaDB 数据库的root密码,且你有权访问服务器和具有sudo特权的用户帐户,其实仍然可以获得访问权限并重置密码。

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

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

先决条件

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

  • 使用 sudo 用户或以 root 权限访问服务器的其他方式访问运行 MySQL 或 MariaDB 的 Ubuntu 20.04 服务器。

注意:两种数据库安装指南都保留了数据库root帐号的默认配置,不需要密码进行身份验证,只要可以访问系统的root帐号即可。你仍然可以按照本指南设置和验证新密码。

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

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

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

mysql --version

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

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

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

MySQL outputmysql  Ver 8.0.22-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))

记下你正在运行的数据库。这将确定本教程其余部分要遵循的适当命令。

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

sudo systemctl stop mariadb

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

sudo systemctl stop mysql

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

步骤 2 — 重新启动数据库服务器而不进行权限检查

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

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

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

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

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

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

然后启动MariaDB服务器:

sudo systemctl start mariadb

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

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

sudo mysql -u root

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

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

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

为此,请执行以下命令:

sudo systemctl edit mysql

此命令将在nano编辑器中打开一个新文件,你将使用该文件来编辑 MySQL 的服务覆盖。这些更改了 MySQL 的默认服务参数。

该文件将为空。添加以下内容:

MySQL 服务覆盖

[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --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 提示:

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

步骤 3 — 更改 root 密码

数据库服务器现在以受限模式运行;未加载授权表,并且未启用网络支持。这允许你在不提供密码的情况下访问服务器,但它禁止你执行更改数据的命令。要重置root密码,你必须在获得服务器访问权限后加载授权表。

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

FLUSH PRIVILEGES;

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

更改 MariaDB 密码

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

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

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

OutputQuery OK, 0 rows affected (0.001 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为你会记住的强密码。MySQL 允许使用自定义身份验证机制,因此以下语句还确保 MySQL 将使用其默认身份验证机制来使用新密码对root用户进行身份验证:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'new_password';

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

OutputQuery OK, 0 rows affected (0.01 sec)

密码现已更改。输入 退出 MySQL 控制台exit

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

步骤 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 服务器的管理访问权限。确保你选择的新密码强度高且安全,并将其保存在安全的地方。