Почему MySQL прерывает (отменяет) «долгие» запросы?
Есть контейнер. 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 не влияет. И даже более того, сразу после перезагрузки контейнера запрос может выполнится (по-моему, только если это первый запрос после перегрузки контейнера) и время выполнения почти две нинуты ... Повторное исполнение запроса -- прерывается по таймауту... Т.е. дело в каких-то других настройках MySQL, или в Dockers... При этом в MySQL никаких настроек таймаутов, где есть 30 уже не осталось!.. Где и что не так??
P.S. Дя, я пишу парсер-исследователь всего интернета и запрос пытается понять какие хосты не отвечают ни по http, ни по https (т.е. хосты которые отвалились по тамайутам, вернули код ошибки не равный 200 и т.п.)
P.P.S. Запросы тестирую через dbForge Srudio for MySQL, но в нем нет настроек таймаутов... Только таймауту отладки и там они установлены в 300 секунд (!). Возможно дело в версии MySQL? Сейчас стоит 8.0.20 ... До того работал с другими версиями и никаких подобных проблем не наблюдал...
Ответы (1 шт):
Оказалось проблема в клиенте. Я тестировал запросы на dbForge Studio for MySQL Professional версии 9.0.304 ... А у него как раз проблема с коннектом. Ошибку поправили в версии 9.0.338
https://www.filehorse.com/download-dbforge-studio-mysql/change-log/