MySQL'de açık işlemleri görüntüleyin


98

Taahhüt olmadan bazı sorgular yaptım. Daha sonra uygulama durduruldu.

Bu açık işlemleri nasıl görüntüleyebilir, taahhüt edebilir veya iptal edebilirim?


Sanırım tüm işlemleriniz bağlantı kesildiğinde iptal edilir, ancak% 100 emin değil.
Johan

Ne tür tablolar kullanıyorsunuz? MyISAM, InnoDB vb.
cdeszaq

@cdeszaq, tabii ki MyISAM değil, işlemleri yok, ayrıca sorunun tablolarla hiçbir ilgisi yok.
Johan

2
@Johan - MyISAM'i sadece tablo türüne örnek olarak verdim. Ve bunu çok yapar destek işlemleri bağlantı kaybına işlemlerle ilgili olarak aynı şekilde davranır tüm tabloları çünkü, madde.
cdeszaq

@cdeszaq, MySQL dokümanları çok farklı bir şeyi belirtir.
Johan

Yanıtlar:


61

Bu açık işlemleri nasıl görüntüleyebilir, taahhüt edebilir veya iptal edebilirim?

Açık işlem yoktur, MySQL bağlantı kesildiğinde işlemi geri alır.
İşlemi gerçekleştiremezsiniz (IFAIK).

Kullanarak konuları görüntülüyorsunuz

SHOW FULL PROCESSLIST  

Bakınız: http://dev.mysql.com/doc/refman/5.1/en/thread-information.html

Size yardımcı olmaz, çünkü kopuk bir bağlantıdan işlem yapamazsınız.


MySQL belgelerinden bir bağlantı kesildiğinde ne olur : http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html

4.5.1.6.3. Mysql Otomatik Yeniden Bağlantıyı Devre Dışı Bırakma

Mysql istemcisi bir ifade gönderirken sunucuyla bağlantısını kaybederse, hemen ve otomatik olarak sunucuya bir kez yeniden bağlanmaya ve ifadeyi tekrar göndermeye çalışır. Ancak , mysql yeniden bağlanmayı başarsa bile, ilk bağlantınız sona erdi ve önceki tüm oturum nesneleriniz ve ayarlarınız kayboldu : geçici tablolar, otomatik taahhüt modu ve kullanıcı tanımlı ve oturum değişkenleri. Ayrıca, mevcut herhangi bir işlem geri alınır .

Bu davranış, sizin bilmeden birinci ve ikinci ifadeler arasında sunucunun kapatıldığı ve yeniden başlatıldığı aşağıdaki örnekte olduğu gibi sizin için tehlikeli olabilir:

Ayrıca bkz: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html

Bu nasıl teşhis edilir ve düzeltilir
Otomatik yeniden bağlanmayı kontrol etmek için:

