如果遗忘了 tidb 的 root 密码如何操作,这里稍微拓展一下,将 MySQL 和 TiDB 的解决办法都记录一下,方便后面遇到的时候可以直接拿来用。
MySQL 中忘记密码如何处理
1、找到 my.cnf 文件,如果是 rpm 安装,默认应该是在/etc/my.cnf,当然专业的 DBA 部署的话可能会在其他路径。
2、修改 my.cnf,在 [mysqld] 作用域下,增加 skip-grant-tables 配置项。
3、重启 mysqld,一般先 ps -ef | grep mysqld ,会有两个进程,mysqld_safe 是守护进程,kill 掉 mysqld 的进程即可。
4、再次登录 mysql 就不需要输入密码了,可以直接 update mysql.user 表来修改密码,之后记得将 my.cnf 的 skip 注释掉,否则数据库没有密码是很危险的行为。
TiDB 中忘记密码如何处理(2.1版本)
1、找到 tidb-server 的配置文件,具体在 deploy 目录下的 conf/tidb.toml
2、修改 tidb.toml,在[security] 作用域下,增加 skip-grant-table=true 配置项
3、找到 tidb-server 的启动文件,具体在 deploy 目录下的script/run_tidb.sh
4、由于 tidb 限制了 skip 模式只能在操作系统 root 用户启动 tidb-server 才可以进行,所以要用 root 用户来执行上面的脚本
sudo sh run_tidb.sh
5、此时再次登录 tidb,就会发现不需要输入 root 密码了,重置之后记得恢复配置文件及启动脚本即可
导入了 MySQL 的系统表(mysql.user)如何处理
目前(2.1版本),tidb 的系统 schema 并没有完全兼容 MySQL,包括5.6、5.7 乃至8.0版本的系统表,主要是 mysql.user 以及权限控制相关的表,字段和 tidb 里的并不完全一样。所以在上线割接的时候,一定要注意,只能导出 MySQL 中的业务库数据,不能直接将 MySQL 中的系统表包括 mysql 和 information_schema 等的数据直接导入 tidb 中,否则可能会遇到类似下面的报错
[planner:1054]Unknown column 'password' in 'field list'select HIGH_PRIORITY Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Process_priv,Grant_priv,References_priv,Alter_priv,Show_db_priv,Super_priv,Execute_priv,Index_priv,Create_user_priv,Trigger_priv from mysql.user;
2019/03/12 07:21:09.010 terror.go:327: [fatal] [planner:1054]Unknown column 'password' in 'field list'github.com/pingcap/errors.AddStack /home/jenkins/workspace/build_tidb_2.1/go/pkg/mod/github.com/pingcap/errors@v0.11.0/errors.go:174github.com/pingcap/parser/terror.(*Error).GenWithStackByArgs
/home/jenkins/workspace/build_tidb_2.1/go/pkg/mod/github.com/pingcap/parser@v0.0.0-20190227090929-c68bfe7e0257/terror/terror.go:231
遇到这种情况,原则上只靠上面忘记密码的方式是解决不了的,因为系统表例如 mysql.user 的表结构已经被改变了,而2.1版本中在启动 tidb-server 的时候必须要去校验 mysql.user 表(即使以 skip-grant 模式启动)。所以直接联系官方获取支持吧,目前我们有多个社区大群,或者一些 user group,官方会提供一个临时的 binary 来绕过检测,启动 tidb-server 后,重建几张系统表即可恢复。
后续优化
1、如果上游 MySQL 建了比较多的用户,可以提供一个脚本快速将上游的用户以及权限配置导出并导入到下游 tidb。
2、后续的版本中,可能会考虑在 skip-grant 模式下,不去校验 mysql.user 表即可启动,这样用户自己找到对应版本的 tidb 中系统表即可自己重建恢复。
3、可能会对 tidb 中的系统表做一些权限上的控制,避免用户的误操作导致系统表被破坏。