如何增加 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 的一名工作人员提出了它。
我遇到了 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 的一名工作人员提出了它。