如何在Ubuntu 20.04上重置MySQL或MariaDB根密码
编者按:遇到这个问题后,试了很多种方法,这篇文章介绍的最为详细也最为全面,按照这个方法可以完美解决。
下面内容基本上是谷歌翻译过来。
介绍
忘记数据库密码了吗?它发生在我们最好的人身上。如果您忘记或丢失了MySQL或MariaDB数据库的root密码,但如果您有权访问服务器和具有sudo
特权的用户帐户,则仍然可以访问并重置密码。
本教程演示了如何为在Ubuntu 20.04上通过软件包管理器安装的MySQL和MariaDB数据库重置根密码apt
。根密码的更改过程会有所不同,具体取决于您是否安装了MySQL或MariaDB以及发行版或其他供应商提供的软件包附带的默认systemd配置。尽管本教程中的说明可能适用于其他系统或数据库服务器版本,但它们已通过Ubuntu 20.04和发行版提供的软件包进行了测试。
注意:在全新的Ubuntu 20.04安装中,默认的MySQL或MariaDB配置通常允许您访问数据库(具有完整的管理特权),而无需提供密码,只要您从系统的根帐户进行连接即可。在这种情况下,可能不必重置密码。在继续重置数据库根密码之前,请尝试使用sudo mysql
命令访问数据库。仅当更改了身份验证的默认配置,并且这导致访问被拒绝错误时,请按照本教程中的步骤进行操作。
先决条件
要恢复您的MySQL或MariaDB根密码,您将需要:
- 使用sudo用户访问运行MySQL或MariaDB的Ubuntu 20.04服务器,或使用其他具有root特权的访问服务器的方式。
- 为了在不影响您的生产服务器的情况下测试本教程中的恢复方法,请创建一个测试服务器,然后按照我们的初始服务器设置教程进行操作。确保创建具有sudo特权的常规非root用户。然后按照我们的有关如何在Ubuntu 20.04上安装MySQL的指南安装MySQL或按照如何在Ubuntu 20.04上安装MariaDB的安装MariaDB。
注意:两种数据库安装指南都保留了数据库根帐户的默认配置,只要您可以访问系统的根帐户,就不需要密码来进行身份验证。您仍然可以按照本指南设置和验证新密码。
步骤1 —识别数据库版本并停止服务器
Ubuntu 20.04可运行MySQL或MariaDB(一种流行的直接替代产品,与MySQL完全兼容)。您将需要使用不同的命令来恢复root
密码,具体取决于已安装的命令,因此请按照本节中的步骤确定正在运行的数据库服务器。
使用以下命令检查您的版本:
1 | mysql --version |
如果您正在运行MariaDB,则会在输出中看到“ MariaDB”和版本号:
MariaDB output
1 | mysql Ver 15.1 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 |
如果您正在运行MySQL,则将看到以下输出:
MySQL out
1 | putmysql Ver 8.0.22-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu)) |
请注意您正在运行的数据库。这将确定在本教程其余部分中要遵循的适当命令。
为了更改root密码,您需要关闭数据库服务器。如果您正在运行MariaDB,则可以使用以下命令进行操作:
1 | sudo systemctl stop mariadb |
对于MySQL,请通过运行以下命令关闭数据库服务器:
1 | sudo systemctl stop mysql |
在数据库停止的情况下,您可以在安全模式下重新启动它以重置root密码。
步骤2 —在没有权限检查的情况下重新启动数据库服务器
在没有权限检查的情况下运行MySQL和MariaDB允许使用root特权访问数据库命令行,而无需提供有效密码。为此,您需要停止数据库加载存储用户特权信息的授权表。由于这有一定的安全隐患,因此您可能还希望禁用网络连接,以防止其他客户端连接到临时易受攻击的服务器。
根据所安装的数据库服务器的不同,在不加载授权表的情况下启动服务器的方式也有所不同。
配置MariaDB在没有授权表的情况下启动
为了在没有授权表的情况下启动MariaDB服务器,我们将使用systemd
单元文件为MariaDB服务器守护程序设置其他参数。
执行以下命令,该命令设置启动时MariaDB使用的MYSQLD_OPTS环境变量。在--skip-grant-tables
和--skip-networking
选项告诉MariaDB的启动而不加载授权表或网络功能:
1 | sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking" |
然后启动MariaDB服务器:
1 | sudo systemctl start mariadb |
该命令不会产生任何输出,但是会考虑到新的环境变量设置来重新启动数据库服务器。
您可以确保以开头sudo systemctl status mariadb
。
现在,你应该能够连接到数据库作为MariaDB的根用户不提供密码:
1 | sudo mysql -u root |
您将立即看到数据库外壳提示:
1 | MariaDB [(none)]> |
现在,您可以访问数据库服务器了,您可以更改root密码,如步骤3所示。
配置MySQL以在没有授权表的情况下启动
为了在没有授权表的情况下启动MySQL服务器,您将更改MySQL的systemd配置,以便在启动时将其他命令行参数传递给服务器。
为此,请执行以下命令:
1 | sudo systemctl edit mysql |
此命令将在nano
编辑器中打开一个新文件,您将用它来编辑MySQL的服务覆盖。这些更改了MySQL的默认服务参数。
该文件将为空。添加以下内容:
MySQL服务覆盖
1 | [Service] |
第一条ExecStart
语句清除默认值,而第二条语句提供systemd
新的启动命令,包括用于禁用加载授权表和联网功能的参数。
按CTRL-x
退出文件,然后Y
保存所做的更改,然后ENTER
确认文件名。
重新加载systemd
配置以应用以下更改:
1 | sudo systemctl daemon-reload |
现在启动MySQL服务器:
1 | sudo systemctl start mysql |
该命令将不显示任何输出,但是数据库服务器将启动。授权表和联网将不会启用。
以root用户身份连接到数据库:
1 | sudo mysql -u root |
您将立即看到数据库外壳提示:
1 | mysql> |
现在您可以访问服务器了,您可以更改root密码了。
步骤3 —更改根密码
数据库服务器现在在受限模式下运行;授权表未加载,并且未启用任何网络支持。这使您可以在不提供密码的情况下访问服务器,但是它禁止您执行更改数据的命令。要重置根密码,必须先获得对服务器的访问权限,然后才能加载授权表。
发出以下FLUSH PRIVILEGES
命令,通知数据库服务器重新加载授权表:
1 | FLUSH PRIVILEGES; |
现在,您可以更改root密码。您使用的方法取决于您使用的是MariaDB还是MySQL。
更改MariaDB密码
如果您使用的是MariaDB,请执行以下语句来设置root帐户的密码,并确保将其替换new_password
为您会记住的强壮的新密码:
1 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; |
您将看到以下输出,指示密码已更改:
1 | OutputQuery OK, 0 rows affected (0.001 sec) |
MariaDB允许使用自定义身份验证机制,因此请执行以下两条语句以确保MariaDB将对您分配给根帐户的新密码使用其默认身份验证机制:
1 | UPDATE mysql.user SET authentication_string = '' WHERE user = 'root'; |
您将看到每个语句的以下输出:
1 | OutputQuery OK, 0 rows affected (0.01 sec) |
现在,密码已更改。键入exit
以退出MariaDB控制台,然后继续执行步骤4以正常模式重新启动数据库服务器。
修改MySQL密码
对于MySQL,执行以下语句以更改root用户的密码,用new_password
您会记住的强密码代替。MySQL允许使用自定义身份验证机制,因此以下语句还确保MySQL将使用其默认身份验证机制来使用新密码对根用户进行身份验证:
1 | ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'new_password'; |
您将看到以下输出,指示密码已成功更改:
1 | OutputQuery OK, 0 rows affected (0.01 sec) |
现在,密码已更改。输入退出MySQL控制台exit
。
让我们以正常操作模式重新启动数据库。
第4步-将数据库服务器还原为常规设置
为了以正常模式重新启动数据库服务器,您必须还原所做的更改,以便启用网络并加载授权表。同样,您使用的方法取决于您使用的是MariaDB还是MySQL。
对于MariaDB,取消MYSQLD_OPTS
设置先前设置的环境变量:
1 | sudo systemctl unset-environment MYSQLD_OPTS |
然后,使用systemctl
以下命令重新启动服务:
1 | sudo systemctl restart mariadb |
对于MySQL,删除修改后的systemd配置:
1 | sudo systemctl revert mysql |
您将看到类似于以下内容的输出:
1 | OutputRemoved /etc/systemd/system/mysql.service.d/override.conf. |
然后,重新加载systemd配置以应用更改:
1 | sudo systemctl daemon-reload |
最后,重新启动服务:
1 | sudo systemctl restart mysql |
复制
现在,数据库已重新启动,并返回到其正常状态。通过以root用户身份使用密码登录来确认新密码是否有效:
1 | mysql -u root -p |
复制
系统将提示您输入密码。输入新密码,您将可以按预期访问数据库提示。
结论
您已恢复对MySQL或MariaDB服务器的管理访问权限。确保您选择的新密码安全可靠,并将其保存在安全的地方。
有关用户管理,身份验证机制或其他版本的MySQL或MariaDB的数据库密码重置方式的详细信息,请参阅官方的MySQL文档或MariaDB文档。