問題描述:
系統安裝mysql的過程中,沒有提示配置用戶名和密碼相關的信息,安裝完畢后,登錄報錯。
表現現象為:
mysql -u root -p
[輸入root密碼]
界面提示:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
問題解決過程:
1. 首先嘗試了通過繞開數據庫權限校驗的流程,直接進入數據庫后再重新配置用戶名和密碼
sudo /etc/init.d/mysql stop
sudo mysqld_safe --skip-grant-tables
mysql -u root 嘗試登錄,
沒有作用,還是會提示無權限訪問數據庫
2. 繞開權限校驗行不通,原因無法定位,進一步想通過重新安裝數據庫的方法解決,
主要是懷疑上次安裝中有部分系統原來自帶的用戶殘留信息或配置導致目前的問題,所以重裝前,先卸載和清除原有安裝。
sudo apt-get remove mysql-*
dpkg –l | grep ^rc | awk ‘{print $2}’ | xargs dpkg –P
sudo apt-get install mysql-client mysql-server
安裝過程中發現,還是沒有提示配置用戶或者登錄密碼信息,“不詳的預感”……
果然,登錄發現還是不行,再次提示Access denied 。
3. 用“mysql安裝不提示配置密碼”去檢索類似問題,發現另一個方法,找到了mysql的默認登錄信息。
/etc/mysql/debian.cnf中,使用黃色框中的登錄信息即可登錄。
4. 登錄mysql后,分析存儲登錄信息的user表,分析下為何root之前登錄失敗。
use mysql
show tables;
select host,user,authentication_string,plugin from user;
不難看出,root這個用戶的密碼串為空,校驗plugin方式為“auth_socket”,查閱mysql官方文檔(https://dev.mysql.com/doc/refman/5.7/en/socket-pluggable-authentication.html#socket-pluggable-authentication-usage),
對 auth_socket 校驗方式的說明如下:
auth_socket方式下,client端通過socket方式訪問mysql,server端通過socket file的方式校驗,對client端的username進行校驗即可,也就是說,這種方式不是本地密碼登錄使用的。
因此,將該方式修改為“mysql_native_password”,並配置root的登錄密碼,即可使用root用戶本地密碼的方式進行mysql訪問。