2012-03-20 25 views
25

http://dev.mysql.com/doc/refman/5.0/en/internal-locking.htmlOdblokowywanie tabel po utracie nici

Poniżej znajduje się fragment z dokumentacji.

mysql> LOCK TABLES real_table WRITE, temp_table WRITE; 
mysql> INSERT INTO real_table SELECT * FROM temp_table; 
mysql> DELETE FROM temp_table; 
mysql> UNLOCK TABLES; 

Moje pytanie jest to, że jeśli mogę użyć tej logiki w kodzie skryptu powłoki, a jeśli wątek jest tracona (nie zabity), zanim dotrze „odblokować stoły” oświadczenie, w jaki sposób będę wiedzieć, że niektóre tabele są zablokowane i jak odblokować tabele ręcznie?

+0

Czy rozważałeś użycie transakcji zamiast? http://stackoverflow.com/questions/4226766/mysql-transactions-vs-locking-tables – GordonM

Odpowiedz

19

Skąd będę wiedzieć, że niektóre stoły są zablokowane?

Możesz użyć polecenia SHOW OPEN TABLES, aby wyświetlić zablokowane tabele.

Jak odblokować tabele ręcznie?

Jeśli znasz identyfikator sesji, że zablokowane tabele - „SELECT CONNECTION_ID()”, a następnie można uruchomić komendę KILL aby zakończyć sesję i odblokować tabele.

+2

, jeśli nie znam identyfikatora sesji i terminalu, który zablokował tabelę nie jest otwarty, to? – shantanuo

+2

Postaraj się ustawić okres oczekiwania na TIMEOUT przed tabelami blokowania (na przykład SET WAIT_TIMEOUT = 120;). Pomoże to automatycznie zamknąć to połączenie po upływie określonego czasu. – Devart

76

Oto co mam zrobić, aby zmusić odblokowanie niektórych zablokowanych tabel w MySQL

1) Wprowadzić MySQL

mysql -u your_user -p 

2) Zobaczmy listę zablokowanych tabelach

mysql> show open tables where in_use>0; 

3) Zobaczmy listę bieżących procesów, jednym z nich jest blokowanie tabel (y)

mysql> show processlist; 

4) Chodźmy zabić jednego z tych procesów

mysql> kill put_process_id_here; 
+0

Bardzo przydatne! Dzięki! –

+2

W jakiś sposób udało mi się zablokować stolik bez wyświetlania niczego na liście procesów (poza połączeniami ze śpiącymi) ... – Kevin

+1

Jeśli proces nie został całkowicie zakończony, ale otrzymujesz skargi dotyczące zablokowanych tabel: po prostu zrestartuj mysqld. Dla mnie był to "service mysqld restart" –

2

Z Sequel Pro:

ponownym uruchomieniu aplikacja odblokowane moje tabele. Resetuje połączenie sesji.

NOTE: I was doing this for a site on my local machine.

Powiązane problemy