MySQL sleep запросы

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: MySQL

MySQL sleep запросы

Многим новичкам интересно знать, откуда берутся эти спящие запросы в мускуле, а все очень просто.

Давайте освежим память перечнем того, как все работает.

  1. пользователь открывает страницу Вашего сайта
  2. на сервер приходит запрос к Apache
  3. Apache посылает запрос PHP
  4. PHP подключается к MySQL
  5. PHP направляет SQL-запрос в MySQL
  6. MySQL выполняет запрос и отдает результат в PHP
  7. PHP закрывает соединение с MySQL
  8. PHP формирует контент и отдает его в Apache
  9. Apache посылает ответ в браузер

Вроде бы все отлично, и никаких проблем быть не может, но они появляются на шаге 6, потому, что до шага 7 дело не доходит.

А может это быть потому, что PHP скрипт не завершает свою работу, и обычно причина:

  • банальная нехватка памяти (память можно увеличить в PHP-конфиге)
  • неправильная логика работы скрипта в результате которой получился безконечный цикл
  • php-процесс просто убили в консоле

Собственно все, исправляйте одну из этих ошибок и SLEEP-запросов не будет.

Удачки!

А теперь подробнее, для тех кто не поверил и хочет разобраться подробнее:

mysql> show full processlist;
+-----+------------+-----------+------------+---------+------+-------+-----------------------+
| Id  | User       | Host      | db         | Command | Time | State | Info                  |
+-----+------------+-----------+------------+---------+------+-------+-----------------------+
| 127 | putin      | localhost | mydb       | Sleep   |  895 |       | NULL                  |
| 130 | root       | localhost | mydb       | Query   |    0 | NULL  | show full processlist |
+-----+------------+-----------+------------+---------+------+-------+-----------------------+

итак, мы видим зависший MySQL-процесс, и в довесок к нему мы можем увидеть зависший Apache-процесс

# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
...
tcp        0      0 127.0.0.1:80            127.0.0.1:47733         ESTABLISHED 27420/apache2
...

а давайте убьем Apache-процесс, ведь это должно отразиться и на MySQL:

# service apache2 restart

готово, теперь смотрим на MySQL-процессы:

mysql> show full processlist;
+-----+------------+-----------+------------+---------+------+-------+-----------------------+
| Id  | User       | Host      | db         | Command | Time | State | Info                  |
+-----+------------+-----------+------------+---------+------+-------+-----------------------+
| 130 | root       | localhost | mydb       | Query   |    0 | NULL  | show full processlist |
+-----+------------+-----------+------------+---------+------+-------+-----------------------+

и видим, что спящего процесса нет, а это значит, что не смотря на то, что PHP подключается к MySQL, а не Apache, все же при сбое в работе PHP-скрипта, Apache остается связан с MySQL, ведь его процесс является родительским по отношению к MySQL.

Удачки в разработке!

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты