Не отключается strict mode mysql?
Проблема такая, перенести на новый сервер сайт, там принудительно уже работает STRICT_TRANS_TABLES
Режим строго mysql , мне нужно его отключить для корректной работы сайта.
Через phpmyadmin не дает, требует права super ( в isp панели при создания пользователя нет выбора разрешения super)

Нашел мануал что нужно редактировать конфиг
vim /etc/my.cnf
захожу в данный файл, а он выдает что есть какой то еще один файл
Дальше нажимаю все равно редактировать


Открывается девственно чистый файл,
Пишу туда через vim
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Сохраняю и перезагружаю mysql сервер.
Проверяю
Без толку, все равно работает , далее читаю что нужно
над строкой с параметрами в конфиге писать
[mysqld]
Написал, при попытке перезагрузить mysql выдает ошибку
Job for mysql.service failed because the control process exited with error code. See «systemctl status mysql.service» and «journalctl -xe» for details.
и не загружается.
CentOS 8 , Mysql 8.0.21
- Вопрос задан более двух лет назад
- 270 просмотров
Строгий режим MySQL и почему он должен быть включен
В MySQL есть такой специальный режим, предназначенный для введения в базу неправильных данных. Например, чтобы вместо 20000000000 вставлять в INT -поле 2147483647 . Или наполнять базу несуществующими датами. Или обрезанными строками. Ну или мало ли для чего этот режим может тебе пригодится.
Режим этот называется «обычный режим».
Хоть с первого взгляда оно кажется безумным, у такого поведения есть историческая причина.
Движок MyISAM, бывший стандартным движком MySQL до совсем недавних пор, не поддерживает транзакции. Если отваливался один из «как бы атомарного» набора запросов, база (в общем случае) теряла целостность. По сравнению с такой опасностью запись в базу неверных значений оказалась наименьшим злом.
Но ведь все сколько-нибудь компетентные вебдевелоперы знают, что надо использовать движок InnoDB, который — в контексте хранилища для сайта — со всех сторон лучше MyISAMа. В частности, InnoDB поддерживает транзакции, и все сколько-нибудь адекватные ORM (или их живые заместители, кодирующие запросы к базе) используют эти транзакции для обеспечения атомарности изменений.
Вот и получается, если ты используешь InnoDB и транзакции, щадящее отношение MySQL тебе только вредит. Каждая пропущенная проверка грозит засорением базы данных. Вот наглядный пример — каким полем ты хранишь URL? VARCHAR(255) ? А адрес может быть и в 2 килобайта длиной. В «обычном режиме» при переполнении строки MySQL всего лишь запишет предупреждение в лог, который никто не читает.
Строгий режим
Из обширного списка режимов MySQL нас интересует режим STRICT_TRANS_TABLES . Он запрещает то, о чем я рассказывал выше, и бросает ошибки на любые неправильные данные.
Говоря языком запросов,
SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE';
Разумеется, после такого изменения нужно прогнать тесты (если они есть), или хотя бы следить за ошибками (поскольку они появятся).
Выводы, касающиеся STRICT_TRANS_TABLES применительно к Ruby on Rails, можно почитать у меня в блоге.
Как отключить строгий режим MySQL в Laravel Forge (Ubuntu)
Строгий режим появился в MySQL ещё начиная с версии 5.1, но только в версии 5.7 он стал включённым по умолчанию. Если вы недавно обновили сервер, и внезапно ваше приложение перестало работать, то причиной мог стать как раз этот режим.
В Laravel вы можете исправить это прямо в коде: откройте файл настроек database.php и добавьте ключ strict со значением false . Но если вы используете не Laravel приложение (мы столкнулись с этой проблемой в CodeIgniter и в CraftCMS), у вас не будет такой возможности. Давайте разберёмся, как можно отключить строгий режим глобально на любом сервере Laravel Forge (и любом другом сервере Ubuntu).
Ваш файл настроек
На самом деле MySQL проверяет пять различных мест на наличие файлов настроек. Поэтому я бы вам рекомендовал внести изменения в несколько мест сразу. MySQL проверяет:
1. /etc/my.cnf
2. /etc/mysql/my.cnf
3. SYSCONFDIR/my.cnf
4. $MYSQL_HOME/my.cnf
5. ~/my.cnf
~/.my.cnf существует для каждого пользователя, а третий и четвертый конфиги зависят от особенностей вашей среды. Поэтому давайте разберёмся с одним из двух первых конфигов.
По умолчанию в Laravel Forge конфигурация MySQL находится в файле /etc/mysql/my.cnf , поэтому давайте разместим наши изменения там. Соединимся по SSH с сервером и, используя Vim или Pico, отредактируем этот файл.
Ваши строки
Если вы прокрутите файл немного вниз, то вы найдете раздел [mysqld] . Мы собираемся добавить новый ключ sql_mode . В MySQL 5.7 значения для этого ключа по умолчанию такие:
STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Строгий режим включается значением STRICT_TRANS_TABLES . Давайте исправим sql_mode и сделаем его таким же, как и значение по умолчанию, но только без строгого режима.
[mysqld] sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Готово! Сохраните файл и перезапустите MySQL. В командной строке это будет примерно так sh sudo /etc/init.d/mysql restart , или из интерфейса Laravel Forge, откройте сервер, щёлкните значок Restart Services в нижней части, и выберите Restart MySQL.
При использовании CraftCMS, а также некоторых версий Laravel, вам, возможно, понадобится отключить и опцию «ONLY_FULL_GROUP_BY» .
Как вы считаете, полезен ли этот материал? Да Нет
Комментарии (1)
После обновления релиза до Ubuntu 16.04
(Server version: 5.7.12-0ubuntu1.1 — (Ubuntu)
Apache/2.4.18 (Ubuntu)
PHP extension: mysqli
PHP version: 7.0.4-7ubuntu2.1 )
долго искал что же делать с мускулом
(практически ничего не работало)
Ваши советы привели к полной работоспособности
старых вебприложений с новой версией мускула
Дополню только, что вносить изменения надо только в этот файл конфигурации
/etc/mysql/mysql.conf.d/mysqld.cnf
Конкретно, убрав опции
STRICT_TRANS_TABLES
ONLY_FULL_GROUP_BY
заработали такие приложения как
piwigo, moodle, glpi, т т.п.
Спасибо за конкретное и адекватное знание.
Статистика: Символов — 2 201/1 837 без пробелов (1 731/1 459 без кода):, слов — 273
Наверх Опечатка? Выдели и нажми Ctrl+Enter (Orphus.ru)
directman
Нажимаем выполнить. Далее запросим результат отключения, в консоль пишем:
print_r ( sqlselect("SHOW VARIABLES LIKE 'sql_mode';"));
нажимаем выполнить и получаем ответ
Array ( [Variable_name] => sql_mode [Value] => IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION )
проверяем, чтобы в ответе не было значения STRICT_TRANS_TABLES.
Включение строгого режима MySQL
В панели администратора открываем консоль и пишем
SQLExec ("set global sql_mode='STRICT_TRANS_TABLES';");
Нажимаем выполнить. Далее запросим результат отключения, в консоль пишем:
print_r ( sqlselect("SHOW VARIABLES LIKE 'sql_mode';"));
нажимаем выполнить и получаем ответ
Array ( [Variable_name] => sql_mode [Value] => STRICT_TRANS_TABLES,IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION )
проверяем, чтобы в ответе присутствовало значения STRICT_TRANS_TABLES.