Mysql
 sql >> Base de données >  >> RDS >> Mysql

DETERMINISTIC, NO SQL ou READS SQL DATA dans sa déclaration et la journalisation binaire est activée

Il existe 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 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

log_bin_trust_function_creators

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 il est bon 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 DETERMINISTE dans le cas contraire. Ceci est principalement utilisé avec le traitement de chaînes ou de mathématiques, mais pas limité à cela.

NON DÉTERMINISTE Opposé de "DETERMINISTIC".Si ni DETERMINISTIC ni NOT DETERMINISTIC n'est donné dans la définition de la 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 indique que :" Lorsque vous créez un fonction stockée, vous devez déclarer soit qu'elle est déterministe, soit qu'elle 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 l'une de DETERMINISTIC, NO SQL ou READS SQL DATA doit être spécifiée explicitement. Sinon, une erreur se produit "

J'ai personnellement 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 "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" ou "READS SQL DATA" quelles que soient les autres déclarations que je puisse avoir.

LIT LES DONNÉES SQL Cela indique explicitement à MySQL que la fonction lira UNIQUEMENT 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 (e.q. SELECT).

MODIFIE 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).

AUCUN SQL Cela indique que la routine ne contient aucune instruction SQL.

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 n'est donnée explicitement. Des exemples de telles instructions sont SELECT NOW(), SELECT [email protected] , SET @x =1 ou DO RELEASE_LOCK('abc'), qui s'exécutent mais ne lisent ni n'écrivent de 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 qui contient de telles instructions doit être déclarée comme NOT DETERMINISTIC .En outre, une fonction qui lit les données d'un schéma non répliqué est clairement NONDETERMINISTE.*