Il modo più veloce per cambiare un tipo di dati chiave indicizzato di una tabella da 600 GB da INT a BIGINT


13

Ho bisogno di cambiare un tipo di dati da INT a BIGINT in una tabella MySQL da 600 GB. La colonna ha un indice univoco. Potrei essere bravo con INT senza segno, ma presumo che cambiarlo o BIGINT sarà praticamente lo stesso dolore. Il motore della tabella è InnoDB. Cosa sarebbe più facile:

  1. ALTER TABLE
  2. Copia della struttura e INSERT INTO (SELECT *)
  3. Tabella di dumping e modifica delle definizioni della tabella dei file di dump
  4. Qualunque altra cosa?

AGGIORNAMENTO: Come richiesto, MySQL versione 5.5.15, nessuna chiave esterna e creazione tabella:

 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

Definisci il dolore, prenditi il ​​minor tempo possibile ...? I risultati più veloci?

@AlecTeal Prenditi il ​​minor tempo possibile
Noam,

Anche se non risponde alla domanda e questa domanda è stata discussa con astuzia prima che il tavolo diventasse così grande, vorrei anche cercare un modo per ridurre le dimensioni di questo tavolo.

1
Quale versione di MySQL? È importante come alcune versioni ALTER TABLE ONLINE. Hai chiavi esterne che fanno riferimento a questa colonna? Sarebbe utile se mostrassi l' SHOW CREATE TABLE tablename;output.
ypercubeᵀᴹ

2
Se i nomi di campi brevi aiutassero a ridurre le dimensioni della tabella, sarebbero 600 MB .
Jon of All Trades,

Risposte:


2

Supponendo che il tuo tavolo non abbia trigger su di esso, dovresti considerare l'utilizzo pt-online-schema-changepoiché ti consentirà di ALTERARE il tavolo senza bloccarlo.

Ci vorrà ancora un bel po 'di tempo, date le dimensioni del tavolo.

Inoltre, con questo metodo o con ALTER TABLEte dovrai assicurarti di avere 600 GB di spazio su disco aggiuntivo per supportare due copie della tabella mentre viene ricostruita.


Hai qualche preventivo? (So ​​che dipende da molti fattori, ma se dovessi indovinare, quale sarebbe l'intervallo)
Noam

@Noam non è necessario copiare la tabella. Se usi la tabella Alter il PEGGIOR CASO è che copia, se stai usando un motore maturo, noterà solo a se stesso che qualsiasi cosa prima (qualche posizione nel file o qualche record) usa int, qualsiasi post usa bigint, fino a quando ottimizzi.

@AlecTeal Hai qualche riferimento formale a questo?
Noam,

@Noam vedi la mia risposta.

1
@Noam, stimerei che ALTER TABLEpotrebbero essere necessarie 24 - 96 ore per l'esecuzione. È possibile ottenere una stima migliore eseguendo ALTER TABLE in un ambiente di test.
Ike Walker,

2

Usare percona toolkit pt-online-schema-changesarebbe la mia scelta sulla produzione senza influire sull'uso. Ciò aggiungerà alcuni trigger per ottenere i tuoi delta e una tabella temporale che rinominerebbe dopo questo.

esempio:

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

pt è la strada da percorrere. @Noam FYI: INT-> BIGINT migrazione su una tabella di ~ 270GB con molte righe sull'istanza EC2 con attività di scrittura piuttosto pesante su questa tabella ha richiesto 64 ore usando pt-online-schema-change.
Jakub Głazik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.