Yandex Metrika
sanches.free

sql_mode после обновления MySQL: ONLY_FULL_GROUP_BY и что делать на сервере с Битрикс

Откуда берётся ошибка

С версии MySQL 5.7.5 в стандартный набор включили ONLY_FULL_GROUP_BY. Движок требует, чтобы каждая колонка в списке SELECT при наличии GROUP BY либо входила в группировку, либо однозначно выводилась из группы через агрегат. Старый SQL с «случайной» недетерминированной колонкой теперь падает с сообщением вида:

Expression #… of SELECT list is not in GROUP BY clause and …
… incompatible with sql_mode ONLY_FULL_GROUP_BY

В экосистеме 1С‑Битрикс это не только «чужие» CMS‑плагины — любой произвольный отчёт, сырой $DB->Query или обмен может годами жить без группировки «по правилам», пока режим сервера мягкий.

Правильный долгосрочный ответ

Исправить текст запроса: добавить недостающие поля в GROUP BY, завернуть «лишнее» в MAX()/MIN() осознанно, переписать подпроекцию. Так вы не ломаете семантику отчётов после следующего патча или смены движика на другую ветку MariaDB или другую сборку Bitrix‑ВМ.

Где узнать фактический sql_mode

SELECT @@GLOBAL.sql_mode AS global_mode,
       @@SESSION.sql_mode AS session_mode;

Для сравнения с тем, как сервер был запущен, полезно глянуть цепочку конфигов, которую парсит mysqld (пути зависят от дистрибутива):

mysqld --verbose --help 2>/dev/null | grep -A1 '^Default options'

Обычно в списке фигурируют /etc/my.cnf, /etc/mysql/my.cnf и пользовательский ~/.my.cnf — править нужно именно активный файл для вашей службы (mysqld или mariadb).

Временное ослабление на уровне сервера

Если бизнесу нужно «остановить кровотечение» до релиза фиксов, из строки режимов убирают ONLY_FULL_GROUP_BY и задают остальное без изменений, например секциями:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Точный набор ключей должен совпасть с тем, что вы сняли у себя оператором SELECT @@GLOBAL.sql_mode, только без удаляемого флага. После сохранения — перезапуск службы БД (systemctl restart mysql или эквивалент хостинга).

Риски: вы снова разрешаете недетерминированные результаты в группировках; возможны расхождения между стендом без ослабления и боем.

Связка с Битрикс

Не смешивайте правку режима без аудита модулей: маркетплейсовые решения могут генерировать «старый» SQL. Держите хотя бы один стенд с жёстким ONLY_FULL_GROUP_BY, чтобы ловить регрессии до продакшена.

Итог

ONLY_FULL_GROUP_BY — сигнал, что группировку надо поправить в запросах; глобальное выключение в my.cnf оставляйте временной мерой под контролем сроков, а не постоянным «решением» для сайта на 1С‑Битрикс.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии