【发布时间】:2021-11-16 05:14:14
【问题描述】:
执行多插入查询时,我收到错误“SQLSTATE[08S01]: Communication link failure: 1153 Got a packet greater than 'max_allowed_packet' bytes”。我有一个复杂的类,它组成了多插入查询,彻底检查了限制,所以这真的很奇怪,但是,我们都是人类,所以在尝试找到问题后,我刚刚捕获并记录了异常详细信息并且可以不明白发生了什么。代码(PHP 7.4、PDO、MariaDB 10.5.10):
$this->pdoInstance = sql_get_connect($this->connection);
$stmt = $this->pdoInstance->query("show variables like 'max_allowed_packet'");
$d = sql_fetch($stmt);
$stmt->closeCursor();
$this->max_size = (int) $d['Value'];
...
try {
$stmt = $this->pdoInstance->query($query);
} catch (CDbException $e) {
if (strpos($e->getMessage(), 'max_allowed_packet') !== false) {
log ([
'total_size' => strlen($query),
'max_size' => $this->max_size,
];
}
throw $e;
}
我得到的是:
total_size => 33554425
max_size => 33554432
所以我发送的查询实际上比限制少了 7 个字节。但是问题被稳定地重现了。是什么原因造成的?可能有一些标题与查询或任何东西一起发送,但我如何确定它们的大小?我在 MySQL 和 MariaDB 文档中都没有找到任何关于它的信息。
【问题讨论】:
-
忽略语言,does the answers to this question help?。似乎与其说是程序问题,不如说是网络问题。
-
我会假设数据包有超过 7 个字节的开销。
-
谢谢你的想法,@Jaquarh,但我不这么认为。我收到的错误消息指定错误代码 1153 并提到超过 max_allowed_packet 字节长度。此外,它是一个每秒有大量查询的生产系统,并且在 99.99% 的时间内一切正常;多说一句,我正在运行的脚本也可以正常工作 --- 有一段时间了,并且仅在使查询非常接近限制的某些特定数据集上失败。
-
我可能会假装 max_size 比实际限制低一点,比如 (int) $d['Value'] - 256 或 (int) ($d['Value'] * 0.9),这将起作用。但我想了解问题的原因:为什么真正的限制与 max_allowed_packet 不同?有什么区别,差值取决于什么?这就是为什么我问我的问题,希望有人已经解决了它并可以回答它。
标签: php mysql pdo mariadb max-allowed-packet