MySQL8.x登陸root用戶突然提示mysql_native_password的實(shí)現(xiàn)
1、在mysql 8.0x版本中,默認(rèn)的加密認(rèn)證方式從原來的mysql_native_password 變成了caching_sha2_password,如果我們不在my.cnf里面去設(shè)置加密認(rèn)證方式的話,它默認(rèn)用的就是caching_sha2_password
2、但現(xiàn)在有一個(gè)很奇怪的現(xiàn)象,不知道是何種原因,即便我們創(chuàng)建了用戶,并且也設(shè)置了caching_sha2_password,但是它默認(rèn)還是會(huì)以mysql_native_password作為認(rèn)證,這樣就會(huì)導(dǎo)致mysql_native_password模式被拒絕,因?yàn)槟J(rèn)情況下mysql只會(huì)接受caching_sha2_password,特別是在部分情況下,root用戶的localhost也會(huì)變成mysql_native_password,那這樣就會(huì)導(dǎo)致我們?cè)谑褂胢ysql -uroot -p -h localhost登陸的時(shí)候直接被拒絕掉,從而顯示ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded,這個(gè)具體問題不知道是什么原因?qū)е碌?,后面再去定位,現(xiàn)在只是做個(gè)記錄,如果出現(xiàn)了這種情況應(yīng)該怎么做
3、由于我的mysql容器是以docker-compose來運(yùn)行的,如果我們r(jià)oot用戶被擋了,只能以安全模式跳過root認(rèn)證,需要修改docker-compose的配置文件如下
version: '3.8' services: mysql82: image: mysql:8.4 container_name: mysql ports: - "3306:3306" volumes: - /mnt/mysql/data:/var/lib/mysql - /mnt/mysql/logs:/var/log/mysql - /mnt/mysql/conf/my.cnf:/etc/mysql/my.cnf environment: MYSQL_ROOT_PASSWORD: "你自己的root密碼" TZ: Asia/Shanghai command: --skip-grant-tables
在底部添加command: --skip-grant-tables即可,然后重啟容器
4、如果是宿主機(jī)安裝的方式,需要停止mysql的服務(wù),然后用安全模式啟動(dòng)
systemctl stop mysql mysqld_safe --skip-grant-tables &
5、修改完畢后,登陸mysql
mysql -uroot -p
這時(shí)候應(yīng)該是不需要密碼直接按回車就能進(jìn)入
6、查看用戶表,看下當(dāng)前有哪些用戶的認(rèn)證模式是:mysql_native_password
USE mysql; SELECT User, Host, plugin FROM user;
不出意外的話,如果我們r(jià)oot用戶被擋了,那么認(rèn)證模式肯定變成了mysql_native_password
但是默認(rèn)情況下mysql_native_password插件又沒有啟動(dòng),所以我們?cè)谡DJ较聲?huì)被擋在外面,這就是問題所在
但問題是我們壓根就不知道m(xù)ysql_native_password是如何被啟動(dòng)的,或者root用戶為啥從原來的caching_sha2_password 變成了mysql_native_password
7、如果localhost 的root用戶的認(rèn)證模式變成了mysql_native_password,這也是為何我們沒辦法進(jìn)去的原因,我們需要把它改成caching_sha2_password,這樣我們就可以登錄了
USE mysql; UPDATE user SET plugin='caching_sha2_password', authentication_string='' WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;
注意:我們這里是直接修改root的認(rèn)證模式,然后authentication_string='' 設(shè)置的是一個(gè)空的字符串密碼,這里不可以直接指定你的root密碼,因?yàn)槭敲魑牡?,mysql不允許,也不接受,所以就先保留空,等后面進(jìn)入到正常模式再去修改
8、將mysql設(shè)置成正常模式
如果是docker-compose啟動(dòng)的,把command: --skip-grant-tables這一行推薦注釋掉(萬一以后還要出現(xiàn)直接打開即可)
然后docker-compose down && docker-compose up -d
宿主機(jī)安裝的情況下,直接ps aux | grep "mysqld_safe --skip-grant-tables"
把這個(gè)進(jìn)程給kill掉,
然后systemctl start mysql正常啟動(dòng)即可
9、進(jìn)入到正常模式后,由于localhost的root用戶此時(shí)是空密碼,直接按回車就可以進(jìn)去,進(jìn)去之后立即修改root的密碼,密碼還是可以設(shè)置成原來的,然后在改密碼的時(shí)候再指定認(rèn)證類型為caching_sha2_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '這里最好是設(shè)置成你原來的root密碼';
10、修改完成之后,我們退出來重新登錄驗(yàn)證一下新修改的密碼能不能使用localhost登錄進(jìn)去
mysql -uroot -p
11、如果可以登陸的話,說明我們被擋在外面的問題就解決掉了,接下來就是把其他用戶認(rèn)證類型為mysql_native_password改成caching_sha2_password,這里主要是修改用戶的密碼和認(rèn)證方式,所以修改之前最好保持和知道之前原來的密碼,這樣可以減少很多不必要的操作,特別是如果這個(gè)用戶是某一個(gè)代碼里使用的
假設(shè)root用戶已經(jīng)登錄進(jìn)來了,說明root用戶的認(rèn)證模式已經(jīng)改回來了
接下來我們?cè)诓榭匆幌缕渌脩舻恼J(rèn)證情況
USE mysql; SELECT User, Host, plugin FROM user;
根據(jù)結(jié)果提示,把mysql_native_password的用戶都改成caching_sha2_password
這里的修改認(rèn)證類型主要是通過修改該用戶的密碼,然后再重新指定認(rèn)證類型
但是在修改之前,最好將該用戶的密碼修改成和之前一樣的,這樣可以減少很多不必要的麻煩,當(dāng)然你也可以使用新的自定義密碼
#假如我現(xiàn)在需要將javatest這個(gè)用戶的認(rèn)證類型從原來的mysql_native_password改成caching_sha2_password,使用如下SQL語句即可,但是修改之前要看一下該用戶之前授權(quán)的遠(yuǎn)程IP地址是什么,要嚴(yán)格的對(duì)應(yīng)上,我這里是%,你們根據(jù)實(shí)際情況修改 ALTER USER 'javatest'@'%' IDENTIFIED WITH 'caching_sha2_password' BY '該用戶的新密碼'; #刷新權(quán)限 FLUSH PRIVILEGES;
12、到此完成
到此這篇關(guān)于MySQL 8.x登陸root用戶突然提示mysql_native_password的文章就介紹到這了,更多相關(guān)MySQL 8.x登陸root用戶突然提示mysql_native_password內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL如何使用DATE_FORMAT()對(duì)查詢結(jié)果按日、周、月分組統(tǒng)計(jì)
這篇文章主要介紹了MySQL如何使用DATE_FORMAT()對(duì)查詢結(jié)果按日、周、月分組統(tǒng)計(jì)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Linux連接mysql報(bào)錯(cuò):Access denied for user ‘root’@‘localhost’(usi
這篇文章主要給大家介紹了關(guān)于Linux連接mysql數(shù)據(jù)庫報(bào)錯(cuò):Access denied for user ’root‘@’localhost‘(using password: YES)的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01簡單了解MySQL union all與union的區(qū)別
這篇文章主要介紹了簡單了解MySQL union all與union的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03MySQL實(shí)現(xiàn)數(shù)據(jù)批量更新功能詳解
最近需要批量更新大量數(shù)據(jù),習(xí)慣了寫sql,所以還是用sql來實(shí)現(xiàn),下面這篇文章主要給大家總結(jié)介紹了關(guān)于MySQL批量更新的方式,需要的朋友可以參考下2023-02-02