远程 mysql 连接在 workbench 中有效,但在 python 中无效

Remote mysql connection works in workbench but not in python

我在我的 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()) 

命令行returns这个: 错误 2013 (HY000):与位于 'reading initial communication packet' 的 MySQL 服务器失去连接,系统错误:3

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

Workbench连接牢固

我也解决了同样的问题:

  1. 检查您的 mysql 是否已授予 "root" 或 "youruserID" 从 localhost(127.0.0.1) 和 LAN(192.[=36) 访问的权限=]) 数据库权限?为此,只需 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)

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

     $ pip install mysql-connector-python
    
  3. 在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()) 
    

您提到 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)