web-dev-qa-db-fra.com

Verrouillage de table rassis dans AWS Aurora?

Nous avons un AWS Aurora (MySQL Moteur, R3.Large) Nous utilisons pour tester une migration.

Nous avons remarqué quelques questions qui ne semblent tout simplement pas courir. Quand je cours

show engine innodb status;

il rapporte qu'il existe une seule table verrouillée:

2017-06-21 18:20:49 2aea8928a700 Transaction:
TRANSACTION 6093969, ACTIVE 0 sec updating or deleting
mysql tables in use 1, locked 1
16 lock struct(s), heap size 376, 6164 row lock(s), undo log entries 1
MySQL thread id 12219, OS thread handle 0x2aea8928a700, query id 8842803 10.127.0.24 root updating
delete from <tablename> where id=<id>
Foreign key constraint fails for table `mydb`.`<otherTable>`:

Ceci est un Java Application. J'ai arrêté les instances Tomcat et vérifiait qu'il n'y a pas de connexions actives, mais la serrure ne s'efforce pas.

J'ai regardé quelques tables dans Information_schema (Innodb_Locks, Innodb_Lock_waits et Innodb_trx), mais il y a 0 enregistrements.

Est-ce un problème d'aurora? Toute solution autre que AWS Support?

3
chris

Je ne peux pas dire si cela implique Aurora, mais voici quelque chose à noter: il y a des occasions où InnoDb laissera la serrure couchée. Comment cela peut-il arriver ?

Il y a environ six ans, je réponds à cette question: sont des blocages InnoDB exclusifs à insertion/mise à jour/Supprimer? . Dans ce poste, j'ai mentionné ce qui suit de la documentation MySQL:

Lorsque InnoDB effectue une annulation complète d'une transaction, toutes les serrures définies par la transaction sont libérées. Toutefois, si juste une seule instruction SQL est renvoyé à la suite d'une erreur, certaines des serrures définies par l'instruction peuvent être préservées. Cela se produit parce que InnoDB stocke les serrures de rangée dans un format de telle sorte qu'il ne peut pas savoir par la suite que le verrou soit défini par quelle déclaration.

Ceci est toujours dans le MySQL 5.7 Docs sur la détection et la restauration de l'impasse (paragraphe 3)

Vous avez indiqué dans la question

J'ai regardé quelques tables dans Information_schema (Innodb_Locks, Innodb_Lock_waits et Innodb_trx), mais il y a 0 enregistrements.

Dans ma réponse à la question de 6 ans , j'ai montré la requête de cette version utilisée par un plugin de chèque Percona Nagios:

SELECT COALESCE(MAX(IF(p.command = 'Sleep', p.time, 0)), 0) AS idle_in_trx
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS b ON  b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS r ON  r.trx_id = w.requesting_trx_id
LEFT JOIN  INFORMATION_SCHEMA.PROCESSLIST       AS p ON  p.id     = b.trx_mysql_thread_id;

J'ai modifié cette requête pour afficher l'ID de processus de la transaction de blocage, l'ID de processus des transactions demandeuses bloquées et leurs valeurs respectives de INFORMATION_SCHEMA.PROCESSLIST:

SELECT COALESCE(MAX(IF(pb.command='Sleep',pb.time, 0)), 0) idle_in_trx,
pb.ID BLK_ID,pb.USER BLK_USER,pb.Host BLK_Host,pb.DB BLK_DB,
pb.COMMAND BLK_CMD,pb.TIME BLK_TIME,pb.STATE BLK_STATE,pb.INFO BLK_INFO,
pr.ID REQ_ID,pr.USER REQ_USER,pr.Host REQ_Host,pr.DB REQ_DB,
pr.COMMAND REQ_CMD,pr.TIME REQ_TIME,pr.STATE REQ_STATE,pr.INFO REQ_INFO,w.*
FROM       INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS b  ON b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX        AS r  ON r.trx_id = w.requesting_trx_id
LEFT JOIN  INFORMATION_SCHEMA.PROCESSLIST       AS pb ON pb.id    = b.trx_mysql_thread_id
LEFT JOIN  INFORMATION_SCHEMA.PROCESSLIST       AS pr ON pr.id    = r.trx_mysql_thread_id
\G

Si vous courez cela, vous verrez l'une des deux choses:

  1. L'ID de processus provoquant ce bourrage de blocages de serrures
  2. Tout va venir null (aucune transaction n'est bloquée). Cela indique que la serrure est bloquée à La-la-la-terre (Aurora est en faute). Dans ce cas, redémarrez RDS.
4
RolandoMySQLDBA