空行包体mysql

时间:2016-05-07 18:23:25

标签: php mysql

我通常在学校大学的同一环境中编码。今天图书馆因装修而关闭,所以我换了图书馆。

我的查询总是在我常用的图书馆工作。我的生产环境查询没有问题。

现在,在这个新库中使用此连接时,我的mysql查询是无论是无限期还是我收到此Warning: Empty row packet body

改变唯一不同的是wifi连接。我不确定无线连接如何能够使我的查询无效或抛出此错误Warning: Empty row packet body

你们有没有经历过这个或者有任何关于如何解决这个问题的线索。第一次发生在我身上。在家里没问题,平时库没问题,在生产服务器级别没问题,但在这个特定的库,问题。

有趣的是,当我尝试ssh到我的服务器时,我的连接就会丢失。

感谢您的帮助

  • 好的,我只是要离开这个图书馆,似乎用一些伏都教网络魔法限制了我。

编辑失败的查询InnoDB示例(超过100万个表)

 SELECT 
  ST_X(cs.point) AS X, 
  ST_Y(cs.point) AS Y, 
  s.sizeFormat AS size, 
  s.size as sizeHM, 
  es.name AS estateSize, 
  cs.noLogement as estateSizeHM, 
  cs.title AS title, 
  dbr.name AS dateBuiltRange, 
  DATE_FORMAT(cs.dateBuilt, '%Y') as dateBuiltRangeHM, 
  m.myId AS meuble, 
  cs.meuble_id as meubleHM, 
  cs.captionPath AS paths, 
  DATE_FORMAT(cs.rentPriceDate, '%d-%m-%Y') as date, 
  cs.rentPrice as price 
FROM 
  CommonSummary AS cs 
  LEFT JOIN Size AS s ON (cs.size_id = s.id) 
  LEFT JOIN Meuble AS m ON (cs.meuble_id = m.id) 
  LEFT JOIN EstateSize AS es ON (cs.estateSize_id = es.id) 
  LEFT JOIN DateBuiltRange AS dbr ON (cs.dateBuiltRange_id = dbr.id) 
  LEFT JOIN City AS city ON (cs.city_id = city.id) 
  LEFT JOIN Quartier AS q ON (cs.quartier_id = q.id) 
  LEFT JOIN Arrondissement AS arr ON (cs.arrondissement_id = arr.id) 
WHERE 
  cs.validPoint = 1 
  AND cs.subCatMyId = 1 
  AND (
    cs.rentPriceDate <= '2016-06-30 23:59:59' 
    and cs.rentPriceDate >= '2016-04-01 00:00:00'
  ) 
 AND cs.rentPrice <= 2000 
 and cs.rentPrice >= 150 
 AND (cs.cityMyId = '1') 
LIMIT 
 5000

编辑2

MYSQL日志:Got an error writing communication packets

编辑3

我去了一家咖啡馆,热闹,神奇,它有效。

3 个答案:

答案 0 :(得分:0)

备份您的数据库并尝试将表引擎从MyISAM切换到InnoDB。 MyISAM锁定整个表,而InnoDB更好地处理正在更改的行。

来自MySQL文档:http://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html

  

ALTER TABLE table_name ENGINE=InnoDB;

     

重要

     

不要将mysql数据库(例如用户或主机)中的MySQL系统表转换为   InnoDB类型。这是一项不受支持的操作。系统表必须   永远属于MyISAM类型。

答案 1 :(得分:0)

由于这是仅与特定环境相关的网络问题,因此在从新库连接时,您可以尝试增加net_read_timeoutnet_write_timeout

SET @@local.net_read_timeout=600;
SET @@local.net_write_timeout=600;

它只会影响当前会话,因此请在查询之前运行它。玩这些值来找到合适的东西(如果是这种情况)。

参阅

mysql> show variables like "net_%_timeout";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| net_read_timeout  | 30    |
| net_write_timeout | 60    |
+-------------------+-------+
2 rows in set (0.00 sec)

mysql> SET @@local.net_read_timeout=600;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "net_%_timeout";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| net_read_timeout  | 600   |
| net_write_timeout | 60    |
+-------------------+-------+
2 rows in set (0.00 sec)

答案 2 :(得分:0)

取决于您如何阅读表格: 通常你只需要

SET GLOBAL net_read_timeout = your_time_in_seconds;

如果您使用游标,则您的引擎必须是InnoDB并将两者都设置:

SET GLOBAL net_read_timeout = your_time_in_seconds;
SET GLOBAL net_write_timeout = your_time_in_seconds;

在Laravel项目中:

DB::statement("SET GLOBAL net_read_timeout = your_time_in_seconds;");
DB::statement("SET GLOBAL net_write_timeout = your_time_in_seconds;");