一、navicat等客戶端登陸報錯的原因
使用mysql,多數我們還是喜歡用可視化的客戶端登陸管理的,個人比較喜歡用navicat。一般裝好服務器以后,習慣建一個遠程的登陸帳號,在mysql8服務器上,用老方法創建的帳號,可以用mysql自己命令行正常登入,但是用navicat等軟件登入卻會提示錯誤
原因是MySQL8的新特性,MySQL8默認使用 caching_sha2_password 身份驗證機制。舊客戶端不支持這種驗證,當然就無法登入了。
所以解決辦法也很簡單,只需要我們在服務器上用舊的認證機制(mysql_native_password)設置密碼就可以了。舊模式不是MySQL8默認模式,所以需要在創建用戶或者修改密碼時,明確指定為mysql_native_password模式。
首先我們試驗下,用默認模式創建用戶,
執行 ALTER USER 'root'@'%' IDENTIFIED BY 'aaabbb'; 創建的記錄是這樣的
這種情況下,客戶端登入不會成功
如果在創建/或者修改命令中 用WITH mysql_native_password 指明密碼模式
例如ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'aaabbb';
執行后的用戶記錄如下,可見plugin被設置為了mysql_native_password
此時再次測試,客戶端就可以正常登入了。
二、例:完整的創建一個遠程管理員帳號
1、創建一個可以遠程登陸的root用戶
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密碼';
注意@后面“%”允許遠程登入,WITH mysql_native_password 修飾允許舊模式的客戶端登入
2、為賬戶開放權限
grant all privileges on *.* to root@'%';
flush privileges;
三、例:創建一個普通用戶並為其分配一個數據庫
這是開發中比較常見的需求,即給特定用戶指定數據庫內部的全部權限
1、添加一般賬戶
CREATE USER '用戶名'@'%' IDENTIFIED WITH mysql_native_password BY '密碼';
2、創建新數據庫
CREATE DATABASE IF NOT EXISTS 數據庫名;
或者干脆
CREATE DATABASE 數據庫名;
以前常常還要指定默認utf8字符集,現在MySQL 8.0的默認字符集是utf8mb4,所以默認即可。
默認生成的數據庫字符集是這樣的
3、新賬戶授權新數據庫
grant all privileges on 數據庫名.* to 用戶名@'%';
為方便常常用戶名和數據庫名設為相同以便管理。
附:其他常用的命令
平時配置數據庫少,很多命令不算熟悉,所以羅列起來,用的時候復制粘貼加修改是最方便的了。。。
創建用戶(WITH mysql_native_password 是可選的,為了適應客戶端兼容性) CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密碼'; 設置/修改密碼 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密碼'; ALTER USER 'root'@'localhost' IDENTIFIED BY '密碼'; alter user 'yzd'@'%' identified by 'aaa'; 清除密碼 ALTER USER 'root'@'localhost' IDENTIFIED BY ''; UPDATE user SET authentication_string='' WHERE user='root'; 刪除用戶 drop user 用戶名@ localhost; Delete FROM mysql.user Where User="用戶名" and Host=”localhost”; 分配權限 grant all privileges on *.* to root@'%'; 刷新權限 flush privileges; 創建數據庫 CREATE DATABASE IF NOT EXISTS yzd DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 查詢數據庫列表 show databases; 查詢數據表列表 show tables; 查詢用戶列表 select host,user,plugin,authentication_string from mysql.user; 查詢當前用戶名 select user(); 查詢當前用戶權限 show grants;
mysql8有很多新特性,密碼丟失后找回的操作也和舊版不同了。這幾天為恢復一個python項目后台庫密碼,折騰了不少時間,網上mysql5的手段反復試了都走不通。
后來發現,MySQL8有另外的密碼復位辦法,繼續探索中