Büyük bir .sql dosyasının içe aktarılmasının ilerlemesini nasıl izleyebilirim?


204

foobar.sqlYerel bir veritabanındaki bir tabloyu geri yüklemek için 7 GB'ı içe aktarıyorum .

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

İlerlemesini nasıl izleyebilirim?


1
Bu sorunun cevapları, bunun mysql istemcisinin açık bir eksikliği olduğunu gösteriyor
William Entriken,

Yanıtlar:


267

Bir döküm dosyasından * nix'deki CLI'den yalnızca bir aktarma dosyası alıyorsanız, örneğin

mysql -uxxx -pxxx dbname < /sqlfile.sql

daha sonra önce işletim sisteminize boru görüntüleyici kurun , ardından şöyle bir şey deneyin:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

program çalışırken bir ilerleme çubuğu gösterecektir.

Çok kullanışlıdır ve mysqldump işleminin ilerlemesini tahmin etmek için de kullanabilirsiniz.

pv, onu atar sqlfile.sqlve onları mysql'e geçirir (boru operatörü yüzünden). Damping yaparken, ilerlemeyi gösterir. Harika olan şey, mysql'nin verileri yalnızca ilerleyebildiği kadar hızlı almasıdır, böylece pv içe aktarmanın ilerlemesini gösterebilir. Kanıtım yok. Ama öyle görünüyor. Sanırım kullanılan bir tampon var, ama bir noktada mysqlhala işlem yapmakla meşgul olduğunda daha fazla veri okumadığını düşünüyorum .

Pipe Viewer ekran görüntüsü


1
MySQL'in bazılarının tamamen "işlenmeden" aktarılabildiği bir arabellek olabileceğini tahmin ediyorum (yani, eğer hata çıkarsa, pv gerçekte ne olduğunu biraz fazla rapor etmiş olabilir). Ancak genel olarak, borular böyle çalışır. sudo hd /dev/sda1 | lessTüm sistem bölümünüzü bellekte bulundurmanızın ve yaptırmamanızın aynı nedeni .
snapfractalpop

