python - Python 程序和 MySQL 之间失去连接

标签 python mysql mysql-connector mysql-connector-python

为什么我会收到此错误?

Mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server n '3.XX.XXX.89' (110)

我正在从 MQTT 代理收集数据并将其存储在 MySQL 数据库中。为了订阅 MQTT 代理上的主题,我使用 Paho MQTT 客户端,为了连接到 MySQL 数据库服务器,我使用 MySQL python 连接器。 我在 Amazon EC2 Ubuntu 实例(虚拟服务器)上连续在后台运行此 python 脚本:

import mysql.connector
import paho.mqtt.client as mqtt

#Mysql Settings
db = mysql.connector.connect(host='localhost',
                     user='user_name',
                     password='password',
                     db='db_name')

if db.is_connected():
   db_Info = db.get_server_info()
   print("Connected to MySQL Server version ", db_Info)

cursor = db.cursor()

#MQTT Settings
MQTT_Broker = "3.XX.XXX.89"
MQTT_Port = 1883
Keep_Alive_Interval = 60
MQTT_Topic = "my/publish/#"

#Subscribe
def on_connect(client, userdata, flags, rc):
    mqttc.subscribe(MQTT_Topic, 0)
    print("subscribed")

#Save data into DB Table
def on_message(mosq, obj, msg):
    print("Insert from MQTT")
    print("wait")
    print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
    sql = """INSERT INTO gnss (topic, gnssdata) VALUES (%s,%s)"""
    tuple = (msg.topic, msg.payload)
    cursor.execute(sql, tuple)
    db.commit()
    print("Record inserted successfully into gnss table")


def on_subscribe(mosq, obj, mid, granted_qos):
    pass

mqttc = mqtt.Client()

#Assign Event Callbacks
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe

#Connect
mqttc.connect(MQTT_Broker, int(MQTT_Port), int(Keep_Alive_Interval))

#Continue the network loop and close db connection
mqttc.loop_forever()
db.close()
print("MySQL connection is closed")

Mosquitto for mqtt 和 mysql 服务器安装在此虚拟服务器上。 首先,当我运行此脚本时,来自 MQTT 代理的所有数据都会被收集并存储到 mysql 数据库中。一整天都正常工作。第二天,我在没有做任何更改的情况下,将数据发送到 MQTT 代理。数据由 paho mqtt 客户端收集,但无法将此数据存储在 mysql 数据库中。 错误和输出如下:

('Connected to MySQL Server version ', '5.7.30-0ubuntu0.18.04.1')
subscribed
Insert from MQTT
wait
my/publish/topic 0 acc, 10245, tyu
Record inserted successfully into gnss table
Insert from MQTT
wait
my/publish/topic 0 hello world
Record inserted successfully into gnss table
Insert from MQTT
wait
my/publish/topic 0 hello world
Record inserted successfully into gnss table
Insert from MQTT
wait
my/publish/topic 0 new test
Record inserted successfully into gnss table
Insert from MQTT
wait
my/publish/topic 0 19/05/2020
Insert from MQTT
wait
my/publish/topic 0 19/05/2020
Insert from MQTT
wait
my/publish/topic 0 Tuesday
Insert from MQTT
wait
my/publish/topic 0 Tuesday
Traceback (most recent call last):
  File "mqtt.py", line 8, in <module>
    db='nrf91')
  File "/home/ubuntu/.local/lib/python2.7/site-packages/mysql/connector/__init__.py", line 264, in connect
    return CMySQLConnection(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 80, in __init__
    self.connect(**kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/mysql/connector/abstracts.py", line 960, in connect
    self._open_connection()
  File "/home/ubuntu/.local/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 219, in _open_connection
    sqlstate=exc.sqlstate)
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on '3.XX.XXX.89' (110)

我收到此 mysql 连接器数据库错误。如何解决这个错误?最初与 mysql 服务器有连接,但第二天就消失了。那么如何让它一直保持与mysql服务器的连接而不导致这个错误呢?

最佳答案

客户端(例如 python 程序)和 MySQL 之间的连接在不使用时不会永远保持打开状态。 MySQL 在 wait_timeout 时断开连接,或interactive_timeout ,过期。

听起来你的程序整天工作,整夜 sleep (就像 Monty Python 剧中的伐木 worker )。当它醒来时,它没有与数据库的连接,因为 MySQL 关闭了它。

对此你能做什么?按照我的偏好顺序:

  1. 更改您的程序以使用 connection pool 。如果您这样做,池逻辑将在您需要时恢复连接。

  2. 在程序处理每个排队项目之前,执行类似 SELECT 1; 的无操作操作。如果该操作引发异常,请重新打开数据库连接。这是一个很好的解决方案,因为如果必须重新启动 MySQL 数据库服务器,它可以使您的应用程序更具弹性。有时云提供商(AWS、Azure、Digital Ocean 等)必须停止主机服务。当他们这样做时,他们会退回客户虚拟机,以便他们可以在新主机上启动。如果你幸运的话,他们会先警告你。

  3. 更新您的程序,以便在其工作队列变空时关闭其数据库连接,并在有工作要做时重新打开它。

  4. 每隔一段时间(一分钟?)执行一次无操作 SELECT 1; 作为 keepalive,这样 MySQL 就不会关闭连接。

  5. wait_timeout 值更改为足够长的值。这将其设置为一周。

SET @@GLOBAL.wait_timeout=604800

使用86400一天。

了解如何设置超时也很有用,因为它可以让您测试此问题的解决方案,而无需等待很长时间。

关于python - Python 程序和 MySQL 之间失去连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61951269/

相关文章:

python - Python 中的问题拆分

python - 如何从流写入python中的共享内存?

python - 在 Jupyter Lab 中,在 Python 控制台中执行编辑器代码

php - 使用 PHP 登录不显示任何 html 代码

php - 我想从我的表中检索唯一值

python - 使用 Python 从 gradle 文件中提取依赖项和版本

php - 注意 : Undefined variable: table in C:\XAMPP\htdocs\progscores. php 第 27 行

VS2013更改数据源时缺少MySQL Data Provider

python - 编程错误: 1054 (42S22): Unknown column '' ColumnName '' in ' field list'

C++ Mysql 在数据库中保存二进制 blob