我通常在学校大学的同一环境中编码。今天图书馆因装修而关闭,所以我换了图书馆。
我的查询总是在我常用的图书馆工作。我的生产环境查询没有问题。
现在,在这个新库中使用此连接时,我的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
我去了一家咖啡馆,热闹,神奇,它有效。
答案 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_timeout
和net_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;");