Python 程序与 MySQL 之间失去连接
Lost connection between Python program and MySQL
为什么会出现此错误?
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 连接器。
我 运行 这个 python 脚本在后台连续在 Amazon EC2 Ubuntu 实例(虚拟服务器)上运行:
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")
用于 mqtt 的 Mosquitto 和 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
, or interactive_timeout
过期时断开连接。
听起来你的程序整天都在工作,整夜都在睡觉(就像 Monty Python schtick 中的伐木工人)。当它醒来时,它没有连接到数据库,因为 MySQL 关闭了它。
对此你能做些什么?按照我的喜好顺序:
就在您的程序处理每个排队的项目之前,执行像 SELECT 1;
这样的空操作。如果该操作抛出异常,请重新打开数据库连接。这是一个很好的解决方案,因为如果必须重新启动 MySQL 数据库服务器,它会使您的应用程序更具弹性。有时,云提供商(AWS、Azure、Digital Ocean 等)不得不让主机停止服务。当他们这样做时,他们会反弹客户虚拟机,以便他们可以在新主机上启动。如果你幸运的话,他们会先警告你。
更新您的程序,使其在工作队列变空时关闭其数据库连接,并在有工作要做时重新打开它。
每隔一段时间(一分钟?)执行一次空操作 SELECT 1;
作为保活,这样 MySQL 就不会关闭连接。
将 wait_timeout
值更改为足够长的值。这会将其设置为一周。
SET @@GLOBAL.wait_timeout=604800
使用 86400
一天。
了解如何设置超时也很有用,因为它可以让您测试解决此问题的方法而无需等待很长时间。
为什么会出现此错误?
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 连接器。 我 运行 这个 python 脚本在后台连续在 Amazon EC2 Ubuntu 实例(虚拟服务器)上运行:
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")
用于 mqtt 的 Mosquitto 和 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
, or interactive_timeout
过期时断开连接。
听起来你的程序整天都在工作,整夜都在睡觉(就像 Monty Python schtick 中的伐木工人)。当它醒来时,它没有连接到数据库,因为 MySQL 关闭了它。
对此你能做些什么?按照我的喜好顺序:
就在您的程序处理每个排队的项目之前,执行像
SELECT 1;
这样的空操作。如果该操作抛出异常,请重新打开数据库连接。这是一个很好的解决方案,因为如果必须重新启动 MySQL 数据库服务器,它会使您的应用程序更具弹性。有时,云提供商(AWS、Azure、Digital Ocean 等)不得不让主机停止服务。当他们这样做时,他们会反弹客户虚拟机,以便他们可以在新主机上启动。如果你幸运的话,他们会先警告你。更新您的程序,使其在工作队列变空时关闭其数据库连接,并在有工作要做时重新打开它。
每隔一段时间(一分钟?)执行一次空操作
SELECT 1;
作为保活,这样 MySQL 就不会关闭连接。将
wait_timeout
值更改为足够长的值。这会将其设置为一周。
SET @@GLOBAL.wait_timeout=604800
使用 86400
一天。
了解如何设置超时也很有用,因为它可以让您测试解决此问题的方法而无需等待很长时间。