Büyük tabloyu MyISAM'den Innodb'a dönüştürme


10

Innodb dönüştürmek istiyorum MyISAM formatında yaklaşık 300M satır içeren bir tablo var

Benim asıl amacım, tablo şemasını daha basit dizinlere sahip olacak şekilde değiştirerek kullanımı azaltmaktı. Tüm masayı döktüm, düşürdüm, daha az endeksle yeniden oluşturdum ve şimdi yeniden içe aktarıyorum. Ancak, myisam yerine innodb olması gerektiğini unuttum.

Standart ALTER TABLOSU'nu yapabilir miyim ... MOTOR = INNODB? Böyle muazzam bir masada dikkat etmem gereken özel bir şey var mı?

Veri içe aktarma işlemi yaklaşık 12 saat sürüyor - bunu tekrar yapmaktan nefret ediyorum. Bu yüzden sadece dönüştürmek istiyorum.


300M sıralarıyla, MyISAM muhtemelen bu boyuttaki bir tablo için daha hızlı ve daha iyi bir uyum!
Mark Henderson

Yanıtlar:


14

Aşağıdaki çalışma " Yüksek Performanslı MySQL, İkinci Baskı " kitabından çıktı .

Bu mükemmel bir kitap ve herkese tavsiye ederim.

Kısa cevap:

Masa boyutunuz ve koşullarınızla, hangi yöntemi seçerseniz seçin, potansiyel olarak uzun süre beklediğinizi düşünüyorum.


Tablo Dönüşümleri

Bir tabloyu bir depolama motorundan diğerine dönüştürmenin, her birinin avantajları ve dezavantajları olan birkaç yolu vardır.

TABLOYU DEĞİŞTİR

mysql> ALTER TABLE mytable ENGINE = Falcon;

Bu sözdizimi tüm depolama motorları için çalışır, ancak bir yakalama vardır: çok zaman alabilir. MySQL, eski tablonuzun satır satır kopyasını yeni bir tabloya uygulayacaktır. Bu süre zarfında, muhtemelen sunucunun tüm disk G / Ç kapasitesini kullanırsınız ve dönüştürme işlemi sırasında orijinal tablo okuma kilitlenir.

Döküm ve içe aktarma

Dönüştürme işlemi üzerinde daha fazla denetim sahibi olmak için, önce mysqldump yardımcı programını kullanarak tabloyu bir metin dosyasına dökmeyi seçebilirsiniz. Tabloyu döktükten sonra, içerdiği CREATE TABLE ifadesini ayarlamak için döküm dosyasını düzenleyebilirsiniz. Tablo türünü ve türünü değiştirdiğinizden emin olun, çünkü farklı türlerde olsalar bile aynı veritabanında aynı ada sahip iki tablonuz olamaz ve mysqldump, CREATE TABLE'dan önce bir DROP TABLE komutu yazmayı varsayılan olarak kullanır , bu yüzden dikkatli değilseniz verilerinizi kaybedebilirsiniz!

OLUŞTUR ve SEÇ

Üçüncü dönüşüm tekniği, birinci mekanizmanın hızı ile ikincisinin güvenliği arasında bir uzlaşmadır. Tüm tabloyu boşaltmak veya hepsini bir kerede dönüştürmek yerine, yeni tabloyu oluşturun ve aşağıdaki gibi doldurmak için MySQL'in INSERT ... SELECT sözdizimini kullanın:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Çok fazla veri yoksa, bu iyi çalışır, ancak eğer yaparsanız, tabloyu kademeli olarak doldurmak, her yığın arasındaki işlemi gerçekleştirerek geri alma günlüklerinin çok fazla büyümemesi genellikle daha etkilidir. Bu kimliğin birincil anahtar olduğunu varsayarsak, tüm verileri yeni tabloya kopyalayana kadar bu sorguyu tekrar tekrar çalıştırın (her seferinde daha büyük x ve y değerlerini kullanarak):

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Bunu yaptıktan sonra, işiniz bittiğinde bırakabileceğiniz orijinal tablo ve şimdi tamamen doldurulmuş yeni tablo ile kalacaksınız. Verilerin tutarsız bir kopyasını almayı önlemek için gerekirse orijinal tabloyu kilitlemeye dikkat edin!


2

ALTER TABLE deyimi esasen aynı şeyi yapar: sunucu, tüm satırları kopyaladığı ve daha sonra bir RENAME yaptığı geçici bir tablo oluşturur. Diskteki formatlar InnoDB ve MyISAM arasında son derece farklıdır, bu yüzden bunun için herhangi bir kısayol bulmanızı beklemiyorum.

Başka bir açıklama (farkında olabilirsiniz, ancak başkalarının bunu okumasına yardımcı olur): InnoDB için disk formatı, birincil anahtara bağımlıdır, çünkü kayıtları buna dayalı olarak kümeler. Bu nedenle, büyük InnoDB tablolarıyla çalışırken, birincil anahtarı seçmeden önce iki kez düşünün, çünkü değiştirmek, eldeki sorun gibi tüm tabloyu yeniden oluşturur.

Her neyse, önce orta boyutlu bir masa üzerinde birkaç test yapmanızı ve bunları zamanlamanızı öneriyorum.


2
MySQL'deki (ve dizin ekleme içeren) herhangi bir tablo değiştirme işlemi tabloyu yeniden oluşturur.
David Pashley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.