Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Почему MySQL внутри Docker-контейнера прерывает (отменяет) «длинные» запросы?

Интересная особенность обнаружена (см. сабжект). Есть контейнер. yml вот такой:
version: "2.1"
services:
   database:
      container_name: mysql8_v001
      image: mysql:latest
      volumes:
         # - "d:/docker-compose/mysql/cfg:/etc/mysql"
         - "d:/docker-compose/mysql/data:/var/lib/mysql"
      environment:
         - "MYSQL_ROOT_PASSWORD=пароль"
         - "MYSQL_ROOT_HOST=10.10.10.10"
      ports:
         - "3306:3306"
      command: --bind-address="0.0.0.0" --skip_ssl="true" --wait_timeout="300" --mysqlx_read_timeout="300" --mysqlx_connect_timeout="300" --net_read_timeout="300"

Как можно понять, работает под Windows. И если время выполнения запроса превышает 31 сек, то такой запрос не выполняется. Например:

SELECT DISTINCT
  COUNT(scraper_tbhosts.id) AS NUM
FROM scraper_tbhosts
  LEFT OUTER JOIN taggit_taggeditem
    ON taggit_taggeditem.object_id = scraper_tbhosts.id
  INNER JOIN taggit_tag
    ON taggit_taggeditem.tag_id = taggit_tag.id
WHERE taggit_tag.name IN ('http', 'https')
AND taggit_taggeditem.content_type_id = 7

... будет прерван. А абсолютно такой-же запрос:

SELECT DISTINCT
  COUNT(scraper_tbhosts.id) AS NUM
FROM scraper_tbhosts
  LEFT OUTER JOIN taggit_taggeditem
    ON taggit_taggeditem.object_id = scraper_tbhosts.id
  INNER JOIN taggit_tag
    ON taggit_taggeditem.tag_id = taggit_tag.id
WHERE taggit_tag.name NOT IN ('http', 'https')
AND taggit_taggeditem.content_type_id = 7

... будет выполнен (5.8 секунды, возвращает NUM что-то в районе полтора миллиона).

Отличие в IN или NOT IN, а значит всё упирается только во время исполнения именно на моём наборе данных...

Как видно: настройка в конфиге mysql не влияет. И даже более того, сразу после перезагрузки контейнера запрос может выполнится (по-моему, только если это первый запрос после перегрузки контейнера) и время выполнения 1 минута 50 секунд ... Повтрорное исполнение запроса -- прерывается по таймауту... Т.е. дело в каких-то других настройках MySQL, или в Dockers... но где и что не так??

P.S. Дя, я пишу парсер-исследователь всего интернета и запрос пытается понять какие хосты не отвечают ни по http, ни по https (т.е. хосты которые отвалились по тамайутам, вернули код ошибки не равный 200 и т.п.)
  • Вопрос задан
  • 112 просмотров
Решения вопроса 2
@neol
В mysql далеко не один таймаут
SHOW VARIABLES WHERE Variable_name LIKE '%timeout%';


К примеру net_read_timeout по умолчанию равен 30, возможно в него вы и упираетесь.
Ответ написан
Sergei_Erjemin
@Sergei_Erjemin Автор вопроса
Улыбайся, будь самураем...
Оказалось проблема в клиенте. Я тестировал запросы на dbForge Studio for MySQL Professional версии 9.0.304 ... А у него как раз проблема с коннектом. Ее поправили в версии 9.0.338

https://www.devart.com/dbforge/mysql/studio/revisi...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы