远程 mysql 连接在工作台中有效,但在 python 中无效

Posted

技术标签:

【中文标题】远程 mysql 连接在工作台中有效,但在 python 中无效【英文标题】:Remote mysql connection works in workbench but not in python 【发布时间】:2019-10-17 23:32:43 【问题描述】:

我在我的 raspi 上设置了一个 mysql 服务器(使用 mariadb)和数据库,现在正尝试从我的 MacBook 连接到它。

版本: mysql Ver 15.1 Distrib 10.1.38-MariaDB,用于 debian-linux-gnueabihf (armv7l),使用 readline 5.2

连接工作在 Workbench(在 Mac 上)但我无法让它在 python 或命令行中连接

raspi 上的 /etc/my.cnf 如下所示:

绑定地址 = 0.0.0.0

[mysqld]

我添加了一个具有所有权限的超级用户,并尝试使用以下命令在我的 Mac 命令行上连接:

mysql -u superuser -p superuser -h '192.168.x.x' -P '3307' -D securities_master

这不起作用。

在 python 中,我尝试了不同的变体:

host = '192.168.x.x'
user='superuser'
password='superuser'
database='securities_master'

import mysql.connector
cnx = mysql.connector.connect(user=user, password=password, host=host, port='3307')
print(cnx.get_server_info()) 

命令行返回: ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', 系统错误: 3

python 脚本返回: pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '192.168.x.x' ([Errno 61] Connection denied)")

工作台连接牢固

【问题讨论】:

Workbench 正在 Mac 上运行 我不知道如何从您发布的链接中更新 Mac 防火墙 抱歉,我是反向阅读配置,因为 Mac 托管 mysql,而您使用 raspi 连接到 Mac 托管的 mysql 实例。 【参考方案1】:

我刚刚解决了同样的问题:

    检查您的 mysql 是否授予“root”或“youruserID”从 localhost(127.0.0.1) 和 LAN(192.168.x.x) 访问 DB 权限的权限?为此,只需 ssh 进入远程服务器并:

     $ mysql -u root -p
     mysql> SHOW GRANTS
    

    对我来说它显示:

     Grants for root@localhost 
    ----------
    | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD ‘*———‘ WITH GRANT OPTION |
    | GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                                                             |
    

    这意味着它已被授予任何地方(@'%')包括的特权。本地主机(127.0.0.1)

    远程python访问需要安装mysql连接器:

     $ pip install mysql-connector-python
    

    在 Python3 中你可以试试这个(如果 mariaDB 端口是 3307,默认 mysql 是 3306):

     >>> import mysql.connector
     >>> cnx =mysql.connector.connect(user='root', password='xxx', host='yourraspyi_sql_ip', port='3307')
     >>> print(cnx.get_server_info()) 
    

【讨论】:

在我的例子中,用户超级用户具有与 root 相同的权限。检查他们是否可以访问本地主机和 IP 是什么意思? 正如 Sadi 提到的,连接 cmd 行 -P 22 表示您的端口是 22,这是不正确的! 22 通常用于 SSH,对于 mysql,端口是 3306,如果 mariaDB 是 3307,这也是我的问题,缺少端口!如果 ssh 进入 raspi 并登录到 mysql,最好不要在 cmd 行中添加任何端口,只需使用:“mysql -u root p”,只是为了检查 mysql 是否正在运行并且可以在本地访问。 当我以 root 身份登录并要求显示授权时,它看起来和你的一样,但是你的 python 代码对我不起作用 记住如果你使用mariaDB,端口是3307! 请执行第 1 步。打印出“SHOW GRANTS”【参考方案2】:

您提到mysql -u superuser -p superuser -h '192.168.x.x' -P '22' -D securities_master 工作正常。

这里,mysql连接端口是22,如果真的可以,那么

host = '192.168.x.x'
user='superuser'
password='superuser'
database='securities_master'

import pymysql.cursors
connection = pymysql.connect(host=host,
                             port=3306,
                             user=user,
                             password=password,
                             db=database,
                             charset='utf8',
                             cursorclass=pymysql.cursors.DictCursor)

应该是

host = '192.168.x.x'
user='superuser'
password='superuser'
database='securities_master'

import pymysql.cursors
connection = pymysql.connect(host=host,
                             port=22,
                             user=user,
                             password=password,
                             db=database,
                             charset='utf8',
                             cursorclass=pymysql.cursors.DictCursor)

端口号已从 3306 改为 22。

你可以检查一下

pymysql.connect(db='securities_master', user='superuser', passwd='superuser', host='192.168.x.x', port=22)

【讨论】:

不,对不起,我的意思是命令行和 python 方法都不起作用。我会用不同的端口再试一次 @JoanArau 在这种情况下,你能分享在 mysql 工作台中工作的连接字符串吗?此外,如果以某种方式限制主机,您可能需要查看权限部分。如果它有这样的限制,那么 mysql 工作台可能会在其他连接失败时使用 SSH 隧道。我在考虑 SSH 隧道,因为 22 是默认的 SSH 端口,在 mysql 工作台中,如果它使用 SSH 隧道,您可以看到它。 这里是初学者,如何在工作台中查看连接字符串以显示给您? 这个?超级用户@127.0.0.1::3306。命令行中工作台的此命令也适用:“/Applications/MySQLWorkbench.app/Contents/MacOS/mysql”“-usuperuser”“-h127.0.0.1”-P50416 -p 127.0.0.1 是本地主机,您是否在本地计算机上托管了 mysql 服务器?您已经提到它是远程的,所以在这种情况下 mysql 工作台肯定使用了隧道。使用任何管理工具(如 mysql workbench)登录 mysql。进入权限,选择用户,它可能只有一个条目,主机为localhost。现在创建另一个具有相同用户名和密码的条目,但主机将是%。现在再试一次。 % 表示任何主机。

以上是关于远程 mysql 连接在工作台中有效,但在 python 中无效的主要内容,如果未能解决你的问题,请参考以下文章

Spring 4 安全、MySQL、c3p0 连接。登录在 Spring 5 中有效,但在 Spring 4 中无效

查询在 mysql 工作台中有效,但在 php 中无效,不知道为啥

mySQL 命令行有效,但 ODBC 和工作台无效

对远程站点的本地 AJAX 调用在 Safari 中有效,但在其他浏览器中无效

适用于 Windows 的 ClickHouse MYSQL 驱动程序无法正常工作

无法在 cron 中获取远程 ssh 标准输出,但在我的终端中它可以工作