Битрикс. Ошибка! innodb_strict_mode=ON, требуется OFF
В некоторых проектах на 1С-Битрикс после обновления MySQL или MariaDB появляются ошибки, связанные с:
innodb_strict_mode=ON
Особенно часто проблема возникает:
- на новых версиях MySQL;
- в MariaDB;
- после миграции сервера;
- после обновления Debian/Ubuntu;
- при переносе старых проектов Битрикс.
Как отключить innodb_strict_mode в Битрикс
Открываем файл:
/bitrix/php_interface/after_connect_d7.php
И добавляем строку:
$this->queryExecute("SET innodb_strict_mode=0");
Полный пример
<?
$this->queryExecute("SET innodb_strict_mode=0");
?>
Что делает after_connect_d7.php
Файл:
after_connect_d7.php
выполняется:
- после подключения к базе данных;
- для каждого нового соединения.
Это позволяет:
- изменять SQL-настройки;
- задавать timezone;
- выполнять SET-параметры MySQL.
Что такое innodb_strict_mode
Параметр:
innodb_strict_mode
включает строгую проверку SQL-операций InnoDB.
При:
innodb_strict_mode=ON
MySQL начинает жестче проверять:
- типы данных;
- индексы;
- размеры строк;
- формат таблиц;
- некорректные значения.
Какие ошибки возникают в Битрикс
Часто появляются ошибки:
Specified key was too long
или:
Row size too large
а также:
innodb_strict_mode=ON required OFF
Почему это происходит
Старые версии Битрикс и некоторые модули создавались:
- под старые версии MySQL;
- без strict mode;
- с устаревшими ограничениями InnoDB.
Почему лучше отключать локально
Использование:
SET innodb_strict_mode=0
внутри подключения Битрикс лучше, чем глобальное отключение в my.cnf.
Потому что:
- не затрагиваются другие проекты;
- не ломаются сторонние сервисы;
- изменение действует только для Битрикс.
Где еще можно отключить strict mode
Глобально:
/etc/mysql/my.cnf
или:
/etc/mysql/mariadb.conf.d/
Но это менее безопасный вариант.
Проверка текущего режима
Проверить текущий режим можно SQL-запросом:
SHOW VARIABLES LIKE 'innodb_strict_mode';
Когда используется after_connect_d7.php
- настройка timezone;
- SET NAMES;
- SQL MODE;
- локальные параметры MySQL;
- оптимизация соединения.
Итог
Если 1С-Битрикс ругается на:
innodb_strict_mode=ON
можно отключить strict mode для соединения Битрикс через:
/bitrix/php_interface/after_connect_d7.php
добавив строку:
$this->queryExecute("SET innodb_strict_mode=0");
Комментарии