DETERMINISTIC, NO SQL или READS SQL DATA в своем объявлении, и включено двоичное ведение журнала


109

При импорте базы данных в mysql я получил следующую ошибку:

1418 (HY000) at line 10185: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

Я не знаю, что мне нужно изменить. Может ли кто-нибудь помочь мне решить эту проблему?

Ответы:


237

Есть два способа исправить это:

  1. Выполните в консоли MySQL следующее:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Добавьте в файл конфигурации mysql.ini следующее:

    log_bin_trust_function_creators = 1;

Этот параметр ослабляет проверку недетерминированных функций. Недетерминированные функции - это функции, которые изменяют данные (т. Е. Имеют операторы обновления, вставки или удаления). Для получения дополнительной информации см. Здесь .

Обратите внимание: если двоичное ведение журнала НЕ включено, этот параметр не применяется.

Бинарный журнал сохраненных программ

Если двоичное ведение журнала не включено, log_bin_trust_function_creators не применяется.

log_bin_trust_function_creators

Эта переменная применяется, когда включено двоичное ведение журнала.

Наилучший подход - лучшее понимание и использование детерминированных объявлений для хранимых функций. Эти объявления используются MySQL для оптимизации репликации, и рекомендуется тщательно выбирать их, чтобы репликация работала нормально.

ДЕТЕРМИНИСТИЧЕСКИЙ Подпрограмма считается «детерминированной», если она всегда дает один и тот же результат для одних и тех же входных параметров, и НЕ ДЕТЕРМИНИСТИЧНАЯ в противном случае. Это в основном используется со строкой или математической обработкой, но не ограничивается этим.

НЕ ДЕТЕРМИНИСТИЧЕСКИЙ В отличие от «ДЕТЕРМИНИСТИЧЕСКИЙ». « Если в определении подпрограммы не указано ни DETERMINISTIC, ни NOT DETERMINISTIC, по умолчанию используется значение NOT DETERMINISTIC. Чтобы объявить функцию детерминированной, вы должны явно указать DETERMINISTIC. ». Таким образом, похоже, что если не будет сделано никаких операторов, MySQl будет рассматривать функцию как «НЕ ДЕТЕРМИНИСТИЧЕСКУЮ». Это утверждение из руководства противоречит другому утверждению из другого раздела руководства, в котором говорится, что: "Когда вы создаете сохраненную функцию, вы должны объявить, что она детерминирована или не изменяет данные. В противном случае это может быть небезопасно для восстановления или репликации данных. По умолчанию, чтобы оператор CREATE FUNCTION был принят, необходимо явно указать хотя бы одно из DETERMINISTIC, NO SQL или READS SQL DATA. В противном случае возникает ошибка "

Я лично получал ошибку в MySQL 5.5, если не было объявления, поэтому я всегда помещаю по крайней мере одно объявление "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" или "READS SQL DATA" независимо от других объявлений, которые у меня могут быть.

ЧТЕНИЕ ДАННЫХ SQL Это явно сообщает MySQL, что функция будет ТОЛЬКО считывать данные из баз данных, таким образом, она не содержит инструкций, которые изменяют данные, но она содержит инструкции SQL, которые читают данные (например, SELECT).

МОДИФИЦИРУЕТ ДАННЫЕ SQL. Это указывает на то, что процедура содержит операторы, которые могут записывать данные (например, она содержит инструкции UPDATE, INSERT, DELETE или ALTER).

NO SQL Это означает, что подпрограмма не содержит операторов SQL.

CONTAINS SQL Это указывает на то, что процедура содержит инструкции SQL, но не содержит операторов, которые читают или записывают данные. Это значение по умолчанию, если ни одна из этих характеристик не указана явно. Примеры таких операторов: SELECT NOW (), SELECT 10 + @ b, SET @x = 1 или DO RELEASE_LOCK ('abc'), которые выполняются, но не читают и не записывают данные.

