服務器配置Mysql遠程連接
正常情況
在服務器執行:
mysql -u root -p
use mysql;
create user 'root'@'%' identified by '123456';
注:這是直接創建遠程用戶的方式,與修改root的host爲%不同。
特殊情況
遇到了一個特殊情況,就是很久之前服務器的mysql配置過了遠程訪問,但是忘記了密碼,然後跳過密碼修改密碼後,遠程鏈接被拒。
原因分析
⚡首先回顧忘記密碼後修改密碼的操作
(以下是在服務器上的操作)
- 在mysql的配置文件中的
[mysqld]
下添加skip-grant-tables
,來跳過權限認證 - mysql不輸密碼直接登錄
-
use mysql; set password for root@localhost = password('123456'); flush privileges;
⚡來看一下報錯
(在本地的操作)
ERROR 1045 (28000): Access denied for user ‘root’@‘27.xxx.xxx.xxx’ (using password: YES)
根據報錯推斷是密碼錯誤。這裏有個小問題,很多人第一眼看到會很奇怪,爲什麼報錯返回的ip與輸入的遠程服務器地址不同,這裏說明一下,報錯返回的ip是本地ip,這一點在訪問web應用後可以證明。
⚡下面只能登陸遠程服務器繼續操作了,奇怪的是在服務器可以直接使用修改後端密碼登陸
讓我們看一下用戶表
mysql> select user, host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
解釋下爲什麼有兩個root用戶:
MySQL的權限爲用戶名和主機名共同定義,可以理解爲user和host相同才爲同一個。
root@localhost:表示只有本地可以訪問
root@%:表示任意ip都可以訪問
不難看出,問題就在於改密碼的時候,由於使用的命令是set password for root@localhost = password('123456');
,修改的是本地訪問的密碼,而遠程連接的密碼未變。那麼問題來了,本地連接用新密碼,遠程連接用舊密碼可以嗎,即本地和遠程連接的密碼不同?
試了一下,報錯:ERROR 2026 (HY000): SSL connection error: socket layer receive error。
但是,如果在服務器,先修改本地密碼爲123,再修改遠程密碼爲123456,經測試,本地和遠程,用各自對應的密碼時可以登錄成功。
所以好像可以在本地訪問的時候用簡單的密碼,比如123456,遠程的時候用複雜密碼。。。
解決方案
方案一:
在服務器修改密碼時,執行完
set password for root@localhost = password('123456');
再執行
set password for 'root'@'%' = password('123456');
方案二(推薦):
修改密碼時直接執行:(密碼會統一)
update user set password=password("123456") where user="root";
# mysql5.7以上版本需要執行下面的命令
update user set authentication_string=password("123456") where user="root";
flush privileges;
遠程和本地同一賬戶使用不同密碼
經過測試是可以實現的。首先登錄服務器,執行:
mysql -u root -p
# 如果沒有遠程賬戶,先創建,當然如果本地用戶改成了遠程host,也可以創建本地賬戶
create user 'root'@'%' identified by '123456';
#create user 'root'@'localhost' identified by '123456';
本地連接密碼改爲123
set password for 'root'@'localhost' = password('123');
遠程連接密碼改爲123456
set password for 'root'@'%' = password('123456');
刷新
flush privileges;