web-dev-qa-db-fra.com

Pourquoi / Quand la création d'un déclencheur MySQL nécessite-t-elle des super privilèges?

J'essaie d'analyser et de comprendre ce que le MySQL Doc affirme sur le point lorsque les super privilèges sont nécessaires pour créer des déclencheurs. Ils disent:

Si la journalisation binaire est activée, la création de la gâchette peut nécessiter le Super Privilege [1]

Ce type d'implication qu'il existe des circonstances dans lesquelles il ne nécessite pas le super privilège. Se réfèrent-ils au log_bin_trust_function_creators = 1 réglage ou y a-t-il autre chose?

Deuxièmement, dans [2], ils disent:

... de confiance pour ne pas créer de fonctions stockées qui provoqueront des événements dangereux à écrire sur le journal binaire.

Quel est exactement le danger ici? Quels types d'événements pourraient être "dangereux" dans le journal binaire et à qui?

[1] https://dev.mysql.com/doc/refman/5.7/fr/create-trigger.html

[2] https://dev.mysql.com/doc/refman/5.0/fr/server-system-variables.html#ssysvar_log_bin_trust_function_creators

5
Johannes Ernst

En ce qui concerne SUPER et DÉCLENCHEUR Privilèges, vous avez besoin du privilège de déclenchement pour créer des déclencheurs sur des tables que vous avez des droits pour.

Si vous jouez aux binlogs, il est possible de voir des commandes de créer des déclencheurs sur des tables que vous n'avez pas de droits pour. Ceci est implicite de la documentation MySQL :

Créer un déclencheur nécessite le privilège de déclenchement du tableau associé à la gâchette. La déclaration peut également nécessiter le Super Privilege Selon la valeur définitive, comme décrit plus loin dans cette section. Si la journalisation binaire est activée, Créer un déclencheur peut nécessiter le Super Privilege, comme décrit à la section 19.7, "Lancement binaire de programmes stockés".

En ce qui concerne votre deuxième point

travaillé pour ne pas créer de fonctions stockées qui provoqueront des événements dangereux à écrire sur le journal binaire.

Il y a des occasions lorsque certains choix d'un maître peuvent générer des résultats différents sur un esclave. Par exemple, disons que vous avez couru cette requête sur un maître

SELECT * FROM tbl WHERE name='...' LIMIT 10;

Comment un esclave pourrait-il produire des résultats différents?

Si vous avez plusieurs centaines de commandes d'inserts surviennent sur un maître, ils sont sérialisés dans les bûches binaires. Même si une connexion DB 1 complète un insert avant DB Connection 2, il est possible pour DB Connection 2 d'écrire son événement dans les journaux binaires de la maîtrise avant la connexion DB 1. Ceci est particulièrement vrai dans une intensité d'écriture, lourde OLAP Environnement. Cela ferait une copie d'une esclave de tbl physiquement désynchronisé avec son maître. Les requêtes en cours d'exécution peuvent cacher cela.

Ok, vous pensez probablement que c'est juste un choix.

Sélectionne ne sont pas dans des journaux binaires. Les insertions, les suppressions et les mises à jour sont.

Saviez-vous que vous pourriez faire une question comme celle-ci?

DELETE FROM tbl LIMIT 10;

Réplique que cela peut vraiment faire tbl hors de synchronisation.

Les fonctions stockées peuvent également avoir ce mal de mal à la tête si le code de ce numéro n'est pas DETERMINISTIC. C'est pourquoi log_bin_trust_function_creators a été inventé. Cela atténue MySQLD de la responsabilité de déterminer si des opérations de données sont synchronisées en termes de réplication. Oui, ils se sont foulés autour de problèmes de réplication en aval.

3
RolandoMySQLDBA