it-swarm-id.com

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

Saat ini saya sedang menjalankan permintaan perubahan di meja 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.

15
Atai Voltaire

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 diperlukan oleh indeks dengan meningkatkan variabel penyortir penyortiran 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.

3
Brent Baisley

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 menyusun kembali 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 disebut db.lotsofdata Dengan 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 lebih besar dari lotsofdata.ibd, Maka Anda tahu bahwa Anda hampir selesai.

BTW MariaDB memiliki Status Kemajuan yang diimplementasikan secara internal .

2
RolandoMySQLDBA

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 terinstal. 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.

1
Aaron Brown

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

1
Haluk