Uzyskaj wskaźnik postępu podczas importowania baz danych MySQL

21

Często importuję bazy danych MySQL, co może chwilę potrwać. Nie ma żadnego wskaźnika postępu. Czy można w jakiś sposób pokazać? Zaimportowane rekordy, zaimportowane MB lub tabele… wszystko jest lepsze niż czekanie. Czy ktoś ma pomysł?

Używam tego polecenia:

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

Pliki mają rozmiar od 40 do 300 MB, a host znajduje się w sieci lokalnej.

Przywróć Monikę
źródło
@ sr_ Myślę, że pvdokładnie tego szuka pytający. Właśnie zainstalowałem go na CentOS za pośrednictwem rpmforge. Jeśli podano parametr wielkości , będzie nawet pokazywać ETA.
Nils,
pvzrobił sztuczkę! Jeśli ktoś może udzielić odpowiedzi, mogę to zaakceptować!
Przywróć Monikę

Odpowiedzi:

31

Jest ładne narzędzie o nazwie pv

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

# On Redhat/CentOS
$ sudo yum install pv

wtedy np. możesz użyć tego w ten sposób

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

Sprawdź UPDATE 2 dla mojej najnowszej wersji

ps: sprawdź ten blog http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

AKTUALIZACJA: wydaje się, że powyższy link jest uszkodzony, ale znalazłem ten sam artykuł tutaj http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

AKTUALIZACJA 2: Jeszcze lepsze rozwiązanie z PEŁNYM paskiem postępu. Aby to zrobić, musisz użyć 2 wbudowanych pvopcji. Jednym z nich jest --progress, aby wskazać pasek postępu a drugi jest --size, aby powiedzieć pv, jak duży plik jest całkowita.

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

.. problem dotyczy .gzoryginalnego rozmiaru pliku. Potrzebujesz w jakiś sposób uzyskać informacje o oryginalnym rozmiarze rozpakowanego pliku bez samodzielnego rozpakowywania, w przeciwnym razie stracisz cenny czas na dwukrotne rozpakowanie tego pliku (za pierwszym razem pvi za drugim razem zcat). Ale na szczęście masz gzip -lopcję, która zawiera nieskompresowane informacje o naszym pliku spakowanym gzipem. Niestety masz go w formacie tabeli, więc musisz go rozpakować, zanim będzie można go użyć. Wszystko razem można zobaczyć poniżej:

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

Uff ... więc ostatnią rzeczą, którą musisz zrobić, to po prostu połączyć wszystko razem.

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

Aby było jeszcze przyjemniej, możesz dodać progres NAME w ten sposób

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

Ostateczny wynik:

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

AKTUALIZACJA 3: W celu szybkiego użycia utwórz niestandardową funkcję.

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

stosowanie:

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

Jeśli nie wiesz, gdzie go umieścić, przeczytaj tę odpowiedź: /unix//a/106606/20056

Możesz dodawać funkcje między aliasami. Możesz więc użyć np ~/.bash_aliases. Pliku.

sobi3ch
źródło
to jest niesamowite.
dave
1
Jeden liner z lepszym wynikiem jest to może być to: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

Dlaczego tak skomplikowane?

Działa to dobrze:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database
Vincent
źródło
O wiele prostsze i czystsze!
donquixote
7

Zawsze importuję bazy danych z powłoki MySql. Nie zapewnia wskaźnika postępu, ale (szybko) przewija wykonywane czynności, więc wiem, że działa.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
George M.
źródło