【问题标题】:How can I increase max allowed size of packet for MySQL?如何增加 MySQL 的最大允许数据包大小?
【发布时间】:2021-06-16 22:42:22
【问题描述】:

我遇到了 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()

【问题讨论】:

  • 修复你的连接字符串 :) 有一个$ 应该是一个/

标签: mysql sqlalchemy flask-sqlalchemy pythonanywhere


【解决方案1】:

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

使用 Sqlalchemy:

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

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

【讨论】:

  • 不错!很高兴知道!
  • 为了清楚起见,如果其他人将来遇到这个问题——你得到的错误(查询期间与 MySQL 服务器的连接丢失)可能是由许多不同的事情引起的; max_allowed_pa​​cket 修复仅适用于您尝试将非常大的东西插入数据库(如兆字节左右)的情况。 PythonAnywhere 工作人员建议修复 pool_recycle 的原因是因为实际的潜在问题是其他问题(服务器端连接超时)。
【解决方案2】:

如果您有 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 中的查询和结果。

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

【讨论】:

    【解决方案3】:

    您可以在 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 来处理与 MySQL 服务器的交互。有没有办法指定max_allowed_packet参数?
    • 也许有这个字符串mysql+pymysql://user:pass@localhost:3306/db?max_allowed_packet=32M,但我不确定。
    • 很遗憾,没有,我收到了错误:TypeError: 'max_allowed_packet' is an invalid keyword argument for connect() 不过想法不错。
    • 真的吗?奇怪,在这里工作。也许你将它传递到连接字符串之外。
    • 添加以反映您的建议。
    猜你喜欢
    • 2014-09-02
    • 2020-04-21
    • 2023-04-10
    • 2023-04-07
    • 2022-10-12
    • 2023-03-27
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多