背景:
新買的雲服務器,Ubuntu系統,在線安裝了mysql-5.7.28,初始化之后並成功啟動
問題:
打開error.log日志,使用root賬號登錄失敗,從日志中也無法找到臨時密碼,無法登錄
解決方法:
1. 修改配置文件mysqld.cnf,添加配置skip-grant-tables, 重啟mysql
#sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
#sudo service mysql restart
2. 使用root賬號無密碼登錄
#mysql -u root -p
3. 查看root賬號的信息
mysql> select user, host, authentication_string, plugin from mysql.user where user = 'root' and host = 'localhost' \G
4. 修改root賬號的plugin為‘mysql_native_password’,並設置密碼
mysql>update mysql.user set plugin = 'mysql_native_password', authentication_string = password('hello123') where user = 'root' and host = 'localhost';
mysql> flush privileges;
5. 修改配置文件mysqld.cnf,注釋配置skip-grant-tables, 重啟mysql
#sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
6. 使用賬號root登錄mysql,並輸入設置的密碼
#mysql -u root -p
總結:
1. 由於在線安裝mysql,初始化也是自動完成的,該安裝包使用的是--initialize-insecure
方式,所有沒有給root創建默認的初始密碼,導致在error.log中找不到隨機密碼。
2. 根據官網解釋,如果使用--initialize-insecure
方式,只需要使用命令mysql -u root --skip-password登錄后設置密碼即可,但是試過方式失敗,原因是因為root的plugin使用的是“auth_socket”而不是“mysql_native_password". 在官網暫未找到為何plugin會被設置成”auth_socket"的原因。
3. auth_socket,是檢驗連接是否通過unix套接字實現的,而不是校驗賬號密碼的,如果賬號的plugin選擇的是auth_socket,即使設置了密碼,也是無法通過賬號密碼登錄的,詳情可參考官網 https://dev.mysql.com/doc/refman/5.7/en/socket-pluggable-authentication.html