2017-03-10 68 views
2

我在MacOS X 10.12上使用Python 3.5,pymysql 0.7.6。從python到遠程服務器中的MySQL的連接

我試圖使用python訪問遠程服務器中的MySQL數據庫。我沒有問題,從使用命令行訪問:

ssh [email protected] 
[email protected]'s password: my_server_password 

,然後在服務器:

mysql my_database -p 
Enter password: my_database_password 

和它的作品,我可以做所有這類事情與我的數據庫。現在,我嘗試做蟒蛇內一樣,文檔或我在其他職位在這裏發現了大量的例子如下:

import pymysql 

cnx = pymysql.connect(host='XXX.XXX.XXX.XXX', port='3306', user='root', password='my_server_password', db='my_database') 

而且它不工作,讓儘可能錯誤:

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' ([Errno 61] Connection refused)") 

憑證是正確的憑證,我已經檢查過該端口是否是正確的端口,正如其他帖子中所建議的那樣。我懷疑它可能與數據庫有密碼有關,而不僅僅是服務器,但我還沒有找到任何包含這兩個密碼的方法。事實上,我不確定連接命令中應包含哪個密碼,如果是服務器密碼或數據庫密碼。它們都不適用於它們中的任何一個。

那麼,你有什麼建議可能是這裏的問題,或者如果我錯過了一個重要的位?

回答

1

當您運行mysql命令時,您在SSH shell中執行此操作。那就是通過連接localhost連接到遠程機器上運行的服務器。該遠程服務器似乎沒有設置爲允許遠程連接到它,只有來自機器本身的連接。

您需要讓您的python腳本通過SSH以與您相同的方式連接到MySQL服務器。您可以打開SSH隧道到遠程服務器上的端口3306。

我喜歡使用用於此目的的模塊是:https://pypi.python.org/pypi/sshtunnel

from sshtunnel import SSHTunnelForwarder 
import pymysql 

server = SSHTunnelForwarder(
    'XXX.XXX.XXX.XXX', 
    ssh_username='root', 
    ssh_password='my_server_password', 
    remote_bind_address=('127.0.0.1', 3306) 
) 
server.start() 

cnx = pymysql.connect(
    host='127.0.0.1', 
    port=server.local_bind_port, 
    user='root', 
    password='my_database_password', 
    db='my_database' 
) 

# Make sure to call server.stop() when you want to disconnect 
# after calling cnx.close() 
+0

非常感謝!這個解決方案像一個魅力。非常清楚的解釋。 – dalonsoa

1

根據所給出的信息,我建議你嘗試以下方法:

  1. 確保MySQL的綁定地址是「0.0.0.0」。您可以通過編輯/etc/mysql/my.cnf並將檢查bind-address選項設置爲「0.0.0.0」來完成此操作。

  2. 確保從遠程計算機打開端口。安裝「nmap」,然後使用nmap -sS -O -p3306 <public-server-ip>。如果看到類似3306/mysql open的東西都不錯。如果沒有,你需要確保你的防火牆沒有阻塞那個端口。

火箭危險品意味着你可能會想使用SSH隧道,以減少暴露的MySQL端口直接作爲數據是以明文發送的可能的風險。如果您只需在部署到服務器之前在本地測試代碼,則可以在運行Python代碼之前使用以下命令:ssh -f [email protected] -L 3306:127.0.0.1:3306 -N。在這種情況下,你不需要完成第一步和第二步。