遠程連接mysql失敗異常,未配置權限,skip-name-resolve以及防火牆

剛安裝好 mysql之後,用 navicat 連接MySQL ,是連不上的。mysql 默認是隻能本地連接,如果需要遠程連接,需要配置連接權限。我的mysql 版本是 MySQL 5.6.40
本地連接之後,需要重置密碼

set password for user@localhost = password('123456');

查看權限

首先登錄到mysql ,mysql -u root -p, 輸入密碼登錄進去

mysql > show grants;

在這裏插入圖片描述

這是root 用戶對localhost的權限,如果需要遠程登錄,查看遠程權限

mysql> show grants for 'root'@'%'

這裏%表示任意主機。如果沒有配置過,會有提示。

配置可遠程登錄

mysql> GRANT ALL PRIVILEGES ON *.*  TO 'root'@'%' IDENTIFIED  BY '密碼';
mysql> flush privileges;  

ALL PRIVILEGES 表示所有權限, 其實mysql中權限有許多,增刪改查是最基本的,還分庫權限,表權限,全局權限等
ON . 表示對所有數據庫的所有表都給與權限,例如你只想給某個用戶test數據庫的權限,那麼可以寫 ON test.* , 當然權限可以細分到表,甚至細分到列都是OK的!
TO 後面接的是用戶名,對誰授予權限。 TO ‘root’@’%’ , %表示任意主機,這就是說對從任意主機使用指定密碼登錄的root用戶授予 ALL PRIVILEGES 權限。
詳細的grant 語法請參考https://dev.mysql.com/doc/refman/5.6/en/grant.html#grant-overview
授予權限之後,查看一下

mysql> show grants for 'root'@'%';

在這裏插入圖片描述
ok ! 權限配置已完成

再登錄,報錯Lost connection to MySQL server at 'waiting for initial communication packet

登錄,又報錯了。
原因分析:
mysql開啓了DNS的反向解析功能,這樣mysql對連接的客戶端會進行DNS主機名查找。
mysql處理客戶端解析過程:
1)當mysql的client連過來的時候,服務器會主動去查client的域名。
2)首先查找 /etc/hosts 文件,搜索域名和IP的對應關係。
3)如果hosts文件沒有,則查找DNS設置,進行DNS反向解析,直到timeout連接失敗。

mysql的DNS反向解析:
1)mysql接收到連接請求後,獲得的是客戶端的ip,爲了更好的匹配mysql.user裏的權限記錄(某些是用hostname定義的)。
2)如果mysql服務器設置了dns服務器,並且客戶端ip在dns上並沒有相應的hostname,那麼這個過程很慢,導致連接等待。
解決方案:
1)把client的ip寫在mysql服務器的/etc/hosts文件裏,隨便給個名字做主機映射即可。
2)在my.cnf配置文件中的[mysqld]區域添加skip-name-resolve,即跳過mysql連接的DNS反向解析功能,這樣能很好地提高mysql性能。在這種情況下,就只能使用MySQL授權表中的IP來連接mysql服務了。

對於第一種方法顯然比較笨,也不實用!強烈推薦第二種方法,添加skip-name-resolve選項可以禁用dns解析,這樣的話,就不能在mysql的授權表中使用主機名了,只能使用IP。

[mysqld]
skip-name-resolve

重啓mysql。
設置完最好驗證一下

mysql>show variables like '%skip_name_resolve%'; 

在這裏插入圖片描述
已開啓,OK!
另外:
如果在my.cnf文件中配置了bind-address地址綁定的地址(說明別的機器遠程只能通過這個綁定的本機地址來連接mysql),可以將其註釋掉。
例如:
bind-address = 127.0.0.1 //說明只能在本機連接mysql,並且通過-h 127.0.0.1或localhost,在遠程是無法連接這個mysql的!

my.cnf配置的幾個參數:
skip-name-resolve 跳過DNS反向解析過程.(這樣就不能使用主機名連接mysql了,只能使用ip連接)
skip-grant-tables 跳過授權表(當mysql登陸密碼忘記時的解決辦法)
skip-networking 跳過TCP/IP連接
skip-host-cache 禁用主機名緩存;要想清除主機名緩存,執行FLUSH HOSTS語句或執行mysqladmin flush-hosts命令

再次連接,還是報錯,還是上面的錯誤

我還是太年輕,這又咋啦。上一步明明已經忽略了dns解析,
忽然想到會不會是防火牆的問題,看下防火牆服務是否開啓

# service iptables status

在這裏插入圖片描述
防火牆開着,把防火牆關掉試試

service iptables stop

再重新連,successful ! 果真是防火牆惹的禍。
那把防火牆關掉?感覺不太安全! 好吧,在防火牆規則里加入允許 3306 端口通過
打開 /etc/sysconfig/iptables文件,在8080後面加一行

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

注意這個位置,一般在8080後面一行,或者22那一行後面。不能直接加在文件末尾,
在這裏插入圖片描述
重啓防火牆!service iptables start
重連mysql, 可以連上了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章