如果遺忘了 tidb 的 root 密碼如何操作,這里稍微拓展一下牺丙,將 MySQL 和 TiDB 的解決辦法都記錄一下吆玖,方便后面遇到的時(shí)候可以直接拿來用。
MySQL 中忘記密碼如何處理
1置侍、找到 my.cnf 文件映之,如果是 rpm 安裝拦焚,默認(rèn)應(yīng)該是在/etc/my.cnf,當(dāng)然專業(yè)的 DBA 部署的話可能會(huì)在其他路徑杠输。
2赎败、修改 my.cnf,在 [mysqld] 作用域下蠢甲,增加?skip-grant-tables 配置項(xiàng)僵刮。
3、重啟 mysqld鹦牛,一般先 ps -ef | grep mysqld 搞糕,會(huì)有兩個(gè)進(jìn)程,mysqld_safe 是守護(hù)進(jìn)程曼追,kill 掉 mysqld 的進(jìn)程即可窍仰。
4、再次登錄 mysql 就不需要輸入密碼了礼殊,可以直接 update mysql.user 表來修改密碼驹吮,之后記得將 my.cnf 的 skip 注釋掉,否則數(shù)據(jù)庫沒有密碼是很危險(xiǎn)的行為膏燕。
TiDB 中忘記密碼如何處理(2.1版本)
1钥屈、找到 tidb-server 的配置文件,具體在 deploy 目錄下的 conf/tidb.toml
2坝辫、修改 tidb.toml篷就,在[security] 作用域下,增加 skip-grant-table=true 配置項(xiàng)
3近忙、找到 tidb-server 的啟動(dòng)文件竭业,具體在 deploy 目錄下的script/run_tidb.sh
4、由于 tidb 限制了 skip 模式只能在操作系統(tǒng) root 用戶啟動(dòng) tidb-server 才可以進(jìn)行及舍,所以要用 root 用戶來執(zhí)行上面的腳本
sudo sh run_tidb.sh
5未辆、此時(shí)再次登錄 tidb,就會(huì)發(fā)現(xiàn)不需要輸入 root 密碼了锯玛,重置之后記得恢復(fù)配置文件及啟動(dòng)腳本即可
導(dǎo)入了 MySQL 的系統(tǒng)表(mysql.user)如何處理
目前(2.1版本)咐柜,tidb 的系統(tǒng) schema 并沒有完全兼容 MySQL,包括5.6攘残、5.7 乃至8.0版本的系統(tǒng)表拙友,主要是 mysql.user 以及權(quán)限控制相關(guān)的表,字段和 tidb 里的并不完全一樣歼郭。所以在上線割接的時(shí)候遗契,一定要注意,只能導(dǎo)出 MySQL 中的業(yè)務(wù)庫數(shù)據(jù)病曾,不能直接將 MySQL 中的系統(tǒng)表包括 mysql 和 information_schema 等的數(shù)據(jù)直接導(dǎo)入 tidb 中牍蜂,否則可能會(huì)遇到類似下面的報(bào)錯(cuò)
[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
遇到這種情況漾根,原則上只靠上面忘記密碼的方式是解決不了的,因?yàn)橄到y(tǒng)表例如 mysql.user 的表結(jié)構(gòu)已經(jīng)被改變了鲫竞,而2.1版本中在啟動(dòng) tidb-server 的時(shí)候必須要去校驗(yàn) mysql.user 表(即使以 skip-grant 模式啟動(dòng))辐怕。所以直接聯(lián)系官方獲取支持吧,目前我們有多個(gè)社區(qū)大群贡茅,或者一些 user group秘蛇,官方會(huì)提供一個(gè)臨時(shí)的 binary 來繞過檢測(cè),啟動(dòng) tidb-server 后顶考,重建幾張系統(tǒng)表即可恢復(fù)。
后續(xù)優(yōu)化
1妖泄、如果上游 MySQL 建了比較多的用戶驹沿,可以提供一個(gè)腳本快速將上游的用戶以及權(quán)限配置導(dǎo)出并導(dǎo)入到下游 tidb。
2蹈胡、后續(xù)的版本中渊季,可能會(huì)考慮在 skip-grant 模式下,不去校驗(yàn) mysql.user 表即可啟動(dòng)罚渐,這樣用戶自己找到對(duì)應(yīng)版本的 tidb 中系統(tǒng)表即可自己重建恢復(fù)却汉。
3、可能會(huì)對(duì) tidb 中的系統(tǒng)表做一些權(quán)限上的控制荷并,避免用戶的誤操作導(dǎo)致系統(tǒng)表被破壞合砂。