Il existe deux façons de résoudre ce problème:
Exécutez ce qui suit dans la console MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Ajoutez ce qui suit au fichier de configuration mysql.ini:
log_bin_trust_function_creators = 1;
Le paramètre assouplit la vérification des fonctions non déterministes. Les fonctions non déterministes sont des fonctions qui modifient les données (c'est-à-dire qui ont des instructions de mise à jour, d'insertion ou de suppression). Pour plus d'informations, voir ici .
Veuillez noter que si la journalisation binaire n'est PAS activée, 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 ne 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 une meilleure 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.
DETERMINISTIC
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 DETERMINISTIC dans le cas contraire. Ceci est principalement utilisé avec le traitement de chaînes ou mathématiques, mais sans s'y limiter.
NON DÉTERMINISTE À l'
opposé de "DETERMINISTIQUE". " Si ni DETERMINISTIC ni NOT DETERMINISTIC n'est indiqué dans la définition de routine, la valeur par défaut est NOT DETERMINISTIC. Pour déclarer qu'une fonction est déterministe, vous devez spécifier DETERMINISTIC explicitement. ". 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 dit que: "Lorsque vous créez une fonction stockée, vous devez déclarer qu'elle est déterministe ou qu'elle ne modifie pas les données. Sinon, cela 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 une des données DETERMINISTIC, NO SQL ou READS SQL DATA doit être spécifiée explicitement. Sinon, une erreur se produit "
J'ai personnellement 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 "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" ou "READS SQL DATA" quelles que soient les autres déclarations que je peux avoir.
LISE LES DONNÉES SQL
Ceci indique explicitement à MySQL que la fonction lira UNIQUEMENT les données des bases de données, ainsi, elle ne contient pas d'instructions qui modifient les données, mais elle contient des instructions SQL qui lisent les données (eq SELECT).
MODIFIES SQL DATA
Ceci indique que la routine contient des instructions qui peuvent écrire des données (par exemple, elle contient des instructions UPDATE, INSERT, DELETE ou ALTER).
NO SQL
Ceci indique que la routine ne contient aucune instruction SQL.
CONTAINS 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 n'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 sûres déterministes, telles que: NOW (), UUID (), etc., qui sont susceptibles de produire des résultats différents sur différentes machines, donc une fonction utilisateur contenant 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 répliqué est clairement NONDETERMINISTIQUE. *
L'évaluation de la nature d'une routine est basée sur «l'honnêteté» du créateur: MySQL ne vérifie pas qu'une routine déclarée DETERMINISTIC est exempte d'énoncés qui produisent des résultats non déterministes. Cependant, une mauvaise déclaration d'une routine peut affecter les résultats ou les performances. La déclaration d'une routine non déterministe comme DETERMINISTIC peut conduire à des résultats inattendus en obligeant l'optimiseur à faire des choix de plan d'exécution incorrects. La déclaration d'une routine déterministe comme NONDETERMINISTIC peut diminuer les performances en empêchant l'utilisation des optimisations disponibles.
Lorsque vous créez une fonction stockée, vous devez déclarer qu'elle est déterministe ou qu'elle ne modifie pas les données. Sinon, cela 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 une des données DETERMINISTIC, NO SQL ou READS SQL DATA doit être spécifiée explicitement. Sinon, une erreur se produit:
Pour résoudre ce problème, ajoutez les lignes suivantes après retour et avant de commencer:
Par exemple :
Pour plus de détails sur ce problème, veuillez lire ici
la source
READS SQL DATA
est le moins restrictif des trois. Si votre fonction appartient à la catégorieNO SQL
ouDETERMINISTIC
, vous pouvez améliorer les performances en modifiant vos fonctions. D'autre part, le paramètreREADS SQL DATA
est également le moins sujet aux erreurs. Donc, si vous utilisez incorrectementNO SQL
ouDETERMINISTIC
vous pouvez obtenir des résultats incorrects.suite au commentaire de Donald:
Tout ce que j'avais à faire était:
Cela évite ce problème d'importation.
(Ensuite, je vais revoir le code du programmeur pour suggérer une amélioration)
la source
Lorsque votre fonction est déterministe, vous pouvez la déclarer en toute sécurité comme déterministe. L'emplacement du mot clé "DETERMINISTIC" est le suivant.
la source
Sous Windows 10,
Je viens de résoudre ce problème en procédant comme suit.
Accédez à my.ini et ajoutez ces 2 lignes sous [mysqld]
redémarrer le service MySQL
la source
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Essayez de définir le définisseur de la fonction!
Donc au lieu de
CREATE FUNCTION get_pet_owner
vous écrirez quelque chose comme
CREATE DEFINER=
procadmin
@%
FUNCTION get_pet_ownerqui devrait fonctionner si l'utilisateur prodacmin a le droit de créer des fonctions / procédures.
Dans mon cas, la fonction fonctionnait lorsqu'elle était générée via MySQL Workbench mais ne fonctionnait pas lorsqu'elle était exécutée directement en tant que script SQL. Les modifications ci-dessus ont résolu le problème.
la source