如何增加 MySQL 的最大允许数据包大小?

时间:2021-03-19 14:01:42

标签: mysql sqlalchemy flask-sqlalchemy pythonanywhere

我遇到了 MySQL 问题。我收到错误 Lost connection to MySQL server during query。在 StackOverflow 上,他们说 MySQL 配置中的 max_allowed_packet 很可能太低了。

我已尝试在 /etc/mysql/my.cnf 中对其进行更改,但该文件不可编辑。 sudo 不能用于 PA。

我使用 Sqlalchemy 来处理与 MySQL 服务器的交互。

我能做什么?

编辑:

我已将其传递给配置变量:

class ProductionConfig:
      SQLALCHEMY_DATABASE_URI = 'mysql://myconnection@server$db?max_allowed_packet=32M'

然后传递给app和db初始化:

app.config.from_object(ProductionConfig)
db.init_app(app)  #  db = Sqlalchemy()

输出:

TypeError: 'max_allowed_packet' is an invalid keyword argument for connect()

3 个答案:

答案 0 :(得分:1)

在我增加池回收后问题消失了:

使用 Sqlalchemy:

class Config:
    SQLALCHEMY_DATABASE_URI = 'mysql://<your-connection-string>'
    SQLALCHEMY_POOL_RECYCLE = 280

这不是我的主意。 PythonAnywhere 的一名工作人员提出了建议。

答案 1 :(得分:0)

如果您有 SUPER 权限,您可以更改全局变量。但是您无法使这些更改持久化,因此如果 MySQL 服务器重新启动,更改将恢复为原始值。

mysql> set global max_allowed_packet=1024*1024*32;
Query OK, 0 rows affected (0.00 sec)

我不熟悉 Python Anywhere,但我猜如果您没有编辑配置文件的权限,您可能也没有 SUPER 权限。

唯一的另一种选择是您将自己限制在适合运行 Python Anywhere 的人员为您配置的 max_allowed_packet 的查询和结果。

如果您需要更多功能,那么是时候学习运行您自己的服务器了。

答案 2 :(得分:0)

您可以在客户端端和服务器端指定此标志,但服务器端是限制。您可以按照 Bill Karwin 的回答或尝试在客户端进行更改并产生什么效果。

在客户端,shell:

mysql --max_allowed_packet=32M mydb -e 'SELECT * FROM table1'

在客户端,PyMySQL 示例:

g.db = pymysql.connect(
  host               = 'localhost',
  port               = 3306,
  user               = 'user',
  password           = 'password',
  database           = 'mydb',
  max_allowed_packet = '32M'
)

在客户端,SQLAlchemy,但我不确定这是否会按预期工作:

engine = create_engine("mysql+pymsql://user:pass@some_mariadb/dbname?charset=utf8mb4&max_allowed_packet=32M")