远程 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 中无效,不知道为啥
对远程站点的本地 AJAX 调用在 Safari 中有效,但在其他浏览器中无效