服務器配置Mysql遠程連接

服務器配置Mysql遠程連接

正常情況

  在服務器執行:

mysql -u root -p

use mysql;
create user 'root'@'%' identified by '123456';

  注:這是直接創建遠程用戶的方式,與修改root的host爲%不同。

特殊情況

  遇到了一個特殊情況,就是很久之前服務器的mysql配置過了遠程訪問,但是忘記了密碼,然後跳過密碼修改密碼後,遠程鏈接被拒。

原因分析

⚡首先回顧忘記密碼後修改密碼的操作
(以下是在服務器上的操作)

  1. 在mysql的配置文件中的[mysqld]下添加skip-grant-tables,來跳過權限認證
  2. mysql不輸密碼直接登錄
  3. 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;
發佈了118 篇原創文章 · 獲贊 480 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章