Обратите внимание, что есть функции MySQL, которые не являются детерминированно безопасными, например: NOW (), UUID () и т. Д., Которые могут давать разные результаты на разных машинах, поэтому пользовательская функция, содержащая такие инструкции, должна быть объявлена ​​как НЕ ДЕТЕРМИНИСТИЧНАЯ. . Кроме того, функция, считывающая данные из нереплицированной схемы, явно НЕ ДЕТЕРМИНИСТИЧНА. *

Оценка природы подпрограммы основана на «честности» создателя: MySQL не проверяет, что подпрограмма, объявленная DETERMINISTIC, не содержит операторов, дающих недетерминированные результаты. Однако неправильное объявление процедуры может повлиять на результаты или повлиять на производительность. Объявление недетерминированной процедуры как DETERMINISTIC может привести к неожиданным результатам, заставив оптимизатор сделать неправильный выбор плана выполнения. Объявление детерминированной подпрограммы как NONDETERMINISTIC может снизить производительность, поскольку доступные оптимизации не будут использоваться.


Вы можете объяснить мне, что произошло в фоновом режиме?
ASR

2
Я подозреваю, что в базе данных есть функция, которая изменяет данные (в ней есть операторы обновления, вставки или удаления). Для получения дополнительной информации см. Здесь: dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
Донал,

1
Вы всегда должны делать резервные копии,
Донал

для этого нужны супер привилегии!
Фелипе Моралес

пробовал это, но все еще получил недетерминированную проблему, есть ли другие предложения? спасибо
Эдвин Бермеджо

40
  • Когда вы создаете сохраненную функцию, вы должны объявить, что она детерминирована или не изменяет данные. В противном случае это может быть небезопасно для восстановления или репликации данных.

  • По умолчанию, чтобы оператор CREATE FUNCTION был принят, необходимо явно указать хотя бы одно из DETERMINISTIC, NO SQL или READS SQL DATA. В противном случае возникает ошибка:

Чтобы исправить эту проблему, добавьте следующие строки после возврата и перед началом работы:

READS SQL DATA
DETERMINISTIC

Например :

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN

Подробнее об этой проблеме читайте здесь.


Это работает, потому что параметр READS SQL DATAявляется наименее ограничивающим из трех. Если ваша функция попадает в категорию NO SQLили DETERMINISTIC, вы можете повысить производительность, изменив свои функции. С другой стороны, настройка READS SQL DATAтакже наименее подвержена ошибкам. Так что если вы неправильно использовать NO SQLили DETERMINISTICвы можете получить неправильные результаты.
Джонатан

@ SunnyS.M, Замечательное объяснение, как, например, ЧТЕНИЕ ДАННЫХ SQL ДЕТЕРМИНИСТИЧЕСКИ. Чтобы исправить эту проблему, добавьте следующие строки После возврата и Перед началом работы:
Md Haidar Ali Khan

4

после комментария Дональда:

Эта переменная применяется, когда включено двоичное ведение журнала.

Все, что мне нужно было сделать, это:

  1. отключен log_bin в my.cnf (#log_bin)
  2. перезапустить mysql
  3. импортная БД
  4. включить log_bin
  5. перезапустить mysql

Это решит проблему импорта.

(Затем я просмотрю код программиста, чтобы предложить улучшение)


3

Когда ваша функция детерминирована, вы можете с уверенностью объявить ее детерминированной. Местоположение ключевого слова "DETERMINISTIC" следующее.

введите описание изображения здесь


2

В Windows 10

Я решил эту проблему, выполнив следующие действия.

  1. Перейдите в my.ini и добавьте эти 2 строки в [mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
  2. перезапустить службу MySQL


после этого я получил ошибку на ведомом устройстве - Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Рамратан Гупта

0

Попробуйте установить определитель для функции!

Так что вместо

CREATE FUNCTION get_pet_owner

ты напишешь что-нибудь вроде

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

который должен работать, если пользователь prodacmin имеет права на создание функций / процедур.

В моем случае функция работала при создании в MySQL Workbench, но не работала при запуске непосредственно как сценарий SQL. Внесение вышеуказанных изменений устранило проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.