Детерминированный, нет SQL, или читает данные SQL в его объявлении и двоичное ведение журнала включено


при импорте базы данных в 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)

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

5 58

5 ответов:

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

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

    SET GLOBAL log_bin_trust_function_creators = 1;

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

    log_bin_trust_function_creators = 1;

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

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

двоичное ведение журнала сохраненных программ

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

log_bin_trust_function_creators

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

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

детерминированный Процедура считается "детерминированной", если она всегда дает один и тот же результат для одних и тех же входных параметров и не детерминирована в противном случае. Это в основном используется со Строковой или математической обработкой, но не ограничено к этому.

НЕ ДЕТЕРМИНИРОВАННЫЙ Противоположность "детерминизма". "если в рутинном определении не задано ни детерминированное, ни НЕДЕТЕРМИНИРОВАННОЕ, значение по умолчанию не является детерминированным. Чтобы объявить функцию детерминированной, необходимо явно указать детерминированную функцию.". Таким образом, кажется, что если оператор не сделан, MySQl будет рассматривать функцию как "не детерминированную". Это утверждение из руководства находится в противоречии с другим утверждением из другого область руководства, которая говорит, что: "при создании сохраненной функции необходимо объявить, что она является детерминированной или не изменяет данные. В противном случае это может быть небезопасно для восстановления или репликации данных. По умолчанию для того, чтобы оператор CREATE FUNCTION был принят, по крайней мере один из детерминированных, не SQL или считывает данные SQL должен быть указан явно. В противном случае возникает ошибка"

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

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

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

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

СОДЕРЖИТ SQL Это указывает на то, что подпрограмма содержит инструкции SQL, но не содержит инструкций для чтения или записи данных. Это значение по умолчанию, если ни одна из этих характеристик не задана явно. Примеры таких операторов: SELECT NOW (), SELECT 10 + @b, SET @x = 1 или Do RELEASE_LOCK ('abc'), которые выполняют, но не читают и не записывают данные.

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

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

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

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

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

READS SQL DATA
DETERMINISTIC

Например :

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

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

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

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

все, что мне нужно было:

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

Это шаг из этой проблемы импорта.

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

В Windows 10,

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

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

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

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

enter image description here