Windows容器下mysqlsh连接MySQL报1041内存不足但mysql命令行可正常连接
问题根因定位与解决方案
- 首先排除真内存不足问题:你提到宿主机和容器都有3GB可用内存,该报错为Windows容器下MySQL的协议适配、内存分配逻辑缺陷导致的误报。
排查&修复步骤
- 验证连接协议问题
mysqlsh默认优先使用X协议连接MySQL,而原生mysql命令行默认使用经典TCP协议,8.0.26版本Windows版MySQL的X协议插件存在内存预分配bug,会触发1041错误。
可先执行以下命令强制mysqlsh使用经典协议连接,验证是否能正常连通:
mysqlsh -uroot -poracle -hMYSQL80-01 -Dsys --js --interactive --mysql
如果可以连通说明是X协议的问题,可选择两种方案修复:
- 临时不需要X协议的话,在MySQL配置文件my.ini中添加配置禁用X插件:
loose-mysqlx = OFF - 需要保留X协议的话,调低X协议预分配资源阈值,添加配置:
mysqlx_max_connections = 10 mysqlx_read_buffer_size = 64K
- 调整Windows容器运行参数
Windows Server 2022容器默认的连续虚拟内存分配上限低于实际可用物理内存,即使宿主机有剩余内存,也会出现大块内存分配失败的情况。启动容器时添加以下参数调整内存限制:
docker run -d --memory 4G --memory-swap 8G --isolation process 你的MySQL镜像名
--isolation process 使用进程隔离替代默认的Hyper-V隔离,可大幅降低内存碎片化概率。
- 版本升级修复已知bug
MySQL 8.0.26 Windows版本存在已知的X协议连接内存计算缺陷,当请求来自同节点容器网络时会错误计算所需内存大小,导致分配失败误报1041,该问题在8.0.28及之后的版本已经修复,可直接升级对应版本的Windows容器镜像解决。
内容的提问来源于stack exchange,提问作者mark d drake
相关产品推荐
相关产品推荐

