Есть два способа исправить это:
Выполните в консоли MySQL следующее:
SET GLOBAL log_bin_trust_function_creators = 1;
Добавьте в файл конфигурации 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 может снизить производительность, поскольку доступные оптимизации не будут использоваться.
Когда вы создаете сохраненную функцию, вы должны объявить, что она детерминирована или не изменяет данные. В противном случае это может быть небезопасно для восстановления или репликации данных.
По умолчанию, чтобы оператор CREATE FUNCTION был принят, необходимо явно указать хотя бы одно из DETERMINISTIC, NO SQL или READS SQL DATA. В противном случае возникает ошибка:
Чтобы исправить эту проблему, добавьте следующие строки после возврата и перед началом работы:
Например :
Подробнее об этой проблеме читайте здесь.
источник
READS SQL DATA
является наименее ограничивающим из трех. Если ваша функция попадает в категориюNO SQL
илиDETERMINISTIC
, вы можете повысить производительность, изменив свои функции. С другой стороны, настройкаREADS SQL DATA
также наименее подвержена ошибкам. Так что если вы неправильно использоватьNO SQL
илиDETERMINISTIC
вы можете получить неправильные результаты.после комментария Дональда:
Все, что мне нужно было сделать, это:
Это решит проблему импорта.
(Затем я просмотрю код программиста, чтобы предложить улучшение)
источник
Когда ваша функция детерминирована, вы можете с уверенностью объявить ее детерминированной. Местоположение ключевого слова "DETERMINISTIC" следующее.
источник
В Windows 10
Я решил эту проблему, выполнив следующие действия.
Перейдите в my.ini и добавьте эти 2 строки в [mysqld]
перезапустить службу MySQL
источник
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Попробуйте установить определитель для функции!
Так что вместо
CREATE FUNCTION get_pet_owner
ты напишешь что-нибудь вроде
CREATE DEFINER=
procadmin
@%
FUNCTION get_pet_ownerкоторый должен работать, если пользователь prodacmin имеет права на создание функций / процедур.
В моем случае функция работала при создании в MySQL Workbench, но не работала при запуске непосредственно как сценарий SQL. Внесение вышеуказанных изменений устранило проблему.
источник