Запретить определенный запрос в mysql


#1

Добрый день!

Подскажите, возможно ли как-то временно запретить определенный sql-запрос? Есть какой-то не понятный паразитный запрос, принадлежность которого никак не могу вычислить, select. Он всё-равно никогда не завершается т.к. киляется по времени выполнения. Не могу найти откуда он берется, но генерируется ежеминутно. Возможно ли что-то изобразить чтобы запретить его выполнение? Запрос - по сути построение списка товаров из всех, с описаниями и ценами. Без отбора по категориям, кто его генерирует - не знаю. Но их каждую минуту по несколько штук. Нужен костыль, пока не найду корень зла.


#2

Может в api кто-то долбится? Попробуйте файл api.php переименовать, если api не используете


#3

Хорошая идея, но, к сожалению, не оно :frowning:
SELECT products.product_id, descr1.product as product, products.product_type, products.parent_product_id, products.master_product_id, products.company_id, products.rf_stop_update_price, products.rf_stop_update_amount, products.rf_stop_update_status, descr1.meta_keywords, descr1.meta_description, descr1.page_title, descr1.full_description, descr1.short_description, (SELECT SUM(amount) FROM cscart_products WHERE product_id = products.product_id AND company_id = 1) as geolocation_amount, 0 as geolocation_amount2 FROM cscart_products as products LEFT JOIN cscart_product_descriptions as descr1 ON descr1.product_id = products.product_id AND descr1.lang_code = ‘ru’ LEFT JOIN cscart_product_prices as prices ON prices.product_id = products.product_id AND prices.lower_limit = 1 INNER JOIN cscart_products_categories as products_categories ON products_categories.product_id = products.product_id INNER JOIN cscart_categories ON cscart_categories.category_id = products_categories.category_id WHERE 1 AND prices.usergroup_id IN (0) AND products.company_id <> 0 AND products.product_type != ‘D’ GROUP BY products.product_id ORDER BY products.product_id asc, products.product_id ASC LIMIT 0, 50:

Вот так выглядит запрос. Часть элементов в запросе - от кастомного модуля по геопозиции подлючаемого хуком, оно в данном магазине на большинстве страниц.

А долбит вот так:


#4

Прежде чем “блокировать”, всё же стоит разобраться, что приводит к его вызову)

Для этого можно добавить логирование в функцию \Tygh\Database\Connection::query (app/Tygh/Database/Connection.php) такого вида (функцию логирования прикладывать не стану, подойдёт любой удобный вам вариант):

if (strpos($query, 'запрос') !== false) {
    _log(debug_backtrace(2));
}

Примерно после

                    fn_print_r($query);
            }

Не забудьте в аргументе с запросом экранировать одинарные кавычки.

В логе можно будет глянуть откуда вызов. Ну и для полноты картины, в лог можно передавать $_REQUEST, чтобы понимать какие параметры были в запросе, и $_SERVER['REQUEST_URI'] чтобы понимать на какой странице это всё происходило.

Если понадобится с этим помощь, приходите к нам в Help Desk, посмотрим своими силами.