現象
成都創(chuàng)新互聯公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網站建設公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務,在本地打下了良好的口碑,在過去的10余年時間我們累計服務了上千家以及全國政企客戶,如服務器租用等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質量監(jiān)控加上過硬的技術實力獲得客戶的一致稱譽。
一線的工程師反映了一個奇怪的現象,剛剛從 MySQL 官網上下載了一個 MySQL 5.7.31。安裝完成后,發(fā)現使用任何密碼都能登陸 MySQL,修改密碼也不管用,重新啟動 MySQL 也不能解決。
分析
懷疑使用了 --skip-grant-tables 使用 mysqld --print-defaults 檢查,沒有發(fā)現。
檢查登陸用戶,都是 root@localhost,說明和 proxy user 沒有關系。
使用 mysql --print-defaults 檢查客戶端是否設置默認的用戶和密碼,沒有發(fā)現。
檢查數據庫中的用戶和密碼的相關字段:
發(fā)現一切都正常,再檢查 plugin 字段,發(fā)現只有 root 用戶是 auth_socket ,其它的用戶都是 mysql_native_password,問題可能就出在這兒。
對 auth_socket 驗證插件不了解,感覺是這個插件不安全,使用下面的命令修改后,問題解決:
update user set plugin="mysql_native_password" where user='root';
auth_socket 驗證插件的使用場景
問題解決后,又仔細研究了一下 auth_socket 這個插件,發(fā)現這種驗證方式有以下特點:
首先,這種驗證方式不要求輸入密碼,即使輸入了密碼也不驗證。這個特點讓很多人覺得很不安全,實際仔細研究一下這種方式,發(fā)現還是相當安全的,因為它有另外兩個限制;
只能用 UNIX 的 socket 方式登陸,這就保證了只能本地登陸,用戶在使用這種登陸方式時已經通過了操作系統(tǒng)的安全驗證;
操作系統(tǒng)的用戶和 MySQL 數據庫的用戶名必須一致,例如你要登陸MySQL 的 root 用戶,必須用操作系統(tǒng)的 root用戶登陸。
auth_socket 這個插件因為有這些特點,它很適合我們在系統(tǒng)投產前進行安裝調試的時候使用,而且也有相當的安全性,因為系統(tǒng)投產前通常經常同時使用操作系統(tǒng)的 root 用戶和 MySQL 的 root 用戶。當我們在系統(tǒng)投產后,操作系統(tǒng)的 root 用戶和 MySQL 的 root 用戶就不能隨便使用了,這時可以換成其它的驗證方式,可以使用下面的命令進行切換:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
一、mysqld 進程沒有正常運行遇到這種情況首先到服務器上看看 mysqld 進程是否活著,采用的命令:
二、客戶端不能和進程 mysqld 通信如果 MySQL 服務器上的 mysqld 進程運行正常,我們再看看客戶端能不能和 mysqld 進行通信,使用下面的命令進行網絡連通的測試:telnet localhost 3306
如果本地能通,再到客戶端的機器上把 localhost 換成 MySQL 服務器的 ip 地址進行測試。如果不能通,通常有兩種原因,一種原因是 OS 或網絡的問題,或者是防火墻;另一種原因是 mysqld 自身根本沒有偵聽客戶端的連接請求, mysqld 啟動后對于客戶端的偵聽是分三種情況。
第一種情況
是使用參數 --skip-networking 跳過偵聽客戶端的網絡連接,用下面的命令我們可以看到 MySQL 根本沒有偵聽 3306 端口。
第二種情況
使用參數 --bind-address 后面增加對客戶端訪問 IP 地址的限制,例如只偵聽本地的連接
三、賬戶密碼的問題最后一種情況是賬戶密碼的問題,應付這種情況我們有個有力的工具就是查看 MySQL 的 error log, error log 記載信息的詳細程度上由參數 --log-error-verbosity 進行控制的
MySQL我用的是apt安裝的,有很多問題,建議大家用二進制程序安裝。
問題描述
在服務器上登錄MySQL只能用本地的127.0.0.1地址,用服務器本身地址會提示拒絕訪問
嘗試修改MySQL遠程訪問權限
修改后發(fā)現沒有用,MySQL依然拒絕遠程訪問
查看3306端口
root@sfpql:~# netstat -an|grep 3306
修改MySQL服務地址:
嘗試遠程連接
telnet sfpql 3306
結語
MySQL遠程連接不上是常見問題,一般設置好MySQL的遠程訪問權限就可以了。
apt安裝的MySQL會自己將啟動地址設置在本地,同時apt安裝的MySQL的服務查看命令是 systemctl status mysql 其他安裝方式的??疵钍?systemctl status mysqld
1.排除網絡或防火墻問題
先看是否能ping通遠程服務器,ping 192.168.1.211,如果不可以就是網絡問題。然后,檢查端口是否被防火墻擋住了,telnet 192.168.1.211 3306,如果連接失敗,配置防火墻。
配置防火墻,開啟3306端口
vi /etc/sysconfig/iptables
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT(允許3306端口通過防火墻)
/etc/init.d/iptables restart(重啟防火墻使配置生效)
2.檢查MySQL配置
如果開啟了防火墻,telnet還是失敗,通過netstat查看3306的端口狀態(tài):
netstat -apn|grep 3306
tcp6 0 0 127.0.0.1:3306 :::* LISTEN 13524/mysqld
注意地方,這說明3306被綁定到了本地。檢查一下my.cnf的配置,這里可以配置綁定ip地址。
bind-address=addr
不配置或者IP配置為0.0.0.0,表示監(jiān)聽所有客戶端連接。
ps:我開啟3306端口,并且檢查MySQL配置之后,telent仍然失敗,但是在本機telnet是ok的,再三確認了配置沒有問題。后來跟我們的ucloud賬號管理員提了一下,才知道ucloud管理后臺也需要開啟3306端口,用云服務器的留意這個。
3.檢查用戶訪問權限
MySQL建用戶的時候會指定一個host,默認是127.0.0.1/localhost,那么這個用戶就只能本機訪問,其它機器用這個用戶帳號訪問會提示沒有權限,host改為%,表示允許所有機器訪問。
最后,別忘了重啟mysql使配置生效。
# /etc/init.d/mysql restart
望采納
報錯:
[MySQL][ODBC 8.0(w) Driver]Can't connect to MySQL server on……
確保你的mysqql服務器是開著的狀態(tài)
嘗試方法
打開系統(tǒng)偏好設置
看是否是close 狀態(tài),如果是 ,點start使之啟動
再連接,成功了
還可以參考地址: