web-dev-qa-db-fra.com

Détection des tables verrouillées (verrouillé par LOCK TABLE)

Est-il possible de détecter les tables verrouillées dans MySQL? Je veux dire des tables verrouillées par le LOCK TABLE table WRITE/READ commande.

(Notez que les lecteurs intéressés à détecter des verrous nommés acquis avec GET_LOCK devrait lire Affiche tous les verrous actuels de get_lock à la place.)

49
Marcin

SHOW OPEN TABLES pour afficher le statut de chaque table et son verrou.

Pour les verrous nommés, regardez Afficher tous les verrous actuels de get_lock

17
confiq

Utilisation SHOW OPEN TABLES: http://dev.mysql.com/doc/refman/5.1/en/show-open-tables.html

Vous pouvez faire quelque chose comme ça

SHOW OPEN TABLES WHERE `Table` LIKE '%[TABLE_NAME]%' AND `Database` LIKE '[DBNAME]' AND In_use > 0;

vérifier toutes les tables verrouillées dans une base de données.

55
Aruman

Vous pouvez utiliser SHOW OPEN TABLES pour afficher le statut de verrouillage de chaque table. Plus de détails sur la page de documentation de la commande sont ici .

44
Marc B

Le moyen le plus simple est:

SHOW OPEN TABLES WHERE In_use > 0

Vous obtenez uniquement les tables verrouillées de la base de données actuelle.

Vous pouvez créer votre propre verrou avec GET_LOCK (lockName, timeOut)

Si vous faites une GET_LOCK(lockName, 0) avec un délai d'expiration de 0 avant de verrouiller les tables, puis de suivre avec un RELEASE_LOCK(lockName), tous les autres threads effectuant un GET_LOCK() obtiendront un la valeur 0 qui leur dira que le verrou est maintenu par un autre thread.

Cependant, cela ne fonctionnera pas si tous les threads n’appellent pas GET_LOCK() avant de verrouiller les tables. La documentation pour le verrouillage des tables est ici

J'espère que ça t'as aidé!

4
Giles Smith

Cet article explique comment obtenir des informations sur les ressources MySQL verrouillées. mysqladmin debug _ pourrait également être utile.

Vous pouvez également obtenir tous les détails pertinents de performance_schema:

SELECT
OBJECT_SCHEMA
,OBJECT_NAME
,GROUP_CONCAT(DISTINCT EXTERNAL_LOCK)
FROM performance_schema.table_handles 
WHERE EXTERNAL_LOCK IS NOT NULL

GROUP BY
OBJECT_SCHEMA
,OBJECT_NAME

Cela fonctionne comme

show open tables WHERE In_use > 0
1
Hannes Fischer