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

How can I increase max allowed size of packet for MySQL?

我遇到了 MySQL 的问题。我收到错误 Lost connection to MySQL server during query。在 Whosebug 上,他们说 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()

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

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

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

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

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

您可以在 client 端和 server 端指定此标志,但服务器端是限制。您可以按照 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")

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

使用 SQLalchemy:

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

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