Базу пинговать перед каждым запросом - жалко таким способом удваивать количество запросов к базе.
Надо действительно усылать в базу обычный (как ни в чём ни бывало) запрос, который предусмотрен логикой задачи, а не логикой проверок доступности базы, а затем проверять успешность выполнения этого запроса.
Некоторое время я не мог понять: как узнать - успешно ли выполнился запрос или нет.
В перле я открываю соединение с базой и работаю с нею долго. В это время сервер mysqld может перезапуститься (не важно - почему) или просто разорвать соединение с перл-скриптом по таймауту и мой дескриптор соединения с базой протухнет.
Ну почитал я тут по округе сегодня немного и нашукал интересный параметр: $dbh->errno
Если после подключения из перла к mysql этот mysql-сервер перезапустился (ну это равнозначно разрыву соединения перл <-> mysql по любой причине), а я всё-равно через дескриптор старого подключения пытаюсь услать в базу запрос, то этот $dbh->errno становится непустым. Эврика? 😁
Вот кусок кода, в котором я открываю соединение с базой, пепезапускаю mysql-сервер, затем без установки нового соединения с сервером "пытаюсь" услать в него через старый протухший дескриптор запрос и потом в этом протухшем дескрипторе дивлюсь на непустой (2006) номер ошибки:
my $dbh = Mysql->Connect("localhost","test",,"nobody");
system "service mysql restart";
my $sth = $dbh->Query('select 1');
say 'errno=[' . $dbh->errno . ']';
А вот пример его работы:
Shutting down MySQL.... SUCCESS!
Starting MySQL. SUCCESS!
DBD::mysql::st execute failed: MySQL server has gone away at /usr/local/lib/perl5/5.18/Mysql.pm line 178.
errno=[2006]