Yao vous présente la démarche à suivre pour
rechercher des transactions MySQL inactives

blocked-mysql-query-yao

J'ai essayé d'exécuter une requête sur mon instance Amazon Relational Database Service (Amazon RDS) qui exécute MySQL, mais elle a été bloquée. Aucune autre requête n'était en cours d'exécution à ce moment. Pour quelle raison la requête a-t-elle été bloquée et comment résoudre ce problème ?

La cause de blocage de requête la plus fréquente est une transaction InnoDB non confirmée, qui peut faire en sorte que les nouvelles requêtes sont bloquées, en veille, et finalement en échec lorsque le délai d'attente est dépassé.

Identifier les transactions non confirmées

1.     Identifiez toute transaction en cours en exécutant la requête suivante par rapport au tableau INNODB_TRX :

select * from information_schema.innodb_trx\G

2.    Faites correspondre les transactions en cours dans les résultats de la requête avec le comportement et la charge de travail de votre application. Ce processus peut s'avérer fastidieux, mais il est important de comprendre l'impact potentiel de chaque requête sur l'état de votre base de données et votre application avant de prendre une mesure.

3.    Après avoir identifié la transaction à l'origine du blocage, consultez le trx_state de la transaction et étudiez les implications liées à l'arrêt ou à la restauration de la transaction. Remarque : une restauration ou une opération de longue durée peut générer une activité de verrouillage ou d'E/S sur votre système qui est susceptible de nuire à votre base de données, application ou cas d'utilisation.

Arrêter les transactions

Si vous souhaitez arrêter la transaction, vous pouvez arrêter (interrompre) n'importe quelle transaction InnoDB en cours d'exécution en procédant comme suit :cour

1.    Recherchez toutes les transactions InnoDB en état En cours d'exécution en exécutant la commande suivante :

select * from information_schema.innodb_trx\G

2.    Notez l'ID de fil de la transaction InnoDB que vous souhaitez arrêter.

3.    Arrêter (interrompez) toutes les transactions en cours d'exécution en exécutant la commande suivante, lorsque thread-id est un ID de fil d'une transaction InnoDB en cours d'exécution :

CALL mysql.rds_kill(thread-ID)

Après l'arrêt de la transaction, essayez à nouveau d'exécuter la requête bloquée.


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 15/03/2017

Date de mise à jour : 05/07/2018