当前位置:首页 > 问答 > 正文

CentOS上怎么简单查到数据库密码,快速搞定那些忘记的登录信息

(引用来源:基于Linux系统管理常识、数据库服务默认配置及常见故障排查思路)

在CentOS服务器上,万一忘记了数据库(比如最常见的MySQL或MariaDB)的登录密码,这事儿说大不大,说小也不小,你别慌,按照下面的步骤一步步来,基本上都能快速搞定,核心思路就一个:暂时绕过权限验证,进去之后再改密码。

你得有操作系统的root权限,没有这个最高权限,后面的一切都免谈,确保你是以root用户登录,或者能用sudo命令提权。

第一步,先把数据库服务给停掉,因为运行中的数据库会检查密码,我们进不去,停服务的方法很简单,用systemctl命令。(引用来源:CentOS系统服务管理标准命令)打开终端,输入:

systemctl stop mysqld 或者 systemctl stop mariadb

具体是mysqld还是mariadb,取决于你当初安装的是哪个,你不太确定的话,两个命令都试一下,总有一个会提示找不到服务,另一个则会正常停止,服务停止成功后,不会有太多提示,命令行光标会跳到下一行等待新命令。

第二步,也是最关键的一步,就是启动一个跳过权限检查的特殊模式,这样启动数据库后,它不会要求你输入密码,就能直接以最高权限连上去。(引用来源:MySQL/MariaDB官方文档中关于--skip-grant-tables参数的说明)输入下面的命令:

mysqld_safe --skip-grant-tables --skip-networking &

这个命令有点长,解释一下。mysqld_safe是启动数据库的一个安全脚本。--skip-grant-tables就是那个“万能钥匙”,告诉数据库别管什么用户名密码了,另外一个参数--skip-networking也很重要,它让数据库只允许本机连接,防止这个时候有别人从网络连过来钻空子,这样更安全,最后那个&符号是让这个命令在后台运行,这样你还能继续在同一个终端里输入其他命令。

执行这个命令后,会输出一些信息,不用管,只要没报错崩掉,就应该是启动成功了。

第三步,现在数据库已经在“不设防”状态下运行了,我们直接连接进去,打开一个新的终端窗口,或者就在当前终端(如果上一步没加&,你就得开新终端),输入:

mysql -u root

注意,这次它不会问你要密码,直接就能看到提示符变成了mysql>,这说明你已经成功以root身份登录了数据库系统。

第四步,进去之后就要修改密码了,但先得告诉数据库系统,我们要更新权限表。(引用来源:MySQL 5.7.6及以上版本及MariaDB 10.4.3及以上版本密码重置流程变化)因为新版本的密码管理方式变了,所以步骤稍有不同,你先输入下面这个命令,让系统重新加载权限设置:

CentOS上怎么简单查到数据库密码,快速搞定那些忘记的登录信息

FLUSH PRIVILEGES;

注意,SQL命令后面要跟分号,执行成功后,再开始改密码。

如果是MySQL 5.7.6及以上版本或者MariaDB 10.4.3及以上版本,改root密码的命令是:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

你的新密码换成你想设的复杂点的密码。

如果是比较老的版本(比如CentOS 7默认可能装的旧版),可能要用这个命令:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的新密码');

CentOS上怎么简单查到数据库密码,快速搞定那些忘记的登录信息

密码设置成功后,系统会提示Query OK

第五步,密码改好了,就该退出来,让数据库恢复正常运行,在mysql>提示符下输入:

exit;

这样就回到了普通的命令行。

第六步,现在要把那个“不设防”的数据库进程关掉,重新正常启动,找到刚才在后台运行的mysqld_safe进程的PID(进程号),你可以用ps aux | grep mysqld命令找一下,然后使用kill命令结束它,更粗暴直接的方法是,直接用killall mysqld_safekillall mysqld,确保相关进程都结束。(引用来源:Linux进程管理基本操作)

再次使用systemctl正常启动数据库服务:

systemctl start mysqldsystemctl start mariadb

你就可以用新设置的密码,通过mysql -u root -p命令,输入新密码正常登录了。

整个流程走下来,其实就是利用了一个数据库自带的后门参数,临时取消了密码验证,操作的时候细心点,尤其是改密码的那条SQL语句别写错,基本上几分钟就能解决忘记密码的问题,完事儿后记得把新密码记在安全的地方,免得下次又忘了。