web-dev-qa-db-fra.com

Quelle est la manière la plus sûre de changer le format binlog lors de l'exécution?

En raison de l'avertissement suivant dans mysqld.log:

[Avertissement] Instruction non sécurisée écrite dans le journal binaire en utilisant le format d'instruction depuis BINLOG_FORMAT = STATEMENT. L'instruction n'est pas sûre car elle utilise une clause LIMIT. Cela n'est pas sûr car l'ensemble des lignes incluses ne peut pas être prévu.

Je souhaite basculer le format de réplication sur MIXED.

Mais selon le document MySQL:

La commutation du format de réplication au moment de l'exécution n'est pas recommandée lorsqu'il existe des tables temporaires, car les tables temporaires sont enregistrées uniquement lors de l'utilisation de la réplication basée sur des instructions, alors qu'avec la réplication basée sur des lignes, elles ne sont pas enregistrées.

Donc, la question est de savoir comment puis-je identifier s'il existe des tables temporaires pour changer le format du journal binaire en toute sécurité?

25
quanta

Puisqu'un binlog aura un format spécifique au moment où vous le ferez, vous pouvez décider de ne pas jouer avec les deux formats ensemble bien que MySQL (eh Oracle [ne peut toujours pas sortir de ma langue]) a construit cette fonctionnalité.

Pour jouer en toute sécurité sans redémarrage de mysql, essayez ce qui suit:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Cela laissera le dernier binlog au format "MIXTE". L'avant-dernier (avant-dernier) binlog existe simplement pour fermer le dernier binlog qui était dans le format précédent.

Toutes les sessions existantes avant la première FLUSH LOGS; commencera à écrire dans le dernier binlog une fois UNLOCK TABLES; est exécuté.

Essaie !!!

CAVEAT

Donner du crédit là où le crédit est dû, ma réponse est vraiment superposition de @ la réponse de Jonathan . Je ferme et j'ouvre les binlogs en plus. Il obtient un +1 pour avoir mis cela en évidence en premier.

MISE À JOUR 2011-10-12 13:58 EDT

Si vous faites cela à un maître actif et qu'il y a un ou plusieurs esclaves qui se répliquent à partir de ce maître, vous devez également vous soucier du fait que les journaux de relais sont au nouveau format. Voici ce que vous pouvez faire:

Sur l'esclave, exécutez STOP SLAVE;

Sur le Master, exécutez ceux-ci:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Sur l'esclave, exécutez START SLAVE;

Fonctionnement STOP SLAVE; et START SLAVE; fait tourner les journaux de relais et entraîne la réplication des nouvelles entrées, quel que soit le format. Vous pouvez également appliquer la modification binlog_format à l'esclave.

35
RolandoMySQLDBA

Pour basculer binlog_format au moment de l'exécution, vous pouvez faire:

set global binlog_format = 'MIXED';

Cela définira toutes les NOUVELLES sessions au format binlog mixte. Toutes les sessions existantes seront ce qui a été défini précédemment jusqu'à leur fin.

Vous pouvez également faire set session binlog_format = 'MIXED'; manuellement pour résoudre tout problème spécifique à la session.

6
Jonathan