作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。
介绍
忘记密码发生在我们最好的人身上。如果您忘记或丢失MySQL 或 MariaDB 数据库的root密码,如果您有权访问服务器和具有sudo特权的用户帐户,您仍然可以访问并重置密码。
注意:在全新的 Ubuntu 18.04 安装中,默认的 MySQL 或 MariaDB 配置通常允许您访问数据库(具有完全管理权限),而无需提供密码,只要您从系统的root帐户建立连接即可。在这种情况下,可能不需要重置密码。在重置数据库root密码之前,请尝试使用该sudo mysql命令访问数据库。仅当更改了身份验证的默认配置并导致访问被拒绝错误时,请按照本教程中的步骤操作。
本教程演示了如何为在 Ubuntu 18.04 上使用包管理器安装的 MySQL 和 MariaDB 数据库重置root密码apt。更改 root 密码的过程因您是否安装了 MySQL 或 MariaDB 以及其他供应商的发行版或软件包附带的默认 systemd 配置而异。虽然本教程的说明可能适用于其他系统或数据库服务器版本,但它们已经在 Ubuntu 18.04 和发行版提供的软件包中进行了明确测试。
先决条件
要恢复您的 MySQL 或 MariaDB根密码,您需要:
- 使用 sudo 用户或其他使用 root 权限访问服务器的方式访问运行 MySQL 或 MariaDB 的 Ubuntu 18.04 服务器。为了在不影响生产服务器的情况下尝试本教程中的恢复方法,请使用初始服务器设置教程创建一个具有 sudo 权限的常规非 root 用户的测试服务器。然后按照如何在 Ubuntu 18.04 上安装 MySQL 安装 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根用户身份连接到数据库,而无需提供密码:
- 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 的默认服务参数。此文件将为空,因此添加以下内容:
[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密码,您必须在获得对服务器的访问权后加载授权表。
通过发出以下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)
现在密码已更改。通过键入退出 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 服务器的管理访问权限。确保您选择的新密码强大且安全,并将其保存在安全的地方。
有关其他版本的 MySQL 或 MariaDB 的用户管理、身份验证机制或重置数据库密码的方法的更多信息,请参阅MySQL官方文档或MariaDB 文档。