使用 Python mysql.connector 远程连接到 MySQL
Remotely connect to MySQL with Python mysql.connector
以下代码(运行 来自与 mysql 服务器不同的机器,在同一局域网内),使用 Python3 本地连接到 MySQL 数据库,并且mysql.connector 作品:
import mysql.connector
cnx = mysql.connector.connect(host='192.168.0.24', database='import_test',user='user_builder', password='password***', port=3309)
但是,以下代码远程连接到同一个数据库,不起作用:
import mysql.connector
cnx = mysql.connector.connect(host='http://imaginarywebsite.ddns.net', database='import_test',user='user_builder', password='password***', port=3309)
相反,我收到以下错误:
File "C:\Users\****\AppData\Roaming\Python\Python34\site-packages\mysql\connector\network.py", line 464, in open_connection
errno=2003, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'http://imaginarywebsite.ddns.net:3309' (11004 getaddrinfo failed)
这是我的 my.cnf 文件的摘录:
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
innodb_buffer_pool_size=4G
innodb_log_file_size=1024M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=7000
innodb_thread_concurrency=0
port = 3309
bind-address = 0.0.0.0
所以,这是目前有效的:
- 使用 192.168.0.24:3309 地址在本地连接到数据库,所以我确定问题不是来自 'privileges granting' 或任何 login/password/port 错误。
- 使用 http://imaginarywebsite.ddns.net/phpmyadmin 通过 phpmyadmin 远程连接,所以我确定问题不是来自我的 DNS 服务器。
这是我的 3 个问题:
- 知道问题出在哪里吗?
- 应该使用 SSH 连接来解决我的问题吗?
- 如果 SSH 是解决方案,是否可以通过 mysql.connector 使用 SSH 参数,因为它似乎没有出现在官方文档中?
谢谢。
如果您 运行 PHPMyAdmin 在您的 mysql 守护程序 运行 所在的同一台服务器上,这就是正在发生的事情:您将网络服务器配置为接受来自所有接口的连接, 但 mysql 配置为仅接受本地连接。由于 PHPMyAdmin 与 mysql 位于同一位置,因此它只会建立本地连接,这就是它有效但您的代码无效的原因。
因此,仔细检查您的 mysql 守护程序是否配置为侦听接口。您的 mysql.cnf 文件中应该有类似 bind-address=0.0.0.0
的行。有关详细信息,请参阅 this answer。
尝试将你的非工作示例编辑为这个(主机中没有 http)
import mysql.connector
cnx = mysql.connector.connect(
host='imaginarywebsite.ddns.net',
database='import_test',
user='user_builder',
password='password***',
port=3309
)
实际上答案是使用我服务器的全局IP地址而不是域名,可能是名称管理的问题。
将 host='http://imaginarywebsite.ddns.net' 替换为 'host=85.23.56.****' 使其工作。
以下代码(运行 来自与 mysql 服务器不同的机器,在同一局域网内),使用 Python3 本地连接到 MySQL 数据库,并且mysql.connector 作品:
import mysql.connector
cnx = mysql.connector.connect(host='192.168.0.24', database='import_test',user='user_builder', password='password***', port=3309)
但是,以下代码远程连接到同一个数据库,不起作用:
import mysql.connector
cnx = mysql.connector.connect(host='http://imaginarywebsite.ddns.net', database='import_test',user='user_builder', password='password***', port=3309)
相反,我收到以下错误:
File "C:\Users\****\AppData\Roaming\Python\Python34\site-packages\mysql\connector\network.py", line 464, in open_connection
errno=2003, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'http://imaginarywebsite.ddns.net:3309' (11004 getaddrinfo failed)
这是我的 my.cnf 文件的摘录:
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
innodb_buffer_pool_size=4G
innodb_log_file_size=1024M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=7000
innodb_thread_concurrency=0
port = 3309
bind-address = 0.0.0.0
所以,这是目前有效的:
- 使用 192.168.0.24:3309 地址在本地连接到数据库,所以我确定问题不是来自 'privileges granting' 或任何 login/password/port 错误。
- 使用 http://imaginarywebsite.ddns.net/phpmyadmin 通过 phpmyadmin 远程连接,所以我确定问题不是来自我的 DNS 服务器。
这是我的 3 个问题:
- 知道问题出在哪里吗?
- 应该使用 SSH 连接来解决我的问题吗?
- 如果 SSH 是解决方案,是否可以通过 mysql.connector 使用 SSH 参数,因为它似乎没有出现在官方文档中?
谢谢。
如果您 运行 PHPMyAdmin 在您的 mysql 守护程序 运行 所在的同一台服务器上,这就是正在发生的事情:您将网络服务器配置为接受来自所有接口的连接, 但 mysql 配置为仅接受本地连接。由于 PHPMyAdmin 与 mysql 位于同一位置,因此它只会建立本地连接,这就是它有效但您的代码无效的原因。
因此,仔细检查您的 mysql 守护程序是否配置为侦听接口。您的 mysql.cnf 文件中应该有类似 bind-address=0.0.0.0
的行。有关详细信息,请参阅 this answer。
尝试将你的非工作示例编辑为这个(主机中没有 http)
import mysql.connector
cnx = mysql.connector.connect(
host='imaginarywebsite.ddns.net',
database='import_test',
user='user_builder',
password='password***',
port=3309
)
实际上答案是使用我服务器的全局IP地址而不是域名,可能是名称管理的问题。
将 host='http://imaginarywebsite.ddns.net' 替换为 'host=85.23.56.****' 使其工作。