DETERMINISTIC, NO SQL або READS SQL DATA в його декларації та бінарному журналі ввімкнено


107

Під час імпорту бази даних у 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)

Я не знаю, які речі мені потрібно змінити. Чи може хтось допомогти мені, як вирішити це?

Відповіді:


236

Є два способи виправити це:

  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 в рутинному визначенні не задано, за замовчуванням НЕ ДЕТЕРМІНІСТИЧНІ . Отже, схоже, що якщо не буде зроблено жодного твердження, MySQl розцінить цю функцію як "НЕ ДЕТЕРМІНІСТИЧНУ". Це твердження з посібника суперечить іншому твердженню з іншої області посібника, в якому сказано, що: "Створюючи збережену функцію, ви повинні заявити, що вона детермінована, або що вона не змінює дані. В іншому випадку це може бути небезпечно для відновлення чи реплікації даних. За замовчуванням для прийняття оператора CREATE FUNCTION принаймні один з DETERMINISTIC, NO SQL або READS SQL DATA повинен бути чітко вказаний. Інакше виникає помилка "

Я особисто отримав помилку в MySQL 5.5, якщо декларації немає, тому я завжди ставив принаймні одну декларацію "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" або "READS SQL DATA" незалежно від інших декларацій, які у мене можуть бути.

ЧИТАТИ SQL DATA Це явно повідомляє MySQL, що функція буде ЛИШЕ читати дані з баз даних, таким чином, вона не містить інструкцій, що змінюють дані, але містить інструкції SQL, які читають дані (eq SELECT).

МОДИФІКАЦІЙНІ ДАНІ SQL Це вказує на те, що підпрограма містить оператори, які можуть записувати дані (наприклад, вона містить інструкції UPDATE, INSERT, DELETE або ALTER).

NO SQL Це вказує, що підпрограма не містить операторів SQL.

ЗМІСТ SQL Це вказує на те, що порядок містить інструкції SQL, але не містить операторів, які читають або записують дані. Це за замовчуванням, якщо жодна з цих характеристик не задана явно. Прикладами таких тверджень є SELECT NOW (), SELECT 10 + @ b, SET @x = 1 або DO RELEASE_LOCK ('abc'), які виконують, але не читають і не записують дані.

Зауважте, що існують функції MySQL, які не є детермінованими безпечними, такі як: NOW (), UUID () тощо, які, ймовірно, дають різні результати на різних машинах, тому функцію користувача, яка містить такі інструкції, слід оголосити як NOT DETERMINISTIC . Крім того, функція, яка зчитує дані з невпливованої схеми, явно НЕДЕТЕРМІНІСТИЧНА. *

Оцінка характеру рутини базується на "чесності" творця: MySQL не перевіряє, чи є рутина, оголошена DETERMINISTIC, без тверджень, що дають недетерміновані результати. Однак неправильне декларування рутини може вплинути на результати або вплинути на продуктивність. Оголошення недетермінованої програми як DETERMINISTIC може призвести до несподіваних результатів, викликаючи оптимізатор зробити неправильний вибір плану виконання. Оголошення детермінованої програми як NONDETERMINISTIC може зменшити продуктивність, викликаючи недоступні оптимізації.


Ви можете мені пояснити, що сталося на задньому плані?
ASR

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

1
Ви завжди повинні робити резервні копії
Donal

їй потрібні супер привілеї!
Феліпе Моралес

спробував це, але все-таки отримав недетерміновану проблему, будь-яку іншу пропозицію? дякую
Едвін Бермеджо

40
  • Створюючи збережену функцію, ви повинні заявити, що вона детермінована, або що вона не змінює дані. В іншому випадку це може бути небезпечно для відновлення чи реплікації даних.

  • За замовчуванням для прийняття оператора CREATE FUNCTION принаймні один з DETERMINISTIC, NO SQL або READS SQL DATA повинен бути чітко вказаний. В іншому випадку виникає помилка:

Щоб виправити цю проблему, додайте наступні рядки після оператора Return і перед початком:

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, дивовижне пояснення на зразок READS SQL DATA DETERMINISTIC. Щоб виправити цю проблему, додайте наступні рядки після повернення та перед початком заяви:
Md Haidar Ali Khan

4

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

Ця змінна застосовується, коли ввімкнено двійковий журнал.

Все, що я повинен був зробити:

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

Це вирішує проблему імпорту.

(Тоді я перегляну код програміста, щоб запропонувати покращення)


3

Коли ваша функція детермінована, ви можете сміливо оголосити її детермінованою. Розташування ключового слова "ДЕТЕРМІНІСТИЧНИЙ" таке.

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


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.