--single-transactionSeçeneği mysqldump yapar bir do FLUSH TABLES WITH READ LOCKönceki yedekleme işi başlamadan fakat sadece belirli şartlar altında. Bu koşullardan biri de --master-dataseçeneği belirttiğiniz zamandır.
Kaynak kodunda, mysql-5.6.19/client/mysqldump.c5797 satırından:
if ((opt_lock_all_tables || opt_master_data ||
(opt_single_transaction && flush_logs)) &&
do_flush_tables_read_lock(mysql))
goto err;
Tekrarlanabilir okuma işlemine başlamadan önce kesin binlog koordinatlarında sağlam bir kilit --master-dataelde etmek için , seçenek bu kilidin alınmasını tetikler ve binlog koordinatları elde edildikten sonra serbest bırakılır.
Aslında, mysqldumpbir yok FLUSH TABLESbir takip FLUSH TABLES WITH READ LOCKikisini de yapıyor okuma kilidi ilk floş biraz zaman alır durumlarda daha hızlı elde edilmesini sağlar çünkü.
...ancak...
Binlog koordinatlarını alır almaz, mysqldumpbir UNLOCK TABLESifade yayınlar , bu nedenle başlattığınız kızarıklık nedeniyle herhangi bir engelleme olmamalıdır. Bekleyen Waiting for table flushişlem sonucunda hiçbir iş parçacığı da olmamalıdır mysqldump.
Durumda bir iş parçacığı gördüğünüzde Waiting for table flush, bu , deyimin başlatıldığı ve sorgu başlatıldığında çalışmakta olduğu anlamına gelmelidir . Gönderdiğiniz işlem listesinin aynı tablodan okunması durumunda ve sorgu bir süredir çalışıyor olsa da, engelleme sorguları bu kadar uzun süredir engellemiyor.FLUSH TABLES [WITH READ LOCK]mysqldump
Bu, başka bir şeyin olduğunu gösteriyor.
Uzun süredir devam eden sorun var # 44884 Bug açıklanan yolu ile FLUSH TABLESiçten, işlerin. Sorun hala devam ederse şaşırmazdım, bu sorunun "sabit" olması durumunda şaşırırdım çünkü çözülmesi çok karmaşık bir konudur - yüksek eşzamanlılık ortamında gerçekten düzeltmek neredeyse imkansızdır - ve herhangi bir girişimde onu düzeltmek, başka bir şeyi kırma veya yeni, farklı ve hala istenmeyen davranışlar oluşturma konusunda önemli bir risk taşır.
Muhtemelen bu gördüğünüz şeyin açıklaması olacak gibi görünüyor.
özellikle:
bir tabloya karşı çalışan uzun bir sorgu varsa ve sorun varsa FLUSH TABLES, FLUSH TABLESuzun süre çalışan sorgu tamamlanana kadar engeller.
Ayrıca, FLUSH TABLESyayınlandıktan sonra başlayan tüm sorgular FLUSH TABLEStamamlanana kadar engellenir .
Eğer öldürürsen ayrıca, FLUSH TABLESsorgu, engelliyor sorgular olacak hala bloke orijinal sorgu uzun süren engelleme edildi birini FLUSH TABLESöldürse de, çünkü sorgu FLUSH TABLESsorgu bitiremedi, bu tabloyu (birini veya daha fazla, uzun süren sorguyla ilgili) hala boşaltılan bir süreçtir ve uzun süren sorgu biter bitmez bu beklemedeki durulama gerçekleşir - ancak daha önce değil.
Buradaki muhtemel sonuç, başka bir sürecin - belki de başka bir mysqldump, ya da tavsiye edilmeyen bir sorgu ya da kötü yazılmış bir izleme sürecinin bir tabloyu temizlemeye çalıştığıdır.
Bu sorgu daha sonra bilinmeyen bir mekanizma tarafından öldürüldü veya zaman aşımına uğradı, ancak sonraki etkileri mysqldumpsöz konusu tablodan okuma bitene kadar devam etti .
FLUSH TABLESUzun süredir devam eden bir sorgu devam ederken bunu deneyerek bu koşulu çoğaltabilirsiniz . Ardından, engellenecek başka bir sorgu başlatın. Ardından FLUSH TABLES, en son sorgunun engellemesini kaldırmayacak olan sorguyu öldürün . Sonra ilk sorguyu öldürün ya da bitmesine izin verin, son sorgu başarıyla çalışacaktır.
Sonradan düşünüldüğünde, bu ilgisizdir:
Trx read view will not see trx with id >= 1252538405, sees < 1252538391
Bu normaldir, çünkü mysqldump --single-transactiona START TRANSACTION WITH CONSISTENT SNAPSHOTdökümü, döküm devam ederken değiştirilen verileri dökmesini önler. Bu olmadan, başlangıçta elde edilen binlog koordinatları anlamsız olurdu, çünkü --single-transactioniddia ettiği gibi olmazdı. Bu Waiting for table flushişlemin hiçbir şekilde sorunla ilgili olmaması gerekir , çünkü bu işlemin kesinlikle kilitleri yoktur.