600 GB'lık tablo dizinli anahtar veri türünü INT'den BIGINT'e değiştirmenin en hızlı yolu


13

600GB MySQL tablosunda bir veri türünü INT BIGINT değiştirmek gerekir. Sütunun benzersiz bir dizini vardır. İmzasız INT ile iyi olabilirim, ancak buna geçmeyi ya da BIGINT'in hemen hemen aynı acı olacağını varsayıyorum. Tablonun motoru InnoDB. Daha kolay ne olabilir:

  1. TABLOYU DEĞİŞTİR
  2. Kopyalama yapısı ve INSERT INTO (SELECT *)
  3. Döküm tablosu ve döküm dosyası tablosu tanımlarını değiştirme
  4. Başka herhangi bir şey?

GÜNCELLEME: İstendiği gibi, MySQL sürüm 5.5.15, yabancı anahtar yok ve tablo oluştur:

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8

Acıyı tanımlayın, en kısa süreyi alın ....? En hızlı sonuçlar?

@AlecTeal En kısa süreyi ayırın
Noam

Her ne kadar soruyu cevaplamasa da ve bu soru muhtemelen tabloyu büyütmeden önce tartışılsa da, bu tablonun boyutunu küçültmenin bir yolunu da ararım.

1
Hangi MySQL sürümü? Bazı sürümlerde olduğu gibi önemlidir ALTER TABLE ONLINE. Bu sütuna referans veren yabancı anahtarlarınız var mı? SHOW CREATE TABLE tablename;Çıktıyı göstermeniz size yardımcı olacaktır .
ypercubeᵀᴹ

2
Kısa alan adları tablo boyutunun küçülmesine yardımcı olsaydı, 600 MB olurdu .
Tüm Ticaret'ten Jon

Yanıtlar:


2

Tablonuzda herhangi bir tetikleyici olmadığı varsayılırsa, tabloyu pt-online-schema-changekilitlemeden değiştirmenize izin vereceği için kullanmayı düşünmelisiniz .

Tablonun büyüklüğü göz önüne alındığında yine de oldukça zaman alacaktır.

Ayrıca, bu yöntemle veya ALTER TABLEsizinle birlikte yeniden oluşturulurken tablonun iki kopyasını desteklemek için 600 GB ekstra disk alanınız olduğundan emin olmanız gerekir.


Zaman tahmininiz var mı? (Ben birçok faktöre bağlıdır biliyorum, ama u tahmin etmek zorunda olsaydı, aralığı ne olurdu)
Noam

@Hayır tabloyu kopyalamanıza gerek yok. Alter tablosunu kullanırsanız, KÖTÜ DURUM kopyalanır, olgun bir motor kullanıyorsanız, daha önce herhangi bir şeyin (dosyada veya bazı kayıtlarda) int kullandığını, yazıların bigint kullandığını, optimize edersiniz.

@AlecTeal Buna resmi bir referansınız var mı?
Noam

@Noam cevabımı gör.

1
@Noam ALTER TABLEçalıştırmak için 24 - 96 saat sürebilir tahmin ediyorum . ALTER TABLE'ı bir test ortamında çalıştırarak daha iyi bir tahmin elde edebilirsiniz.
Ike Walker

2

Percona araç setini kullanmak pt-online-schema-change, kullanımı etkilemeden üretim konusunda seçimim olacaktır. Bu, deltalarınızı almak için bazı tetikleyiciler ve bu yapıldıktan sonra yeniden adlandırılacak bir geçici tablo ekleyecektir.

misal:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE

pt gidilecek yoldur. @Noam FYI: INT-> Bu tablodaki oldukça ağır yazma etkinliğine sahip EC2 örneğinde çok sayıda satır içeren ~ 270GB'lık bir tabloda BIGINT geçişi, pt-online-schema-change kullanılarak 64 saat sürdü.
Jakub Głazik
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.