使用 Python mysql.connector 远程连接 MySQL

Posted

技术标签:

【中文标题】使用 Python mysql.connector 远程连接 MySQL【英文标题】:Remotely connect to MySQL with Python mysql.connector 【发布时间】:2017-03-11 16:00:14 【问题描述】:

以下代码(从与 mysql 服务器不同的机器运行,在同一个 LAN 中),使用 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 地址在本地连接到数据库,所以我确信问题不是来自“权限授予”或任何登录/密码/端口错误。 通过 phpmyadmin 使用 http://imaginarywebsite.ddns.net/phpmyadmin 进行远程连接,所以我确信问题不是来自我的 DNS 服务器。

这是我的 3 个问题:

    您知道问题出在哪里吗? 是否应该使用 SSH 连接来解决我的问题? 如果 SSH 是解决方案,是否可以通过 mysql.connector 使用 SSH 参数,因为它似乎没有在官方文档中提供?

谢谢。

【问题讨论】:

您是否验证了 MySQL 服务器正在侦听哪些端口/接口?在服务器上使用命令“netstat -ln |grep 3309”可以查看 MySQL 是只接受 localhost 接口还是其他接口。 【参考方案1】:

尝试编辑你的非工作示例(主机中没有 http)

import mysql.connector

cnx = mysql.connector.connect(
    host='imaginarywebsite.ddns.net',
    database='import_test',
    user='user_builder',
    password='password***',
    port=3309
)

【讨论】:

【参考方案2】:

其实答案是使用我服务器的全局IP地址而不是域名,可能是名称管理的问题。

将 host='http://imaginarywebsite.ddns.net' 替换为 'host=85.23.56.****" 使其工作。

【讨论】:

【参考方案3】:

如果您在运行 mysql 守护程序的同一台服务器上运行 PHPMyAdmin,则会发生以下情况:您的网络服务器配置为接受来自所有接口的连接,但 mysql 配置为仅接受本地连接。由于 PHPMyAdmin 与 mysql 位于同一位置,因此它只会建立本地连接,这就是它可以工作但您的代码不能工作的原因。

所以,请仔细检查您的 mysql 守护程序是否配置为侦听接口。您的 mysql.cnf 文件中应该有类似 bind-address=0.0.0.0 的行。详情请见this answer。

【讨论】:

谢谢。实际上我没有指定它,但是我从与 mysql 服务器(192.168.0.24)不同的机器(192.168.0.10)运行这两个代码。而 my.cnf(不是 mysql.cnf,这有关系吗?)文件已经包含了 bind-address = 0.0.0.0

以上是关于使用 Python mysql.connector 远程连接 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 和 mysql.connector 从表中获取数据

使用 Python mysql.connector 成功插入 MySQL 数据后丢失

mysql-connector-python、mysql-connector-python-rf 和 mysql-connector-repackaged 有啥区别?

在 Python 2.7 中使用带有 mysql.connector 的参数化查询

在 mysql-connector-python 中结束连接池

python3使用MySQL connector对MySQL数据库进行操作