Bagaimana saya bisa memantau kemajuan impor file .sql besar?


204

Saya mengimpor 7 GB foobar.sqluntuk mengembalikan tabel di database lokal.

$ 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

Bagaimana saya bisa memonitor perkembangannya?


1
Jawaban untuk pertanyaan ini menunjukkan ini adalah kekurangan yang jelas dari klien mysql
William Entriken

Jawaban:


267

Jika Anda hanya mengimpor dari file dump dari CLI di * nix, mis

mysql -uxxx -pxxx dbname < /sqlfile.sql

maka pertama instal pipa viewer di OS Anda kemudian coba sesuatu seperti ini:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

yang akan menampilkan bilah progres saat program berjalan.

Ini sangat berguna dan Anda juga dapat menggunakannya untuk mendapatkan perkiraan untuk kemajuan mysqldump.

pv membuang sqlfile.sqldan meneruskannya ke mysql (karena operator pipa). Saat dumping, ini menunjukkan kemajuan. Yang keren adalah bahwa mysql mengambil data hanya secepat itu dapat memajukannya, jadi pv dapat menunjukkan kemajuan impor. Saya tidak punya bukti. Tapi sepertinya begitu. Saya kira ada beberapa buffer yang digunakan, tetapi pada beberapa titik saya pikir mysqltidak membaca data lagi ketika masih diproses.

Tangkapan layar Pipe Viewer


1
Saya akan menebak bahwa mysql mungkin memiliki buffer, di mana beberapa data dapat disalurkan, tanpa sepenuhnya "diproses" (yaitu jika kesalahan keluar, pv mungkin telah sedikit over-melaporkan apa yang sebenarnya masuk). Tetapi secara umum, ini adalah cara kerja pipa. Itu alasan yang sama yang dapat Anda lakukan sudo hd /dev/sda1 | lessdan tidak memiliki seluruh partisi sistem Anda dalam memori.
snapfractalpop

