sql >> Database >  >> RDS >> Mysql

DETERMINISTISCH, GEEN SQL, of LEES SQL-GEGEVENS in zijn declaratie en binaire logboekregistratie is ingeschakeld

Er zijn twee manieren om dit op te lossen:

  1. Voer het volgende uit in de MySQL-console:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Voeg het volgende toe aan het mysql.ini-configuratiebestand:

    log_bin_trust_function_creators = 1;

De instelling versoepelt de controle op niet-deterministische functies. Niet-deterministische functies zijn functies die gegevens wijzigen (d.w.z. update-, insert- of delete-statement(s) hebben). Voor meer info, zie hier .

Let op:als binaire logging NIET is ingeschakeld, is deze instelling niet van toepassing.

Binaire logboekregistratie van opgeslagen programma's

log_bin_trust_function_creators

De beste aanpak is een beter begrip en gebruik van deterministische verklaringen voor opgeslagen functies. Deze declaraties worden door MySQL gebruikt om de replicatie te optimaliseren en het is een goede zaak om ze zorgvuldig te kiezen voor een gezonde replicatie.

DETERMINISTISCH Een routine wordt als "deterministisch" beschouwd als deze altijd hetzelfde resultaat oplevert voor dezelfde invoerparameters en anders NIET DETERMINISTISCH. Dit wordt meestal gebruikt bij string- of wiskundige verwerking, maar is niet beperkt tot dat.

NIET DETERMINISTISCH Het tegenovergestelde van "DETERMINISTIC"."Als noch DETERMINISTIC noch NIET DETERMINISTIC wordt gegeven in de routinedefinitie, is de standaardwaarde NOT DETERMINISTIC. Om te verklaren dat een functie deterministisch is, moet u expliciet DETERMINISTIC specificeren. ".Dus het lijkt erop dat als er geen statement wordt gemaakt, MySQl de functie zal behandelen als "NIET DETERMINISTISCH". opgeslagen functie, moet u aangeven dat het deterministisch is of dat het geen gegevens wijzigt. Anders kan het onveilig zijn voor gegevensherstel of replicatie. Om een ​​CREATE FUNCTION-instructie te accepteren, moet standaard ten minste een van DETERMINISTIC, NO SQL of READS SQL DATA expliciet worden opgegeven. Anders treedt er een fout op "

Ik kreeg persoonlijk een fout in MySQL 5.5 als er geen declaratie is, dus ik plaats altijd ten minste één declaratie van "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" of "LEES SQL DATA", ongeacht andere declaraties die ik heb.

LEEST SQL-GEGEVENS Dit vertelt MySQL expliciet dat de functie ALLEEN gegevens uit databases zal lezen, dus het bevat geen instructies die gegevens wijzigen, maar het bevat SQL-instructies die gegevens lezen (bijv. SELECT).

WIJZIGT SQL-GEGEVENS Dit geeft aan dat de routine instructies bevat die gegevens kunnen schrijven (het bevat bijvoorbeeld UPDATE-, INSERT-, DELETE- of ALTER-instructies).

GEEN SQL Dit geeft aan dat de routine geen SQL-instructies bevat.

BEVAT SQL Dit geeft aan dat de routine SQL-instructies bevat, maar geen instructies die gegevens lezen of schrijven. Dit is de standaardinstelling als geen van deze kenmerken expliciet wordt gegeven. Voorbeelden van dergelijke uitspraken zijn SELECT NOW(), SELECT [email protected] , SET @x =1 of DO RELEASE_LOCK('abc'), die gegevens uitvoeren maar niet lezen of schrijven.

Merk op dat er MySQL-functies zijn die niet deterministisch veilig zijn, zoals:NOW(), UUID(), enz., die waarschijnlijk verschillende resultaten opleveren op verschillende machines, dus een gebruikersfunctie die dergelijke instructies bevat, moet worden gedeclareerd als NIET DETERMINISTISCH .Ook is een functie die gegevens leest van een niet-gerepliceerd schema duidelijk NIET-DETERMINISTISCH.*



  1. Audittriggers maken in SQL Server

  2. Hoe Oracle Stored Procedure in Python aan te roepen?

  3. CakePHP-query dichtstbijzijnde breedtegraad lengte uit database

  4. Hoe de Time()-functie werkt in SQLite