MySQL veritabanlarını içe aktarırken bir ilerleme göstergesi alın


21

Sık sık MySQL veritabanlarını içe aktarıyorum ve bu biraz zaman alabilir. Hiçbir ilerleme göstergesi yok. Bir şekilde gösterilebilir mi? Kayıtlar içe aktarıldı, MB içe aktarıldı veya tablolar içe aktarıldı ... her şey beklemekten daha iyi. Bir fikrin var mı?

Bu komutu kullanıyorum:

mysql -uuser -p -hhost database < largefile.sql

Dosyalar 40-300 MB arasındadır ve ana makine yerel ağdadır.



@sr_ Bence pvsoru soran kişi tam olarak budur. Ben sadece rpmforge ile CentOS üzerine yükledim. Size -parameter verilirse bir ETA bile gösterilecektir.
Nils

pvgerçekten hile yaptı! Birisi bunu cevaplayabilirse, bunu kabul edebilirim!
Monica

Yanıtlar:


31

Güzel bir araç var pv

# On Ubuntu/Debian system
$ sudo apt-get install pv

# On Redhat/CentOS
$ sudo yum install pv

o zaman örneğin şöyle kullanabilirsiniz

$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname

En son sürümüm için lütfen UPDATE 2'yi kontrol edin

ps: bu blogu kontrol edin http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

GÜNCELLEME: yukarıdaki bağlantı kopmuş gibi görünüyor ama burada aynı makaleyi buldum http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

GÜNCELLEME 2: TAM ilerleme çubuğu ile daha da iyi bir çözüm. Bunu yapmak için 2 dahili pvseçenek kullanmanız gerekir . Biri --progressilerleme çubuğu göstermek için ve ikinci --sizeanlatmak için pvtoplam dosya ne kadar büyük.

pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES

.. sorun .gzorijinal dosya boyutundadır. Bir şekilde kendi kendine açmadan orijinal dosya boyutu bilgilerini açmanız gerekir, aksi takdirde bu dosyayı iki kez açmak için değerli zamanınızı kaybedersiniz (ilk kez pvve ikinci kez zcat). Ancak neyse ki gzip -l, gziped dosyamız hakkında sıkıştırılmamış bilgiler içeren seçeneğiniz var. Ne yazık ki tablo biçiminde var, bu yüzden kullanmadan önce çıkarmanız gerekir. Hep birlikte aşağıda görülebilir:

gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'

Uff .. Yani yapmanız gereken son şey hepsini bir araya getirmek.

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` | mysql -uuser -ppass dbname

Daha da güzelleştirmek için NAME gibi progresleri bu şekilde ekleyebilirsiniz.

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass dbname

Son sonuç:

Importing.. : [===========================================>] 100%

GÜNCELLEME 3: Hızlı kullanım için özel fonksiyon oluşturun.

mysql_import() {
  zcat $2 | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass $1
}

kullanımı:

mysql_import dbname /path/to/our/database.sql.gz

Nereye koyacağınızı bilmiyorsanız, şu cevabı okuyun: /unix//a/106606/20056

Takma adlar arasına işlev ekleyebilirsiniz. Yani örneğin ~/.bash_aliasesdosya kullanabilirsiniz .


bu harika.
dave

1
Daha iyi bir sonuç veren bir astar bu olabilir:pv --progress --name 'DB Import in progress' -tea /path/to/our/database.sql.gz | zcat | mysql -h db_host -u db_user -pdb_password db_name
Denis Pitzalis

16

Neden bu kadar karmaşık?

Bu iyi çalışıyor:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database

Çok daha basit ve daha temiz!
donquixote

7

Her zaman veritabanlarını MySql kabuğundan alırım. Bir ilerleme göstergesi sağlamaz, ancak gerçekleştirdiği eylemleri (hızlı bir şekilde) kaydırır, böylece çalıştığını biliyorum.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
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.