• MySQL Insert数据量过大导致报错 MySQL server has gone away


    接手了同事的项目,其中有一个功能是保存邮件模板(包含图片),同事之前的做法是把图片进行base64编码然后存在mysql数据库中(字段类型为mediumtext)
    然后保存三张图片(大概400k)的时候报错
    MySQL server has gone away

    然后查看官方文档https://dev.mysql.com/doc/ref...

    
    得知可能是以下几个原因 
    服务器超时
    服务器断开
    向服务器发送不正确或太大的查询
    INSERT或者 REPLACE是插入大量行
    
    

    开始以为是服务器超时导致的,在网上搜的解决办法(好吧,先试一下 ,发现还是不行):

    
    <?php
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
                                            PDO::ATTR_PERSISTENT => true
    ));
    ?>
    Note:
    如果想使用持久连接,必须在传递给 PDO 构造函数的驱动选项数组中设置 PDO::ATTR_PERSISTENT 。如果是在对象初始化之后用 PDO::setAttribute() 设置此属性,则驱动程序将不会使用持久连接。
    
    
    

    直接在Navicat上执行sql语句,报错 [Err] 1153 - Got a packet bigger than 'max_allowed_packet' bytes
    搜索得知:当MySQL客户端或mysqld服务器收到大于max_allowed_packet字节的信息包时,将发出“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与MySQL服务器的连接”错误。
    客户端和服务器均有自己的max_allowed_packet变量,因此,如你打算处理大的信息包,必须增加客户端和服务器上的该变量。一般情况下,服务器默认max-allowed-packet为1MB
    这下问题精确定位了,就是max_allowed_packet配置的问题,

    查一下配置 show VARIABLES like '%max_allowed_packet%'; 发现是1048576(1024*1024),也就是1MB,
    但是我的图片才400K,不应该啊,然后网上一查:Base64-encoded 数据要比原始数据多占用 33% 左右的空间。
    还是不确定,直接strlen()返回base64字符串长度1451334,utf8编码下英文字符1字符占1字节,所以base64编码后是1451334B(这个是我自己的理解),大于1MB

    修改max_allowed_packet配置 set global max_allowed_packet = 410241024;

    发现问题完美解决

    原文地址:https://segmentfault.com/a/1190000015934052

  • 相关阅读:
    记录------敬畏生活
    不错的博客分享
    Python学习笔记(一) 字符串和编码
    OSPF(二)基础实验 ASBR--- 在OSPF中引入自治系统外部路由--- LSA4和LSA5
    OSPF(一)基本概念和基础实验
    LAMP--PHP实验(四)使用包含文件提高代码效率
    LAMP--PHP实验(三)在页面之间传送变量 及遇到问题解决
    LAMP--PHP实验(二)常量和变量
    LAMP--PHP实验(一)第一个PHP程序
    随机获取图片的API
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9975262.html
Copyright © 2020-2023  润新知