1. 程式人生 > >阿里雲安裝MySQL以後,MySQL無法遠端連線

阿里雲安裝MySQL以後,MySQL無法遠端連線

原因:

MySQL安裝預設建立的root使用者僅支援本地連線操作,ssh連線阿里雲伺服器,再mysql -u root -p命令連線資料庫的話,被認定為遠端連線,不是本地連線,提示連線失敗

注意:大家有沒有注意到,在報錯的最後提示using password:YES;這說明使用的密碼是正確的,但是沒有連線許可權,這就是因為MySQL安裝預設建立的root使用者僅支援本地連線操作,不支援遠端連線

關於連線許可權講解

分析發現MySQL資料庫對使用者的控制是有登陸許可權設定的,其中如下圖所示,MySQL user表中的host屬性是用來控制這使用者的登陸方式的

(有些情況下更改配置後,需要重啟生效)

命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 

說明:username - 你將建立的使用者名稱, host - 指定該使用者在哪個主機上可以登陸,如果是本地使用者可用localhost, 如果想讓該使用者可以從任意遠端主機登陸,可以使用萬用字元%. password - 該使用者的登陸密碼,密碼可以為空,如果為空則該使用者可以不需要密碼登陸伺服器. 

例子: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; 

CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456'; 

CREATE USER 'pig'@'%' IDENTIFIED BY '123456'; 

CREATE USER 'pig'@'%' IDENTIFIED BY ''; 

CREATE USER 'pig'@'%'; 

以下截圖為MySQL資料庫中預設建立的mysql資料庫user表資料(該表專門用來管理MySQL資料庫登入使用者資訊)

解決思路:

那就將root使用者的host欄位改成%就好了啊!或者自己重新建立一個使用者專門用於資料庫操作切記將host欄位設定為%才能支援遠端連線

解決方案:

1、修改 /etc/my.cnf,在 [mysqld] 小節下新增一行:skip-grant-tables

這一行配置讓 mysqld 啟動時不對密碼進行驗證

2、重啟 mysqld 服務:servive mysqld restart

3、使用 root 使用者登入到 mysql:mysql -u root 

4、切換到mysql資料庫,更新 user 表:

-- 更新root使用者資訊

update user set hosr='%'authentication_string = password('root'), password_expired = 'N', password_last_changed = now() where user = 'root';

-- 重新插入一條使用者資訊

insert user .......................

注意:該步驟需要注意幾個點

1.既可以更新root使用者host資訊,讓其支援遠端登入

2.又可以複製root使用者資訊為insert,改一下host,user屬性,插入一條新的使用者資訊(此處可藉助資料庫連線工具,可遠端連線也不用輸入密碼即可連線成功)

3.在之前的版本中,密碼欄位的欄位名是 password,5.7版本改為了 authentication_string

5、退出 mysql,編輯 /etc/my.cnf 檔案,刪除 skip-grant-tables的內容

6、重啟 mysqld 服務,再用新密碼登入即可

大功告成!此時就可以用root使用者或者自己新建立的使用者進行遠端連線了。

最後附一條

MySql取消密碼強度驗證功能

一、修改MySql配置檔案(my.cnf)

一般情況下,MySql的配置檔案 my.cnf 會在  /etc/ 目錄下,如果沒有,可以使用以下命令查詢位置:

$ sudo find / -name my.cnf

編輯配置檔案:

$ sudo vi /etc/my.cnf

在檔案末尾新增以下內容:

plugin-load=validate_password.so

validate-password=OFF

儲存退出

二、重啟mysqld服務

重啟服務,以使得配置檔案生效:

$ sudo service mysqld restart

三、登入mysql驗證

使用命令登入驗證配置檔案是否生效:

$ mysql -u使用者名稱 -p密碼

隨意修改成一個簡單密碼,檢視是否成功,命令就不寫出來了