2009-10-03 4 views
2

Je n'ai trouvé d'autres postes similaires à cela, mais voulait un peu d'information supplémentaire sur ces options de mysqldump. J'ai compris que les tables --single-transaction et --lock-sont des opérations mutuellement exclusives. Voici mes questions concernant ces options.--single-transaction --lock-tables options de mysqldump- que se passe-t-il en interne?

a) Supposons que j'ai choisi d'utiliser l'option --lock-tables. Dans ce cas, mysqldump acquiert un verrou de lecture sur toutes les tables. Donc, tout autre processus essayant d'écrire dans les tables passera dans un état bloqué (attente). Mais si le mysqldump prend vraiment beaucoup de temps, est-ce que les processus en attente continueraient à attendre indéfiniment?

J'ai essayé cette expérience pour exemple- j'ai écrit de programme JDBC (Java) à une table de base de données MySQL appelée MY_TEST. Je me suis connecté à la console mysql et j'ai émis "LOCK TABLES MY_TEST READ;" commande manuellement. Le processus Java s'est donc bloqué en attendant que le verrou soit libéré. Ma question est s'il y aurait un délai de connexion ou un problème si le verrou de lecture ne se libère pas pendant longtemps? J'ai attendu deux minutes et n'ai remarqué aucune erreur et le processus Java s'est poursuivi normalement une fois que le verrou a été libéré en utilisant la commande "UNLOCK tables". Ce comportement est-il spécifique au pilote java mysql ou puis-je espérer la même chose d'un programme C utilisant le pilote mysql?

b) Ma deuxième question porte sur l'option --single transaction. Supposons que j'ai 10 tables InnoDB, dont 3 tables sont liées entre elles (en utilisant FK) et les autres étant indépendantes mais utilisant toujours le moteur InnoDB. Est-ce qu'une seule transaction s'applique uniquement aux trois tables qui sont liées entre elles par FK? ou puis-je m'attendre à ce que l'état des 7 tables indépendantes soit exactement comme c'était le cas lorsque les 3 tables interdépendantes ont été déversées.

Répondre

3

a.) Je crois que la réponse est oui, au niveau mysql les connexions attendront indéfiniment mysqldump pour libérer les verrous de table. Vous pouvez contrôler cela un peu au niveau de l'application à l'aide d'un pool de connexion avec une requête de validation des requêtes sur les tables verrouillées et se fixer le délai d'attente pour la récupération à tout ce que vous voulez. Ce serait assez facile à faire dans c3p0 par exemple. Cependant, en l'absence d'autres informations, je ne recommanderais pas cette approche; il semble assez kludgey. Je n'ai pas utilisé le pilote mysql C, donc je ne peux pas le faire avec certitude, mais j'assumerais un comportement similaire à Java. Tout cela explique pourquoi mysqldump n'est pas une bonne option pour une sauvegarde en direct de systèmes avec des quantités de données et d'activités non triviales.

b. Toutes les tables exportées seront sauvegardées dans le cadre d'une transaction unique, produisant ainsi un instantané cohérent pour toutes les tables participant à la sauvegarde. Les relations de clé primaire et étrangère n'auront aucune incidence sur la transaction. L'utilisation de la transaction unique est une option viable pour les sauvegardes à chaud.