@lestrratさんが教えてくれたことのメモ。
以下のコードはエラーとなります*1。
use strict; use warnings; use DBI; my $dbh = DBI->connect('DBI:mysql:mysql', 'root', 'password') or die DBI->errstr; my $pid; if ($pid = fork) { # NOP in the parent waitpid $pid => 0; } elsif (defined $pid) { # NOP in the child exit; } else { die "Couldn't fork, stopped"; } print $dbh->selectrow_array('select count(*) from user'), "\n"; 【実行結果】 DBD::mysql::db selectrow_array failed: MySQL server has gone away at xxxx.pl line 18.
InactiveDestroyをちゃんと設定してないだけとか?
仰せの通りでした。。。去年秋以降くらいの新しいDBIを使ってるなら、接続後に $dbh->{AutoInactiveDestroy} = 1 しとけばOKです。古いDBIなら、fork直後に子プロセス側で $dbh->{InactiveDestroy} = 1 にするといいです。podにも書いてます。