Menambahkan indeks sangat lambat ... apakah ada cmd mysql untuk mendapatkan ETA atau menunjukkan kemajuan?

13

Saat ini saya sedang menjalankan permintaan perubahan pada tabel saya (20 juta entri) untuk menambahkan indeks. sudah berjalan selama lebih dari 3 hari (terjebak di 'salin ke tabel tmp').

adakah cara saya bisa melihat perkembangan kueri atau dengan kata lain adakah cara saya bisa mendapatkan estimasi waktu penyelesaian?

Terima kasih.

Atai Voltaire
sumber
4
MyISAM? InnoDB? Jika InnoDB, apakah file per tabel diaktifkan?
Charles
Pertanyaan besar - hal terbaik yang dapat saya pikirkan secara instan adalah membuat tebakan kasar menggunakan ukuran file sementara dan aktual yang mentah - akan melakukan penelitian lebih lanjut
Tolong SHOW CREATE TABLE tblname\Gdi atas meja dan beri tahu kami indeks yang ingin Anda buat.
RolandoMySQLDBA

Jawaban:

3

Ketika mysql mengubah tabel, pada dasarnya membuat salinannya dan kemudian menukar salinan. Dengan cara ini jika Anda membatalkan pembaruan di tengah, tabel masih dalam kondisi stabil. Jadi Anda dapat melihat di direktori data mysql (/ var / lib / mysql /?) Untuk melihat seberapa besar file baru itu, yang akan memberi tahu Anda seberapa jauh jaraknya. Ini sedikit lebih sulit dengan Innodb, tetapi ada tabel tmp yang dibuat di suatu tempat.

Anda dapat secara signifikan mengurangi jumlah waktu yang dibutuhkan indeks dengan meningkatkan variabel penyortir sortir Anda (myisam_sort_buffer_size, sort_buffer_size). Buat itu sebesar yang Anda bisa dengan memori yang Anda miliki. Anda dapat memotong beberapa hari dari waktu modifikasi, bahkan menurunkannya menjadi beberapa jam tergantung pada berapa banyak memori yang Anda miliki. Saya telah melakukan tabel catatan 150 juta dalam waktu sekitar 3 jam.


sumber
Sayangnya saya tidak dapat menemukan meja tmp. Saya menggunakan innoDB, dengan innodb_file_per_table diatur ke OFF.
2

Karena innodb_fle_per_table OFF, Anda tidak bisa melihat tabel dan mengukur progresnya.

Saya membuat posting sebelumnya tentang bagaimana melakukan ini untuk MyISAM . Anda dapat melakukan ini untuk InnoDB jika dan hanya jika innodb_file_per_table diaktifkan dan Anda menata ulang infrastruktur InnoDB . Masih membutuhkan melihat dalam sistem operasi pada ukuran file yang dimaksud.

Setelah Anda menerapkan Pembersihan InnoDB sepenuhnya dan Anda telah mengaktifkan innodb_file_per_table, Anda mungkin ingin melakukan pembaruan indeks sebagai berikut:

CONTOH Anda memiliki yang berikut ini

  • MySQL Instance dengan / var / lib / mysql sebagai datadir
  • Tabel InnoDB dipanggil db.lotsofdatadengan 20 juta nama:

Tabelnya terlihat seperti ini:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Misalkan Anda ingin membuat indeks nama. Kamu bisa melakukan ini:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Saat INSERT berjalan, Anda masuk ke sistem operasi dan menjalankan ini:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Ini akan memberi Anda daftar ukuran saat ini lotsofdata_new.ibd. Ketika itu menjadi lebih besar dari lotsofdata.ibd, maka Anda tahu bahwa Anda hampir selesai.

BTW MariaDB memiliki Status Kemajuan yang diterapkan secara internal .

RolandoMySQLDBA
sumber
terima kasih atas tanggapan anda. untuk sekarang, saya memutuskan untuk mematikan kueri dan mencoba lagi setelah memutakhirkan ke versi mysql terakhir. semoga akan lebih lancar seperti itu.
Atai Voltaire
1

Tidak ada cara yang dapat diandalkan untuk melihat kemajuan pembuatan indeks. Jika Anda menggunakan innodb-file-per-table, Anda bisa mendapatkan beberapa indikasi dengan melihat file .ibd sementara yang sedang dibuat di direktori data dan membandingkannya dengan ukuran file saat ini, tetapi itu tidak terlalu andal, karena file data Anda saat ini dapat membengkak karena terhapus / terpecah-pecah dan file data baru akan memiliki indeks tambahan yang sebelumnya tidak Anda miliki.

Sepertinya Anda menggunakan versi MySQL tanpa plugin InnoDB terpasang. Plugin InnoDB memiliki pembuatan indeks cepat yang tidak memerlukan pembangunan kembali tabel untuk penambahan dan penghapusan indeks. Plugin InnoDB diaktifkan secara default di MySQL 5.5 dan tersedia dengan pengaturan konfigurasi di 5.1.38 dan yang lebih baru.

  • Versi MySQL apa yang Anda gunakan?

Percona Server kembali cukup (pre 5.5) memiliki InnoDB Plugin diaktifkan secara default.

Aaron Brown
sumber
0

pt-online-schema-change oleh Percona menunjukkan perkiraan waktu yang tersisa. Secara default, ia mencetak perkiraan waktu yang tersisa dan persentase kemajuan setiap 30 detik.

Ini juga memiliki fungsi tambahan dibandingkan dengan hanya menjalankan perintah ALTER dengan sendirinya.

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

Haluk
sumber