2008-09-15 5 views
12

Je suis en train de supprimer plusieurs lignes d'une base de données MySQL 5.0.45:MySQL: « lock délai d'attente dépassé »

delete from bundle_inclusions; 

Le client fonctionne pendant un certain temps puis renvoie l'erreur:

Lock wait timeout exceeded; try restarting transaction 

Il est possible qu'il y ait une transaction non validée là-bas qui a un verrou sur cette table, mais j'ai besoin de ce processus pour l'emporter sur de tels verrous. Comment puis-je casser le verrou dans MySQL?

Répondre

19

Je suis d'accord avec Erik; TRUNCATE TABLE est le chemin à parcourir. Toutefois, si vous ne pouvez pas l'utiliser pour une raison quelconque (par exemple, si vous ne vraiment à supprimer toutes les lignes de la table), vous pouvez essayer les options suivantes:

  • Supprimez les lignes en petits lots (par exemple, DELETE FROM bundle_inclusions WHERE id BETWEEN? et?)
  • S'il s'agit d'une table MyISAM (en fait, cela peut également fonctionner avec InnoDB), essayez d'émettre une table LOCK avant le DELETE. Cela devrait garantir que vous avez un accès exclusif.
  • S'il s'agit d'une table InnoDB, puis après le délai expire, utilisez SHOW INNODB STATUS. Cela devrait vous donner un aperçu de la raison pour laquelle l'acquisition du verrou a échoué.
  • Si vous avez le privilège SUPER, vous pouvez essayer SHOW PROCESSLIST ALL pour voir quelles autres connexions (le cas échéant) utilisent la table, puis utiliser KILL pour se débarrasser de celui (s) que vous êtes en compétition avec.

Je suis sûr qu'il y a beaucoup d'autres possibilités; J'espère que l'un de ces aide.

3

Deviner: truncate table bundle_inclusions

5

Linux: Dans la configuration de MySQL (ou /etc/my.cnf /etc/mysql/my.cnf), insérer/modifier cette ligne

innodb_lock_wait_timeout = 50 

Augmentez la valeur suffisamment (il est en secondes), redémarrer la base de données, effectuer des modifications. Puis revenez à la modification et redémarrez à nouveau.

2

J'ai eu le même problème, une transaction voyous sans fin. J'ai redémarré le processus mysqld. Vous n'avez pas besoin de tronquer une table. Vous risquez de perdre des données de cette transaction frauduleuse.

Questions connexes