--single-transaction
Seç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-data
seçeneği belirttiğiniz zamandır.
Kaynak kodunda, mysql-5.6.19/client/mysqldump.c
5797 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-data
elde etmek için , seçenek bu kilidin alınmasını tetikler ve binlog koordinatları elde edildikten sonra serbest bırakılır.
Aslında, mysqldump
bir yok FLUSH TABLES
bir takip FLUSH TABLES WITH READ LOCK
ikisini 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, mysqldump
bir UNLOCK TABLES
ifade yayınlar , bu nedenle başlattığınız kızarıklık nedeniyle herhangi bir engelleme olmamalıdır. Bekleyen Waiting for table flush
iş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 TABLES
iç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 TABLES
uzun süre çalışan sorgu tamamlanana kadar engeller.
Ayrıca, FLUSH TABLES
yayınlandıktan sonra başlayan tüm sorgular FLUSH TABLES
tamamlanana kadar engellenir .
Eğer öldürürsen ayrıca, FLUSH TABLES
sorgu, engelliyor sorgular olacak hala bloke orijinal sorgu uzun süren engelleme edildi birini FLUSH TABLES
öldürse de, çünkü sorgu FLUSH TABLES
sorgu 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 mysqldump
söz konusu tablodan okuma bitene kadar devam etti .
FLUSH TABLES
Uzun 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-transaction
a START TRANSACTION WITH CONSISTENT SNAPSHOT
dö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-transaction
iddia ettiği gibi olmazdı. Bu Waiting for table flush
işlemin hiçbir şekilde sorunla ilgili olmaması gerekir , çünkü bu işlemin kesinlikle kilitleri yoktur.