作者: 数据源的 TiDB 学习之路

TiDB 数据库一般在初始安装时会默认创建一个 root 用户,并生成一个随机密码。使用这个密码通过 MySQL 客户端连接后可以进行密码修改,然而有些时候总是无法避免忘记了密码而导致无法连接的情况。昨天笔者在用 TEM(TiDB 的企业版管理器)安装完集群后,因为当时没有记录下 root 的密码,而导致不得不用一些极端的方法来绕行解决。

殊不知,TiDB 在官方文档中早已经明确了这种情况下应该怎么解决,具体可参考 TiDB 用户账户管理 | PingCAP 文档中心。借助这个参考手册,正好笔者也动手试了一下方案的可行性,整体验证下来方法完全可行,只不过个人在操作过程中也遇到个别文档中未提及的问题,借此篇幅记录下来。

一. 重置 root 密码的操作步骤

首先说明一下,笔者的测试环境中包括 2 个 TiDB Server + 3 个 TiKV + 3 个 PD。操作的第一步是任意选择一个 TiDB Server,并找到部署目录下的 tidb.toml 配置文件。笔者安装时配置的 tidb 部署目录为 /tidb-deploy,所以这个配置文件所在的目录如下图所示:

TiDB忘记了root密码?教你一招搞定_系统

找个 tidb.toml 配置文件后,我们需要在这个文件中 security 部分增加配置项 skip-grant-table。需要注意的是,security 在配置文件中不一定包含,这时需要添加 2 行配置信息,

TiDB忘记了root密码?教你一招搞定_系统_02

保存这个配置文件后,我们需要做的是强制杀死现有的 tidb server 进程。

TiDB忘记了root密码?教你一招搞定_系统_03

由于原有的 TiDB Server 进程都是用 tidb 这个用户来启动的,找到对应的进程号为 188065 并使用 kill -9 杀死后,再次确认进程已经不在。这里你会发现一段时间内这个进程也不会自动重启,这是因为设置 skip-grant-table 之后,启动 TiDB 进程会增加操作系统用户检查,只有操作系统的 root 用户才能启动 TiDB 进程

下面我们要做的事情就是用 root 用户来手动启动这个 TiDB Server 组件。在每个 TiDB Server 的部署目录下有一个 scripts 目录,下面有一个 run_tidb.sh 脚本,我们切换到 root 用户来手动运行这个 run_tidb.sh。

TiDB忘记了root密码?教你一招搞定_系统_04

这个 sh run_tidb.sh 处于一直运行的状态不结束,这里我们开启另外一个窗口查看,发现已经有一个 tidb-server 进程在运行,它的 owner 正是 root 用户。

TiDB忘记了root密码?教你一招搞定_系统_05

这个时候,我们可以用 MySQL 客户端连接本地,并使用无密码的 root 用户连接到数据库,然后修改密码。

TiDB忘记了root密码?教你一招搞定_系统_06

到了这里面,我们的 root 用户密码就算已经重置好了。那么我们后面就是要善后了,具体来说就是要把前面增加的 skip-grant-table 配置还原,然后停止运行 run_tidb.sh。我们发现,虽然停止了 run_tidb.sh,但 root 运行的 tidb-server 仍然没有消失,我们需要手动 kill 掉这个进程。

TiDB忘记了root密码?教你一招搞定_系统_07

原则来说,删除了 skip-grant-table 配置,并手动 kill 了 root 运行的 tidb-server 进程后,节点应该会自动拉起 tidb 用户的 tidb-server 进程,然而过了很长时间 tidb-server 进程并没有自动启动成功。于是去部署目录下查看 tidb.log,我们看到如下错误。

TiDB忘记了root密码?教你一招搞定_系统_08

报错信息的大概意思就是存在一个 /tmp/tidb-4000.sock 文件,导致 TiDB Server 启动的时候无法写这个文件。果不其然,确实查看到这个文件,且 owner 为 root 用户,想必是前面 root 用户生成的临时文件,因为 kill 进程的原因导致这个 socket 文件没有正常清理掉。

我们使用 sudo 的方式删除这个 socket 文件,再次检查进程,此时发现 tidb-server 自动启动成功。

TiDB忘记了root密码?教你一招搞定_系统_09

那么到此为止,进程已经还原完成,root 的密码应该也已经修改完毕。我们再次用 mysql 客户使用 root 用户及刚刚重置的密码再次登录验证,可以成功连接数据库,验证成功!

TiDB忘记了root密码?教你一招搞定_系统_10

二. 遇到的问题及解决方案

其实通过上述的步骤,应该也可以看出,整个操作过程比较简单,思路也非常明确。主要遇到的问题就是用 root 启动的 tidb-server 进程在使用 ctrl+c 中断 run_tidb.sh 并不会自动停止。这里有两个地方需要手动清理,一个是 tidb-server 进程需要手动 kill,另一个就是 /tmp/tidb-4000.sock 文件需要手动删除。