2
@snapfractalpop pvtidak akan terlalu akurat dalam banyak kasus karena beberapa potongan SQL akan membutuhkan waktu lebih lama untuk diproses daripada yang lain. Baris yang merupakan sisipan sederhana akan berjalan jauh lebih cepat daripada yang dibuat pada indeks pada tabel yang sudah memiliki banyak baris, misalnya. Tetapi gagasan kasar tentang kemajuan, output harus membantu kecuali jika buffer baca yang digunakan mysqlsangat besar (untuk input 7Gb, buffer harus sangat besar untuk membuat pvoutput tidak berguna sama sekali
David Spillett

1
@ David Spillett memang. Komentar Anda mencerminkan sentimen saya. Pada dasarnya, pv mentah, tetapi efektif. Yang paling saya sukai tentangnya adalah seberapa umum itu. Itulah keindahan pipa unix (terima kasih McIlroy).
snapfractalpop

1
@rob Ini adalah teman yang luar biasa, bisakah Anda juga memberikan contoh mysqldump?
Josue Alexander Ibarra

Solusi yang sangat bagus! Jika kata sandinya manual, pv tidak menunggunya untuk menampilkan progresnya
Pierre de LESPINAY

27

Jika Anda sudah memulai impor, Anda dapat menjalankan perintah ini di jendela lain untuk melihat ukuran database Anda saat ini. Ini dapat membantu jika Anda mengetahui ukuran total file .sql yang Anda impor.

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;  

Kredit untuk: http://forums.mysql.com/read.php?108,201578,201578


The MySQL 8.0 Referensi negara berikut tentang akurasi:

DATA_LENGTH

Untuk MyISAM, DATA_LENGTH adalah panjang file data, dalam byte.

Untuk InnoDB, DATA_LENGTH adalah perkiraan jumlah memori yang dialokasikan untuk indeks berkerumun, dalam byte. Secara khusus, ini adalah ukuran indeks berkerumun, di halaman, dikalikan dengan ukuran halaman InnoDB.

 

INDEX_LENGTH

Untuk MyISAM, INDEX_LENGTH adalah panjang file indeks, dalam byte.

Untuk InnoDB, INDEX_LENGTH adalah perkiraan jumlah memori yang dialokasikan untuk indeks non-cluster, dalam byte. Secara khusus, ini adalah jumlah ukuran indeks non-cluster, di halaman, dikalikan dengan ukuran halaman InnoDB.


Meja saya sekarang di 12 GiB sesuai dengan perintah dari jawaban ini, dan masih mengimpor. File sqldump saya hanya 5 GiB. Saya akan tertarik dengan penjelasan untuk perbedaan ini
lucidbrot

17

Saat Anda menjalankan mysqldump dari satu basis data, semua tabel ditumpuk dalam urutan abjad.

Secara alami, reload mysqldump ke dalam basis data juga dalam urutan abjad.

Anda bisa melakukan PROSES SHOW; dan temukan Koneksi DB yang menjalankan mysqldump. Ketika dump dimuat, Koneksi DB akan hilang.

Jika Anda ingin tahu tabel apa yang ada di dumpfile, jalankan ini terhadap foobar.sql

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

UPDATE 2012-05-02 13:53 EDT

Maaf karena tidak memperhatikan bahwa hanya ada satu meja.

Jika tabelnya adalah MyISAM, satu-satunya cara untuk memantau adalah dari sudut pandang OS. Alasannya? Tabel ini dikunci pada seluruh isi ulang. apa yang kamu cari? Ukuran file .MYDdan .MYI. Tentu saja, Anda perlu membandingkannya dengan ukuran tabel sebelumnya di server DB lain yang Anda impor.

Jika tabelnya adalah InnoDB dan Anda telah mengaktifkan innodb_file_per_table , satu-satunya cara untuk memantau adalah dari sudut pandang OS. Alasannya? Tabel ini dikunci pada seluruh isi ulang. apa yang kamu cari? Ukuran .ibdfile. Tentu saja, Anda perlu membandingkannya dengan ukuran tabel sebelumnya di server DB lain yang Anda impor.

Jika tabelnya adalah InnoDB dan Anda telah menonaktifkan innodb_file_per_table , bahkan sudut pandang OS pun tidak bisa membantu.

UPDATE 2012-05-02 13:56 EDT

Saya membahas sesuatu seperti ini tahun lalu: Bagaimana cara saya mendapatkan% kemajuan untuk "type db.sql | mysql"

UPDATE 2012-05-02 14:09 EDT

Karena mysqldump standar menulis-mengunci tabel seperti ini:

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;

kemudian, tidak ada cara untuk mendapatkan kemajuan dari dengan mysql sampai kunci tabel dilepaskan.

Jika Anda bisa mendapatkan LOCK TABLESdan UNLOCK TABLESberkomentar keluar dari dumpfile ...

  • jika tabelnya adalah MyISAM, SELECT COUNT (*) akan berfungsi
  • jika tabelnya InnoDB, SELECT COUNT (*) mungkin akan memperlambat / menghentikan beban sampai hitungan selesai

Itu berhasil. Terima kasih. Satu pertanyaan terakhir adalah, berdasarkan pengalaman, apakah Anda tahu jika waktu impor kira-kira linier sehubungan dengan .MYDdan .MYIukuran file?
qazwsx

1
Reload tabel linear. Pembangunan kembali indeks bersifat linier. Bertahun-tahun yang lalu, itu tidak seperti saya memberanikan diri ini sebagai pertanyaan ke MySQL ( lists.mysql.com/mysql/202489 ) dan saya menyebutkannya di DBA StackExchange ( dba.stackexchange.com/a/2697/877 )
RolandoMySQLDBA

8

Setiap 2 detik Anda akan melihat proses berjalan.

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

Jika Anda menginginkannya lebih jarang maka tambahkan di -n xmana x adalah jumlah detik. 5 detik adalah:

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

Bisakah Anda memposting contoh output? Juga, apakah itu hanya menunjukkan proses atau apakah itu benar-benar menunjukkan kemajuan impor, yang sebenarnya saya minta?
qazwsx

Ini adalah kode yang sangat membantu. Terima kasih
NarayaN

6

Jika Anda hanya ingin memeriksa apakah macet, Anda dapat meminta

show processlist; 

dan lihat apa yang sedang dieksekusi.


5

Sebagai solusi untuk seseorang yang tidak bisa mendapatkan pv untuk bekerja atau untuk siapa pv berbohong. Anda dapat memonitor ukuran file ibdata1 di / var / lib / mysql yang berisi data. Ini akan berakhir dengan ukuran yang sama (atau sekitar) dari filesize di server sumber Anda.

Jika ada banyak tabel, Anda juga dapat melihatnya muncul satu per satu di / var / lib / mysql / <database name>.

Saya kebetulan menggunakan fakta ini baru-baru ini ketika database jangka panjang telah membangun file log sekitar 20G selama tiga atau empat tahun. Saya perhatikan pemindahan itu memakan waktu lama dan menggunakan teknik ini untuk memantau kemajuan.

Saya pikir sangat tidak mungkin bahwa hari akan subuh ketika database tidak melibatkan file di suatu tempat atau lainnya. Sementara itu, Anda dapat memonitor file untuk melihat bagaimana kemajuan transfer. Metode yang saya sarankan adalah sesuatu yang bisa Anda lakukan dalam satu atau lain bentuk sejak database sql pertama ditulis. Saya tidak pernah berniat untuk menyarankan bahwa itu adalah jenis teknik "resmi" mana joki manual bisa jatuh kembali. Ini mengasumsikan tingkat kemahiran umum dengan komputer pada umumnya dan unix pada khususnya.


2

Jika DB Anda tenang (artinya tidak ada pengguna lain yang aktif) dan Anda hanya ingin melihat aktivitas baca / tulis, mengapa tidak melakukan sesuatu seperti:

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

Anda akan melihat jumlah membaca / menulis / memasukkan / menunggu / pembaruan.

Jika Anda memasukkan misalnya, Anda akan melihat sesuatu seperti:

Innodb_rows_inserted                          | 28958 

Di mana 28.958 adalah jumlah baris yang dimasukkan untuk interval Anda (10 detik dalam kasus saya).


1

Untuk seseorang yang mencari contoh penampil pipa menggunakan mysqldumpAnda hanya akan melakukan sesuatu seperti ini:

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

The -Wbendera hanya memberitahu pv menunggu byte pertama datang sebelum menunjukkan kemajuan (setelah prompt)



0

Ok, pekerjaan lain di sekitar. Tapi itu mungkin pilihan yang terburuk dan tidak akurat.

Yang mengatakan, inilah solusi saya untuk Windows:

Buka Task Manager dengan menekan

CTRL + SHIFT + ESC

Salin kecepatan nilai disk "mysqld.exe"

e.g. 11mb/s

Masukkan itu ke dalam kalkulator seperti ini: https://techinternets.com/copy_calc?do

Perkirakan ETA. Kasus saya adalah:

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

Hasil:

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

-1

Saya sangat terkejut tidak ada yang hanya memposting 'mysql -v' sebagai opsi. Jika macet, output akan berhenti.


3
"Memantau kemajuan" biasanya berarti mencoba memperkirakan sejauh mana proses telah berkembang atau kapan akan selesai, yang mysql -vtidak akan menawarkan. Selain itu, memuntahkan data 7 GB ke terminal akan secara signifikan memperlambat pemulihan.
mustaccio

Begitu ya, terima kasih atas penjelasannya. itu benar, output 7 GB tidak akan baik untuk output ke terminal. Saya kira saya menggunakan -v hanya untuk test case lokal kecil di mana db saya hanya akan macet.
dtc

2
Saran ini membantu saya menunjukkan masalah, namun tidak praktis untuk digunakan dengan file besar. (Punyaku kecil).
Casey Perkins
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.