黄东旭解析 TiDB 的核心优势
597
2024-04-07
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.toml配置文件后,我们需要在这个文件中security部分增加配置项skip-grant-table。需要注意的是,security在配置文件中不一定包含,这时需要添加2行配置信息,
保存这个配置文件后,我们需要做的是强制杀死现有的tidb server进程。
由于原有的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。
这个sh run_tidb.sh处于一直运行的状态不结束,这里我们开启另外一个窗口查看,发现已经有一个tidb-server进程在运行,它的owner正是root用户。
这个时候,我们可以用MySQL客户端连接本地,并使用无密码的root用户连接到数据库,然后修改密码。
到了这里面,我们的root用户密码就算已经重置好了。那么我们后面就是要善后了,具体来说就是要把前面增加的skip-grant-table配置还原,然后停止运行run_tidb.sh。我们发现,虽然停止了run_tidb.sh,但root运行的tidb-server仍然没有消失,我们需要手动kill掉这个进程。
原则来说,删除了skip-grant-table配置,并手动kill了root运行的tidb-server进程后,节点应该会自动拉起tidb用户的tidb-server进程,然而过了很长时间tidb-server进程并没有自动启动成功。于是去部署目录下查看tidb.log,我们看到如下错误。
报错信息的大概意思就是存在一个/tmp/tidb-4000.sock文件,导致TiDB Server启动的时候无法写这个文件。果不其然,确实查看到这个文件,且owner为root用户,想必是前面root用户生成的临时文件,因为kill进程的原因导致这个socket文件没有正常清理掉。
我们使用sudo的方式删除这个socket文件,再次检查进程,此时发现tidb-server自动启动成功。
那么到此为止,进程已经还原完成,root的密码应该也已经修改完毕。我们再次用mysql客户使用root用户及刚刚重置的密码再次登录验证,可以成功连接数据库,验证成功!
二. 遇到的问题及解决方案
其实通过上述的步骤,应该也可以看出,整个操作过程比较简单,思路也非常明确。主要遇到的问题就是用root启动的tidb-server进程在使用ctrl+c中断run_tidb.sh并不会自动停止。这里有两个地方需要手动清理,一个是tidb-server进程需要手动kill,另一个就是/tmp/tidb-4000.sock文件需要手动删除。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。