如何在Ubuntu 20.04上重置MySQL或MariaDB Root密码
作者: Mateusz Papiernik
介绍
忘记数据库密码?别担心,这种事谁都会遇到。如果您忘记或丢失了 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服务器。
- 为了在不影响生产服务器的情况下尝试本教程中的恢复方法,请创建一个测试服务器,注意需要创建一个具有sudo权限的常规非root用户。随后安装MySQL或MariaDB。
步骤一:识别数据库版本并停止服务器
Ubuntu 20.04上运行的是MySQL或MariaDB,后者是一个时下流行的MySQL替代方案,它与MySQL完全兼容。您需要使用不同的命令来恢复 root
密码,这具体取决于您安装的数据库版本。因此请按照本节中的步骤确定您正在运行的数据库服务器。
请使用以下命令检查您的版本:
mysql --version
如果您正在运行MariaDB,您将在输出中看到“MariaDB”前面带有版本号:
MariaDB output
mysql Ver 15.1 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
如果您正在运行MySQL,则会看到这样的输出:
MySQL output
mysql 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密码。
步骤二:在没有权限检查的情况下重新启动数据库服务器
在没有权限检查的情况下运行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 [(none)]>
现在您就可以访问数据库服务器,并遵循步骤三进行root密码更改。
配置MySQL以在没有授权表的情况下启动
为了在没有授权表的情况下启动MySQL服务器,我们将改变MySQL的systemed配置,以便在启动时将其他命令行参数传递给服务器。 为此,请执行以下命令:
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提示符:
mysql>
现在您就可以访问数据库服务器,并进行root密码更改。
步骤三:更改Root密码
数据库服务器现在以受限模式运行——未加载授权表,并且未启用网络支持。由此您可以在不提供密码的情况下访问服务器,但它仍然会禁止您执行更改数据的命令。要重置root密码,必须先加载授权表,以便获得对服务器的访问权限。
通过发出 FLUSH PRIVILEGES
命令指示数据库服务器重新加载授权表。
mysql> FLUSH PRIVILEGES;
您现在可以更改root密码,所使用的方法取决于您使用的是MariaDB还是MySQL。
更改MariaDB密码
如果您使用的是MariaDB,请执行以下语句来设置root帐户的密码,确保使用一个您能记住的强密码替换 new_password
:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
您将看到此输出指示密码已更改:
Output
Query 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';
您将看到每个语句的以下输出:
Output
Query OK, 0 rows affected (0.01 sec)
密码现已更改。键入 exit
以退出MariaDB控制台并继续执行步骤四以在正常模式下重新启动数据库服务器。
更改MySQL密码
如果您使用的是MySQL,执行以下语句来更改root用户的密码,使用一个您能记住的强密码替换 new_password
。MySQL允许使用自定义身份验证机制,因此执行以下语句确保MySQL使用其默认身份验证机制来使用新密码对root用户进行身份验证:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'new_password';
您将看到此输出表明密码已成功更改:
Output
Query OK, 0 rows affected (0.01 sec)
密码现已更改。键入 exit
以退出MySQL控制台。
让我们以正常运行模式重启数据库。
步骤四:将数据库服务器恢复为正常设置
为了以正常模式重新启动数据库服务器,您必须还原所做的更改,以便启用网络并加载授权表。同样,使用的具体方法取决于您使用的是MariaDB还是MySQL。
对于MariaDB,取消设置先前设置的 MYSQLD_OPTS
环境变量:
sudo systemctl unset-environment MYSQLD_OPTS
然后,使用 systemctl
重启服务器:
sudo systemctl restart mariadb
对于MySQL,删除修改后的systemd配置:
sudo systemctl revert mysql
您将看到诸如以下内容的输出:
Output
Removed /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的官方文件。