Как установить sql_mode в my.cnf в MySQL 8? - PullRequest
0 голосов
/ 02 января 2019

Я использую версию сообщества MySQL 8.0.11.Мне нужно установить sql_mode для исключения ONLY_FULL_GROUP_BY в my.cnf, чтобы он был безопасен при перезапуске.Я попробовал следующие варианты:

sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Все они терпят неудачу одинаково, независимо от того, называется ли переменная «sql_mode» или «sql-mode»:

mysqld --verbose --help | grep "sql[-_]mode"
2018-06-19T15:22:51.667734Z 0 [ERROR] [MY-011071] [Server] /usr/sbin/mysqld: Error while setting value 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' to 'sql_mode'
    --sql-mode=name     Syntax: sql-mode=mode[,mode[,mode...]]. See the manual
2018-06-19T15:22:51.675498Z 0 [ERROR] [MY-010119] [Server] Aborting

sql-mode

Казалось бы, mysqld обрабатывает my.cnf и преобразует 'sql_mode' или 'sql-mode' в 'sql_mode', который затем отвергает!

Вопрос в том, как обойти это?

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Предполагая, что «безопасный перезапуск» означает «постоянный», синтаксис:

sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

С Настройка режима SQL :

Чтобы установить режим SQL при запуске сервера, используйте --sql-mode = "mode" параметр в командной строке или sql-mode="modes" в файле параметров например, my.cnf (операционные системы Unix) или my.ini (Windows). modes список режимов, разделенных запятыми.

Если он не работает для вас, возможно, вы помещаете его в неправильный раздел. Для настроек сервера это должно быть [mysqld], например:

[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"
0 голосов
/ 02 января 2019

Режим SQL NO_AUTO_CREATE_USER был удален в MySQL 8.0 и больше не распознается.

https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-deprecations говорит:

Следующие функции, связанные с учетной записьюуправление удалено:

  • Использование GRANT для создания пользователей.Вместо этого используйте CREATE USER.Следуя этой практике, режим NO_AUTO_CREATE_USER SQL становится несущественным для операторов GRANT, поэтому он также удаляется.

Измените свой sql_mode на "STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DZUTION_YBY_S"),Я проверил это на своем экземпляре песочницы 8.0.11, и он работал.

Либо написание режима sql-mode, либо sql_mode подойдет.

Использование кавычек или пропуск кавычек - это нормально.

0 голосов
/ 02 января 2019

Я не нашел пути решения проблемы с помощью my.cnf. Для безопасного перезапуска mysqld мне нужно избегать:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Единственный способ обойти это - установить переменную окружения:

sudo systemctl set-environment MYSQLD_OPTS="--sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
sudo systemctl restart mysqld

Приветствуются лучшие решения.

...