Déterministe, pas de SQL ou lit les données SQL dans sa déclaration et la journalisation binaire est activée

Lors de l'importation de la base de données dans mysql, j'ai l'erreur suivante:

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)

Je ne sais pas quelles choses je dois changer. Quelqu'un peut-il m'aider comment faire pour résoudre ce problème?

58
demandé sur Donal 2014-09-24 14:57:43

5 réponses

Il y a deux façons de résoudre ce problème:

  1. Exécutez ce qui suit dans la console MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Ajoutez ce qui suit au mysql.fichier de configuration ini:

    log_bin_trust_function_creators = 1;

Le paramètre détend la vérification des fonctions non déterministes. Les fonctions non déterministes sont des fonctions qui modifient des données(c'est-à-dire qui ont des instructions update, insert ou delete). Pour plus d'informations, voir ici.

Veuillez noter, si la journalisation binaire n'est PAS activé, ce paramètre ne s'applique pas.

Journalisation binaire des programmes stockés

Si la journalisation binaire n'est pas activée, log_bin_trust_function_creators s'applique pas.

Log_bin_trust_function_creators

Cette variable s'applique lorsque la journalisation binaire est activée.

La meilleure approche est une meilleure compréhension et utilisation des déclarations déterministes pour les fonctions stockées. Ces déclarations sont utilisées par MySQL pour optimiser la réplication et c'est une bonne chose de les choisir avec soin pour avoir une réplication saine.

Déterministe Une routine est considérée comme "déterministe" si elle produit toujours le même résultat pour les mêmes paramètres d'entrée et non déterministe sinon. Ceci est principalement utilisé avec le traitement de chaîne ou de mathématiques, mais sans s'y limiter.

NON DÉTERMINISTE Opposé de "déterministe". "si ni déterministe ni non déterministe n'est donnée dans la définition de routine, la valeur par défaut N'est pas déterministe. Pour déclarer qu'une fonction est déterministe, vous devez spécifier explicitement déterministe.". Il semble donc que si aucune déclaration n'est faite, MySQl traitera la fonction comme "non déterministe". Cette déclaration du manuel est en contradiction avec une autre déclaration d'un autre domaine du manuel qui indique que: "Lorsque vous créez une fonction stockée, vous devez déclarer qu'il est déterministe ou qu'il ne modifie pas les données. Sinon, il peut être dangereux pour la récupération ou la réplication des données. Par défaut, pour qu'une instruction CREATE FUNCTION soit acceptée, au moins une des données déterministes, no SQL ou READS SQL doit être spécifiée explicitement. Sinon, une erreur se produit"

Personnellement, J'ai eu une erreur dans MySQL 5.5 s'il n'y a pas de déclaration, donc je mets toujours au moins une déclaration de "déterministe", "non déterministe", "pas de SQL" ou "lit les données SQL" indépendamment des autres déclarations que je peux avoir.

LIT SQL Données Cela indique explicitement à MySQL que la fonction ne lira que les données des bases de données, donc, elle ne contient pas d'instructions qui modifient les données, mais elle contient des instructions SQL qui lisent les données (par exemple, SELECT).

MODIFIER LES DONNÉES SQL Cela indique que la routine contient des instructions qui peuvent écrire des données (par exemple, elle contient des instructions UPDATE, INSERT, DELETE ou ALTER).

PAS DE SQL Cela indique que la routine ne contient pas de SQL déclaration.

CONTIENT SQL Cela indique que la routine contient des instructions SQL, mais ne contient pas d'instructions qui lisent ou écrivent des données. C'est la valeur par défaut si aucune de ces caractéristiques est donnée explicitement. Des exemples de telles instructions sont SELECT NOW (), SELECT 10+@b, SET @x = 1 ou DO RELEASE_LOCK('abc'), qui exécutent mais ne lisent ni n'écrivent des données.

Notez qu'il existe des fonctions MySQL qui ne sont pas déterministes, telles que: NOW (), UUID (), etc, qui sont susceptibles de produire des résultats différents sur différentes machines, de sorte qu'une fonction utilisateur qui contient de telles instructions doit être déclarée comme non déterministe. En outre, une fonction qui lit des données à partir d'un schéma non compliqué est clairement non déterministe. *

Évaluation de la nature d'une routine est basé sur "l'honnêteté" de l' creator: MySQL ne vérifie pas qu'une routine déclarée déterministe est sans déclarations qui produisent des résultats non déterministes. Cependant, misdeclaring une routine pourraient affecter les résultats ou affecter les performances. Déclarer une routine non déterministe comme déterministe pourrait conduire à résultats inattendus en provoquant l'optimiseur à faire incorrect plan d'exécution de choix. Déclarer une routine déterministe comme Non déterministe pourrait diminuer les performances en provoquant disponible optimisations à ne pas utiliser.

110
répondu Donal 2017-11-27 13:42:27
  • Lorsque vous créez une fonction stockée, vous devez déclarer que c'est déterministe ou qu'il ne modifie pas les données. Sinon, il peut être dangereux pour la récupération ou la réplication de données.

  • Par défaut, pour qu'une instruction CREATE FUNCTION soit acceptée, au moins L'une des données déterministes, no SQL ou READS SQL doit être spécifiée explicitement. Sinon, une erreur se produit:

Pour résoudre ce problème, ajoutez les lignes suivantes après le retour et avant le début déclaration:

READS SQL DATA
DETERMINISTIC

Par Exemple:

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

Pour plus de détails concernant ce problème, veuillez lire Ici

24
répondu Sunny S.M 2015-07-02 12:53:36

Suivant le commentaire de Donald:

Cette variable s'applique lorsque la journalisation binaire est activée.

Tout ce que j'avais à faire était:

  1. log_bin désactivé dans mon.cnf (#log_bin)
  2. redémarrez mysql
  3. importer DB
  4. activer log_bin
  5. redémarrez mysql

Qui sort de ce problème d'importation.

(ensuite, je vais passer en revue le code du programmeur pour suggérer une amélioration)

3
répondu Mayra Navarro 2017-06-21 21:00:37

Sous Windows 10,

Je viens de résoudre ce problème en faisant ce qui suit.

  1. Goto mon.ini et ajoutez ces 2 lignes sous [mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
    
  2. Redémarrez le service MySQL

0
répondu Preetham 2018-04-25 23:49:46

Lorsque votre fonction est déterministe, vous pouvez la déclarer déterministe en toute sécurité. L'emplacement du mot clé" déterministe " est le suivant.

entrez la description de l'image ici

0
répondu Park JongBum 2018-10-11 05:33:01