Otomatik bir yeniden bağlantı oluşursa (örneğin, mysql_ping () 'i çağırmanın bir sonucu olarak), bunun açık bir göstergesi yoktur. Yeniden bağlanmayı kontrol etmek için mysql_thread_id()aramadan önce orijinal bağlantı tanımlayıcısını almak için mysql_ping()arayın, ardından mysql_thread_id()tanımlayıcının değişip değişmediğini görmek için tekrar arayın .

Gerekirse yeniden gönderebilmeniz için istemcide son sorgunuzu (işleminizi) sakladığınızdan emin olun.
Otomatik yeniden bağlanma modunu devre dışı bırakın, çünkü bu tehlikeli bir durumdur, bunun yerine kendi yeniden bağlantınızı uygulayın, böylece bir düşüşün ne zaman gerçekleştiğini bilir ve bu sorguyu yeniden gönderebilirsiniz.


Bunun soruyla hiçbir ilgisi yok. Bu sadece mysql istemcisini etkiler ve OP genel bir uygulamadan bahsediyor, bu da muhtemelen onun uygulaması anlamına geliyor . Ek olarak, çağıran uygulama durduğundan, işlemi bellekte nasıl tutabilirdi?
cdeszaq

@cdeszaq, soruyla ilgili her şeyi var. Bir uygulama genellikle istemcidemysqld.dll AKA kullanır Ve tüm işlemi içeren SQL ifadesini bellekte tutar, böylece bağlantı kesildiğinde onu oynatabilirsiniz. Veya yerel olarak diskte tutarsınız, böylece yeniden başlattıktan sonra yeniden gönderebilirsiniz.
Johan

SHOW FULL PROCESSLIST'ta yalnızca benim işlem listesi komutu görüntüleniyor. Yani sanırım açık işlem yok. İşin komik yanı, autoincrement_ids'in kaybolmuş gibi görünmesidir.
Alex

@alex resmi dokümanlar bunu belirtir, bu nedenle bu dokümante edilmiş bir davranış. Bağlantılara bakın.
Johan

Güzel, Johan. Soruyu cevapladı ve birkaç paragraf içinde bazı sonuçları ve bu sonuçlara yönelik çözümleri gösterdi.
Gerard Bireill

55

Durumda herhangi bir işlem kalmasa da @Johan'ın dediği gibi, isterseniz aşağıdaki sorgu ile InnoDB'de mevcut işlem listesini görebilirsiniz.

SELECT * FROM information_schema.innodb_trx\G

Gönderen belgede :

INNODB_TRX tablosu, işlemin bir kilit bekleyip beklemediği, işlemin ne zaman başladığı ve varsa işlemin yürüttüğü SQL ifadesi dahil olmak üzere InnoDB içinde halihazırda yürütülen her işlem hakkında (salt okunur işlemler hariç) bilgi içerir.


Bu tablodaki işlemlerin sizin özel isteğinize / oturuma ait olup olmadığını anlamanın bir yolu olduğunu düşünmeyin.
Kaptan Hypertext

1
Lütfen \Gsondaki değiştiricinin yalnızca sorgu çıktısını mysql CLI aracında biçimlendirmek istiyorsanız yararlı olduğunu unutmayın. Mysql Workbench gibi bir GUI aracı kullanıyorsanız buna ihtiyacınız yoktur.
barell

30

Sen kullanabilirsiniz show innodb status(veya show engine innodb statusşu anda InnoDB'nin motorun içinde bekleyen tüm eylemlerin bir listesini almak MySQL'in yeni sürümler için). Çıktı duvarına gömülü olan işlemler ve hangi dahili işlem kimliği altında çalıştıkları olacaktır.

Bu işlemlerin tamamlanmasını veya geri alınmasını zorlayamazsınız, ancak bunları çalıştıran MySQL sürecini öldürebilirsiniz, bu da esasen geri dönüşe dönüşür. İşlemlerin bağlantısını keser ve MySQL'in kalan karışıklığı temizlemesine neden olur.

İşte aramak isteyeceğiniz şey:

------------
TRANSACTIONS
------------
Trx id counter 0 140151
Purge done for trx's n:o < 0 134992 undo n:o < 0 0
History list length 10
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 17004, OS thread id 140621902116624
MySQL thread id 10594, query id 10269885 localhost marc
show innodb status

Bu durumda, şu anda InnoDB motoruna yalnızca bir bağlantı var (giriş bilgilerim, showsorguyu çalıştırıyor ). Bu satır, sonlandırmak isteyeceğiniz gerçek bir bağlantı / takılı işlem olsaydı, o zaman bir kill 10594.


Bir zaman aşımından sonra bir bağlantıyı aktif olarak sonlandırmaya gerçekten gerek yoktur, bağlantı yine de kesilir ve kopuk bir bağlantıdan bekleyen işlem gerçekleştirilemez, böylece tekrarlama korkusu olmadan yeniden gönderilebilir.
Johan

3
Sıkışan işlemleri temizlemek için bir zaman aşımını beklemeden öldürmek daha iyidir - aksi takdirde kilitlenme riskini alırsınız.
Marc B

Ah evet, bu yorum için +1. Bir dakikalığına bu çıkmazları unuttum.
Johan

@MarcB, neden değiştirdiler show engine innodb status?
Pacerier

2

Bu sorguyu kullanarak tüm açık işlemleri görebilirsiniz.

Hepsini listele:

SHOW FULL PROCESSLIST  

Bu komutu kullanarak askıda duran bir işlemi kopyalamak ve işlemi sonlandırmak istiyorsanız:

KILL <id>    // e.g KILL 16543
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.