【问题标题】:MySQL query killed - how to prevent that?MySQL查询被杀 - 如何防止这种情况?
【发布时间】:2014-01-28 21:14:47
【问题描述】:

我正在从 bash shell 运行 mysql-query,它应该将结果写入文件。东西看起来像这样(简化了一点):

   mysql -uname -ppwd wmap -e "select netpoints.bssid,netpoints.lat,netpoints.lon from netpoints,users WHERE ((users.flags & 1 = 1) AND users.idx=netpoints.userid) OR (netpoints.source=5);" >db/db.csv

查询本身没有问题并且工作正常,但直到某个时间脚本执行失败

   line 1: 11427 Killed 

那么...如何避免查询以这种方式终止?结果将是大量数据,并且查询需要很长时间才能执行,但只要有结果就可以。

(将命令和错误信息添加到代码标签中)

【问题讨论】:

  • 是手动杀死的吗?是否有更多来自 mysql 日志的调试信息?
  • 不,它不是手动杀死的——我猜这是因为查询太复杂/导致数据太多
  • 您是否通过 ssh 运行命令时出现超时问题?

标签: mysql sql linux bash


【解决方案1】:

默认情况下,整个结果集都在内存中获取。如果这变得太多,mysql客户端将被杀死。您可以使用 --quick 选项启动 mysql 客户端来防止这种情况:

   mysql --quick -uname -ppwd wmap -e  ... 

【讨论】:

  • 哦,不错!不知道 :-) 我想我从来没有读过 cli 的手册页。 +1
【解决方案2】:

您可能在 MySQL 中遇到了超时。您可能需要检查您的 MySQL 慢查询日志,看看是否是这种情况。如果是这样,您可能希望尽可能优化查询,或者增加 MySQL 中的超时时间(http://www.rackspace.com/knowledge_center/article/how-to-change-the-mysql-timeout-on-a-server 了解如何执行此操作的信息)。

【讨论】:

    【解决方案3】:

    在这种情况下,您应该使用LIMIT 来拆分查询结果。

    您的查询应该返回多少行?

    似乎会导致数十万(或数百万)行,消耗过多内存。您可以通过SELECT count(1) FROM netpoints WHERE <suppressed>; 进行检查

    如果这不是问题,很可能是您与 MySQL 的连接变得空闲,因此被 mysqld 自动关闭。要解决此问题,您可以更改脚本以发出定期命令,或增加 MySQL wait_timeout 配置。

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 1970-01-01
      • 2018-10-16
      • 2023-04-03
      • 2016-03-09
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多