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