2
@snapfractalpop pvçoğu durumda aşırı derecede doğru olmaz çünkü bazı SQL parçalarının işlenmesi diğerlerinden daha fazla zaman alır. Basit bir ek oluşturan bir satır, örneğin zaten çok sayıda sıra içeren bir tabloda indeks oluşturmuş olandan çok daha hızlı çalışacaktır. Ancak, kaba bir ilerleme fikri, kullanılan okuma tamponu mysqlözellikle büyük olmadıkça (7Gb'lik bir giriş için tamponun pvçıkışının hiç kullanışlı olmamasını sağlamak için çok büyük olması gerekeceği sürece, çıkışın faydalı olması gerekir .
David Spillett

1
@DavidSpillett gerçekten. Yorumunuz benim düşüncemi yansıtıyor. Temel olarak, pv ham, ancak etkilidir. En çok sevdiğim şey, ne kadar genel olduğu. Bu, unix borularının güzelliğidir (teşekkürler McIlroy).
snapfractalpop 15

1
@ rob Bu harika dostum, ayrıca bir örnek verebilir misiniz mysqldump?
Josue Alexander Ibarra,

Çok güzel bir çözüm! Eğer şifre manuel ise pv ilerlemesini göstermesini
beklemiyor

26

İçe aktarma işlemini zaten başlattıysanız, veritabanlarınızın geçerli boyutunu görmek için bu komutu başka bir pencerede çalıştırabilirsiniz. Almakta olduğunuz .sql dosyasının toplam boyutunu biliyorsanız, bu yararlı olabilir.

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

Kredi için: http://forums.mysql.com/read.php?108,201578,201578


MySQL 8.0 Referans durumları doğruluğu hakkında aşağıdaki gibidir:

DATA_LENGTH

MyISAM için DATA_LENGTH, veri dosyasının bayt olarak uzunluğu.

InnoDB için DATA_LENGTH, kümelenmiş dizin için bayt cinsinden ayrılan yaklaşık bellek miktarıdır. Özellikle, sayfalardaki kümelenmiş dizin boyutu InnoDB sayfa boyutuyla çarpılır.

 

INDEX_LENGTH

MyISAM için, INDEX_LENGTH, dizin dosyasının bayt olarak uzunluğu.

InnoDB için INDEX_LENGTH, kümelenmemiş dizinler için ayrılan yaklaşık bayt cinsinden bellek miktarıdır. Özellikle, sayfalardaki kümelenmemiş dizin boyutlarının InnoDB sayfa boyutuyla çarpımı toplamıdır.


Masam şu anda bu cevabın verdiği komutlara göre 12 GiB'de ve hala ithal ediyor. Benim sqldump dosyam sadece 5 GiB. Bu tutarsızlık için bir açıklama yapmak
isterdim

17

Tek bir veritabanında bir mysqldump yürüttüğünüzde, tüm tablolar alfabetik sırayla dökülür.

Doğal olarak, mysqldump’ın bir veritabanına yeniden yüklenmesi de alfabetik olarak sıralanır.

Bir GÖSTERİ İŞLEMCİ YAPABİLİRSİNİZ; ve mysqldump çalıştıran DB Bağlantısını öğrenin. Dökümü yeniden yüklendiğinde, DB bağlantısı kaybolur.

Hangi tabloların döküm dosyasında olduğunu bilmek istiyorsanız, bunu foobar.sql'a karşı çalıştırın.

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

GÜNCELLEME 2012-05-02 13:53 EDT

Sadece bir masa olduğunu fark etmediğim için üzgünüm.

Eğer tablo MyISAM ise, izlemenin tek yolu işletim sistemi açısındandır. Sebep? Tablo yeniden yükleme boyunca yazma kilitlidir. Ne arıyorsunuz? .MYDVe .MYIdosyaların boyutu . Tabii ki, ithal ettiğiniz diğer DB sunucusunda daha önce tablo boyutunun ne olduğu ile karşılaştırmanız gerekir.

Tablo InnoDB ise ve innodb_file_per_table etkinse, izlemenin tek yolu işletim sistemi bakış açısına göredir . Sebep? Tablo yeniden yükleme boyunca yazma kilitlidir. Ne arıyorsunuz? .ibdDosyanın boyutu . Tabii ki, ithal ettiğiniz diğer DB sunucusunda daha önce tablo boyutunun ne olduğu ile karşılaştırmanız gerekir.

Tablo InnoDB ise ve innodb_file_per_table devre dışı bırakılmışsa, işletim sistemi bakış açısı bile yardımcı olamaz.

GÜNCELLEME 2012-05-02 13:56 EDT

Geçen yıl böyle bir şeye değindim: "type db.sql | mysql" için% ilerleme nasıl alırım

GÜNCELLEME 2012-05-02 14:09 EDT

Standart bir mysqldump yazma masasını şöyle kilitler:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

daha sonra, masa kilidi serbest bırakılıncaya kadar mysql ile bir ilerleme elde etmek için bir yolu yoktur.

Alabileceğiniz olursa LOCK TABLESve UNLOCK TABLESdumpfile dışına yorumladı ...

  • Eğer tablo MyISAM ise, SELECT COUNT (*) işe yarar.
  • Eğer masa InnoDB ise, SELECT COUNT (*), sayım tamamlanıncaya kadar yükü yavaşlatır / durdururdu.

İşe yaradı. Teşekkürler. Son bir soru, deneyimle, içe aktarma zamanının ve dosya boyutlarına göre kabaca doğrusal olup olmadığını biliyor musunuz? .MYD.MYI
qazwsx

1
Tablo yeniden yükleme doğrusaldır. Endeks yeniden yapılandırmaları doğrusaldır. Ben MySQL (bir soru olarak bu cesaret olarak Yıllar önce, bu değildi lists.mysql.com/mysql/202489 ) ve DBA Stack Exchange (bu yönde görüş belirtti dba.stackexchange.com/a/2697/877 )
RolandoMySQLDBA

8

Her 2 saniyede bir süreçlerin çalıştığını göreceksiniz.

watch 'echo "show processlist;" | mysql -uuser -ppassword';

Daha az sıklıkta istiyorsanız -n x, x'in saniye sayısını nereye ekleyin . 5 saniye:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

Örnek bir çıktı gönderebilir misiniz? Ayrıca, sadece süreci gösteriyor mu yoksa gerçekten talep ettiğim ithalatın ilerlemesini gerçekten gösteriyor mu?
qazwsx

Bu çok faydalı bir kod. Teşekkür ederim
NarayaN

6

Sadece durup durmadığını kontrol etmek istiyorsanız sorgulayabilirsiniz

show processlist; 

ve ne yapıldığını görün.


5

Çalışmak için pv alamayan veya pv yalan söyleyen biri için bir çözüm olarak. İbdata1 dosyasının boyutunu, verileri içeren / var / lib / mysql içinde izleyebilirsiniz. Bu, kaynak sunucunuzdaki dosya boyutunun aynı boyutunda (veya bununla) sona erecektir.

Çok sayıda tablo varsa, bunların / var / lib / mysql / <database name> içinde birer birer görünmesini de izleyebilirsiniz.

Bu gerçeği son zamanlarda, uzun vadeli bir veritabanı üç veya dört yıllık bir süre zarfında 20G civarında bir günlük dosyası oluşturduğunda kullandım. Transferin yaşlandığını fark ettim ve bu tekniği ilerlemeyi izlemek için kullandım.

Bir veritabanının bir yerde veya başka bir dosya içermemesi durumunda günün şafak vakti gelmesi ihtimalinin yüksek olmadığını düşünüyorum. Bu arada, bir transferin nasıl ilerlediğini görmek için dosyayı izleyebilirsiniz. Önerdiğim yöntem, ilk sql veritabanının yazıldığı günden bu yana bir biçimde yapabileceğiniz bir şeydi. Manuel bir jokinin geri çekilebileceği herhangi bir "resmi" teknik olduğunu önermek istemedim. Genel olarak bilgisayarlar konusunda genel bir yeterlilik seviyesi ve özellikle de unix'i varsayar.


2

Eğer DB'niz aksi takdirde sessizse (yani aktif başka kullanıcılar yoksa) ve sadece okuma / yazma aktivitesini görmek istiyorsanız neden böyle bir şey yapmıyorsunuz:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

Okur / yazar / ekler / bekler / güncelleme sayısını göreceksiniz.

Örneğin ekliyorsanız, şöyle bir şey göreceksiniz:

Innodb_rows_inserted                          | 28958 

28958, aralığınız için girilen satır sayısıdır (benim durumumda 10 saniye).


1

Pipo izleyici örneğini kullanarak mysqldumpsizi arayan biri için, sadece şöyle bir şey yaparsınız:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

-WBayrak sadece ilk bayt (istemi sonra) ilerleme göstermeden önce gelmesini beklemek pv söyler


0

Bir Alma işlemini \ Msql \ Data [DB name] klasöründe izleyebilirsiniz.


0

Tamam, etrafta başka bir iş var. Ancak bu en kötü ve yanlış seçenek olabilir.

Yani, işte Windows için benim çözümüm:

Görev Yöneticisini açarak tuşuna basın.

CTRL + SHIFT + ESC

"Mysqld.exe" disk değeri hızını kopyalayın

e.g. 11mb/s

Bunu bunun gibi bir hesap makinesine koyun: https://techinternets.com/copy_calc?do

ETA'yı tahmin edin. Benim durumum:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

Sonuçlar:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

Kimse bir seçenek olarak 'mysql -v' göndermedi çok şaşırdım. Sıkışırsa, çıkış duracaktır.


3
“İlerlemenin izlenmesi” yaygın olarak, sürecin ne kadar ilerlediğini veya ne zaman tamamlanacağını (bu mysql -vteklifin ne zaman gerçekleşmeyeceğini) tahmin etmeye çalışmak anlamına gelir . Ayrıca, terminale 7 GB veri dağıtımı geri yüklemeyi önemli ölçüde yavaşlatır.
mustaccio

Anladım, açıklama için teşekkürler. Bu doğru, 7 GB çıkış terminaline çıkış için iyi olmaz. Sanırım beni -v kullanarak sadece benim db sıkışmış olur küçük bir yerel test durum için yapıldı.
dtc

2
Bu öneri, bir sorunu tespit etmeme yardımcı oldu, ancak büyük dosyalarla kullanmak için kullanışsız olabilir. (Benimki küçüktü).
Casey Perkins,
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.