sql >> Databáze >  >> RDS >> Mysql

DETERMINISTIC, NO SQL nebo REDS SQL DATA ve své deklaraci a binární protokolování je povoleno

Existují dva způsoby, jak to opravit:

  1. V konzole MySQL proveďte následující:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Do konfiguračního souboru mysql.ini přidejte následující:

    log_bin_trust_function_creators = 1;

Nastavení uvolní kontrolu nedeterministických funkcí. Nedeterministické funkce jsou funkce, které modifikují data (tj. mají aktualizovat, vložit nebo odstranit příkaz(y)). Další informace naleznete zde .

Upozorňujeme, že pokud NENÍ povoleno binární protokolování, toto nastavení se nepoužije.

Binární protokolování uložených programů

log_bin_trust_function_creators

Nejlepším přístupem je lepší pochopení a použití deterministických deklarací pro uložené funkce. Tyto deklarace používá MySQL k optimalizaci replikace a je dobré je pečlivě vybírat, aby replikace byla v pořádku.

DETERMINISTICKÉ Rutina je považována za „deterministickou“, pokud vždy produkuje stejný výsledek pro stejné vstupní parametry, a v opačném případě NENÍ DETERMINISTICKÁ. Většinou se používá při zpracování řetězců nebo matematiky, ale není omezeno na to.

NENÍ DETERMINISTICKÉ Opakem "DETERMINISTICKÉ"."Pokud v definici rutiny není uvedeno ani DETERMINISTIC, ani NOT DETERMINISTIC, výchozí hodnota NENÍ DETERMINISTICKÁ. Chcete-li prohlásit, že funkce je deterministická, musíte explicitně zadat DETERMINISTICKOU. ".Zdá se tedy, že pokud nebude učiněno žádné prohlášení, MySQl bude s funkcí nakládat jako s "NOT DETERMINISTICKY". Toto prohlášení z manuálu je v rozporu s jiným prohlášením z jiné oblasti manuálu, které říká, že:" Když vytvoříte uloženou funkci, musíte buď deklarovat, že je deterministická, nebo že nemění data. V opačném případě to může být nebezpečné pro obnovu nebo replikaci dat. Aby byl příkaz CREATE FUNCTION přijat, musí být ve výchozím nastavení explicitně zadána alespoň jedna z následujících hodnot:DETERMINISTIC, NO SQL nebo REDS SQL DATA. Jinak dojde k chybě "

."

Osobně jsem dostal chybu v MySQL 5.5, pokud neexistuje žádná deklarace, takže jsem vždy vložil alespoň jednu deklaraci "DETERMINISTICKY", "NOT DETERMINISTICKY", "NO SQL" nebo "READS SQL DATA" bez ohledu na ostatní deklarace, které mohu mít.

ČTE DATA SQL To výslovně říká MySQL, že funkce bude POUZE číst data z databází, takže neobsahuje instrukce, které upravují data, ale obsahuje instrukce SQL, které čtou data (např. SELECT).

ZMĚNÍ DATA SQL To znamená, že rutina obsahuje příkazy, které mohou zapisovat data (například obsahují instrukce UPDATE, INSERT, DELETE nebo ALTER).

ŽÁDNÉ SQL To znamená, že rutina neobsahuje žádné příkazy SQL.

OBSAHUJE SQL To znamená, že rutina obsahuje instrukce SQL, ale neobsahuje příkazy, které čtou nebo zapisují data. Toto je výchozí hodnota, pokud žádná z těchto charakteristik není výslovně uvedena. Příklady takových příkazů jsou SELECT NOW(), SELECT [email protected] , SET @x =1 nebo DO RELEASE_LOCK('abc'), které provádějí, ale nečtou ani nezapisují data.

Všimněte si, že existují funkce MySQL, které nejsou deterministicky bezpečné, jako například:NOW(), UUID() atd., které pravděpodobně poskytnou různé výsledky na různých počítačích, takže uživatelská funkce obsahující takové instrukce musí být deklarována jako NEDETERMINISTICKÁ. .Také funkce, která čte data z nereplikovaného schématu, je jasně NEDETERMINISTICKÁ.*



  1. SQL SELECT rychlost int vs varchar

  2. Připojte se k MariaDB z aplikace Java v NetBeans na Linuxu (Mageia)

  3. LPAD v SQL Server 2008

  4. T-SQL:kontrola formátu e-mailu