我有一个 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/