背景
- 近期对负责项目,配置了一套 主从复制的
MySQL
集群
使用了中间件mycat
但测试发现,替换了原来的数据连接后,会出现Packets out of order
的报错
同时注意到,有的框架代码中竟然也会失效,比如 controller 类中,获取
$request->all()
竟然变空了
分析、排查
- 首先,切换
mycat
后,程序报错的一段源码如下:
[2024-07-04 10:48:58] local.ERROR: Packets out of order. Expected 1 received 5. Packet size=85 (SQL: select `cms_password_resets`.* where `memberid` = 122 and `cms_password_resets`.`deleted_at` is null order by `id` desc) at D:\\phpstudy_pro\\WWW\\projzqb1b\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:664, ErrorException(code: 0): Packets out of order. Expected 1 received 5. Packet size=85 at D:\\phpstudy_pro\\WWW\\projzqb1b\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:332)
- 另外一段报错源码如下 (也是跟数据库连接有关):
[2024-07-04 16:14:53] local.ERROR: Allowed memory size of 268435456 bytes exhausted (tried to allocate 842087056 bytes) {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Allowed memory size of 268435456 bytes exhausted (tried to allocate 842087056 bytes) at D:\\phpstudy_pro\\WWW\\projzqb1b\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:330)
[stacktrace]SQLSTATE[HY000]: General error: 1047 Unsupported statement
-
根据百度经验,提示需要修改
mysql.cnf
中的max_allowed_packet
参数
但是,发现不应该是这个问题,毕竟不使用 mycat 时不会出现问题 -
继续查找发现,这个问题的原因很可能是数据库配置参数的 【预处理】问题
设置database.php
中的options
的预处理可以解决报错 (但是查询出来的数据全部转为了字符串
)
因为上述的变动,代码中的判断,可能会出现问题,尤其是一些 数字类型的
===
比对
- 希望得到的结果:同时满足 PDO::ATTR_EMULATE_PREPARES => true 和结果集数据类型不被隐式转换
解决方案:Laravel取出mysql数据全部被转成string类型问题
- 【建议】
配置使用了两天,发现在laravel框架中,会出现很多问题
甚至还会出现其他未注意到的隐藏BUG
比如,当前测试发现,当使用事务时,也会报错
通过百度经验,基本定位在 mycat 的版本与适用性上,对于初步摸索的开发者来说
我认为,选用macat 不合适(且官方已不再维护,百度经验也少)- 后面,探索 laravel 框架直接使用 主从配置,试试看吧
附录
- 关于 MySQL 的 Packets out of order 问题
- thinkphp5+mycat 查询出现 Packets out of order. Expected 4 received 0. Packet size=10
- Laravel连接mycat报错?
- PDO::ATTR_EMULATE_PREPARES为True时如何避免结果集中Int类型被转换为String