Dapatkan indikator kemajuan saat mengimpor basis data MySQL

21

Saya sering mengimpor database MySQL, dan ini bisa memakan waktu cukup lama. Tidak ada indikator kemajuan apa pun. Bisakah seseorang ditampilkan, entah bagaimana? Entah catatan diimpor, MB diimpor, atau tabel diimpor ... semuanya lebih baik daripada hanya menunggu. Adakah yang tahu?

Saya menggunakan perintah ini:

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

File-file berukuran antara 40-300 MB, dan host berada dalam jaringan lokal.

Pasang kembali Monica
sumber
@ Sr_ Saya pikir pvpersis apa yang dicari si penanya. Saya baru saja menginstalnya di CentOS melalui rpmforge. Jika diberi ukuran -parameter itu bahkan akan menampilkan ETA.
Nils
pvmemang melakukan trik! Jika seseorang dapat membuat ini menjadi jawaban, saya dapat menerima ini!
Pasang kembali Monica

Jawaban:

31

Ada alat bagus yang disebut pv

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

# On Redhat/CentOS
$ sudo yum install pv

lalu mis. Anda bisa menggunakannya seperti ini

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

Silakan periksa UPDATE 2 untuk versi terbaru saya

ps: periksa blog ini http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

UPDATE: sepertinya tautan di atas rusak tetapi saya menemukan artikel yang sama di sini http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

UPDATE 2: Solusi yang lebih baik lagi dengan progress bar FULL. Untuk melakukannya, Anda perlu menggunakan 2 pvopsi bawaan. Salah satunya adalah --progressuntuk menunjukkan progress bar dan kedua adalah --sizeuntuk mengetahui pvseberapa besar keseluruhan file.

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

Masalahnya adalah dengan .gzukuran file asli. Anda perlu entah bagaimana mendapatkan informasi ukuran file asli tanpa membongkar sendiri, jika tidak, Anda akan kehilangan waktu berharga untuk membongkar file ini dua kali (pertama kali untuk pvkedua kalinya zcat). Tapi untungnya Anda memiliki gzip -lopsi yang berisi informasi yang tidak terkompresi tentang file gziped kami. Sayangnya Anda memilikinya dalam format tabel sehingga Anda perlu mengekstraksi sebelum dapat menggunakannya. Semuanya bisa dilihat di bawah ini:

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

Uff .. jadi hal terakhir yang perlu Anda lakukan hanyalah menggabungkan semuanya.

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

Untuk membuatnya lebih bagus, Anda dapat menambahkan progres NAME seperti ini

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

Hasil akhir:

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

UPDATE 3: Untuk penggunaan cepat buat fungsi kustom.

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

pemakaian:

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

Jika Anda tidak tahu di mana harus meletakkannya, baca jawaban ini: /unix//a/106606/20056

Anda dapat menambahkan fungsi di antara alias. Jadi Anda bisa menggunakan ~/.bash_aliasesfile mis .

sobi3ch
sumber
ini luar biasa.
dave
1
Satu liner dengan hasil yang lebih baik adalah ini: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

Kenapa begitu rumit?

Ini berfungsi dengan baik:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database
Vincent
sumber
Jauh lebih sederhana dan bersih!
donquixote
7

Saya selalu mengimpor database dari shell MySql. Itu tidak memberikan indikator kemajuan, tetapi itu (cepat) gulir tindakan yang dilakukannya jadi saya tahu itu berfungsi.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
George M
sumber