mysql - 在 Perl 中终止 mysql 查询

标签 mysql perl dbi

我有一个 perl 脚本,在其中我从现有的 mysql 数据库创建一个表。我有数百个数据库,每个数据库中的表包含数百万条记录,因此,有时,由于索引问题,查询需要几个小时,有时由于连接不当,我会耗尽磁盘空间。有没有办法可以终止同一脚本中的查询,观察内存消耗和执行时间?

附注我在 Perl 中使用 DBI 模块作为 mysql 接口(interface)

最佳答案

就执行时间而言,您使用 alarm Perl 超时功能。

您的 ALRM 句柄可以是 die (参见下面的示例),或发出 DBI cancel调用 ( sub { $sth->cancel }; )

DBI documentation实际上对此有很好的讨论和示例:

  eval {
    local $SIG{ALRM} = sub { die "TIMEOUT\n" }; # N.B. \n required
    eval {
      alarm($seconds);
      ... code to execute with timeout here (which may die) ...
    };
    # outer eval catches alarm that might fire JUST before this alarm(0)
    alarm(0);  # cancel alarm (if code ran fast)
    die "$@" if $@;
  };
  if ( $@ eq "TIMEOUT\n" ) { ... }
  elsif ($@) { ... } # some other error

就监视内存而言,您只需要 ALRM 处理程序 - 而不是简单地死亡/取消 - 首先检查脚本的内存消耗。

我不会详细介绍如何测量内存消耗,因为这是一个不相关的问题,可能已经在 SO 上得到了全面的回答,但您可以使用 size()方法来自Proc::ProcessTable as described in the Perlmonks snippet Find memory usage of perl program .

关于mysql - 在 Perl 中终止 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4534437/

相关文章:

mysql - 如何在 Cloud 9 IDE 中重新安装 MySQL

regex - Perl 正则表达式从替换中返回匹配项

regex - 使用正则表达式查找 HTML 文本中具有双字母的单词

mysql - 如何从 Perl MySQL DBI 句柄中获取数据库名称?

java - 防止Java程序中的SQL注入(inject)攻击

mysql - 无法将 myisam sql 添加到服务器 5.5 中

python - 避免多次查询多个计数

perl - 一个 CPAN 模块来解析 google 风格的搜索查询术语?

database - 如何使用 DBI 从数据库中获取单个计数值?

mysql - perl fetchrow_array 只返回最后一列而不是所有列