centos虛擬機下的mysql登錄時出現Access denied for user 'root'@'localhost' (using password: YES) 及外部拒絕訪問的解決方法
先說下我的情況,我用的mysql是docker部署的。然后在使用過程遇到兩個問題。
1.外部拒絕訪問,就是想Navicat或者sqlyog的外部軟件訪問報錯。
2.在linux下的mysql命令行登錄也出現權限問題。
第一個問題的解決方法挺簡單的,就是授予權限。但是授予權限是要在mysql命令行下執行的,然后就因為第二個問題,mysql登錄不進去,給卡死了。下面說下解決方法。
1.MySQL登錄出現權限拒絕問題
解決方法就是重置密碼。。沒錯,沒有什么方法比‘重啟‘更管用。步驟如下:
1.跳過認證啟動
首先進入到容器中。
mysql是我的數據庫名稱。命令的意思是:
然后編輯mysql配置文件,使用vi終端編輯器
vi /etc/mysql/conf.d/docker.cnf
在docker.cnf文件下新增skip-grant-tables
然后保存退出。這樣下次登錄mysql就不用密碼了。然后重新啟動容器。
docker restart mysql
這一步要說下vi終端編輯器的工作模式。
編輯模式:按”i“進入,按esc退出編輯模式進入命令模式
命令模式:就是最開始的狀態
末行模式:在命令模式下按“:”進入,末行模式輸入wq就是保存退出(w是write,q是quit)。q!是強制退出
2.重新設置密碼
同第一樣在進入mysql容器后,直接輸入mysql就登錄成功。
接着重新設置密碼。
#使用mysql自帶的mysql數據庫。
use mysql;
#更改user表下的密碼。
UPDATE user SET authentication_string = password ( 'a123456' ) WHERE User = 'root';
#刷新權限
flush privileges;
#退出
quit;
注意!!!這里有個坑,user表的密碼的屬性名是authentication_string
3.刪除第一步的跳過認證啟動
重新進入docker容器。在docker.cnf文件下刪掉skip-grant-tables
4.重啟mysql容器
再次重新啟動后,就可以登錄mysql。
2.外部拒絕訪問問題解決
在mysql命令行下輸入:
mysql> GRANT ALL PRIVILEGES ON *.* TO '用戶名'@'%' IDENTIFIED BY '密碼' WITH GRANT OPTION;
Query OK, 0 rows affected (0.02 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
這里用戶名和密碼都是你自己的。另外說一下grant命令的解釋:
grant 權限1,權限2, ... 權限n on 數據庫名稱.表名稱 to 用戶名@用戶地址 identified by '連接口令';
權限1,權限2,... 權限n 代表 select、insert、update、delete、create、drop、index、alter、grant、references、reload、shutdown、process、file 等14個權限。
當權限1,權限2,... 權限n 被 all privileges 或者 all 代替時,表示賦予用戶全部權限。
當 數據庫名稱.表名稱 被 . 代替時,表示賦予用戶操作服務器上所有數據庫所有表的權限。
用戶地址可以是localhost,也可以是IP地址、機器名和域名。也可以用 '%' 表示從任何地址連接。
'連接口令' 不能為空,否則創建失敗。
參考資料
https://blog.csdn.net/u012467855/article/details/81266470
https://blog.csdn.net/qq_36675754/article/details/81381341