Le moyen le plus rapide de changer un type de données de clé indexée de table de 600 Go de INT à BIGINT

13

J'ai besoin de changer un type de données de INT en BIGINT dans une table MySQL de 600 Go. La colonne a un index unique. Je pourrais être bon avec INT non signé, mais je suppose que changer pour cela ou BIGINT sera à peu près la même douleur. Le moteur de la table est InnoDB. Quoi de plus simple:

  1. MODIFIER TABLE
  2. Copie de la structure et INSERT INTO (SELECT *)
  3. Table de vidage et modification des définitions de table de fichier de vidage
  4. Rien d'autre?

MISE À JOUR: Comme demandé, MySQL ver 5.5.15, pas de clés étrangères et créer une table:

 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
Noam
la source
Définissez la douleur, prenez le temps le plus court ...? Résultats les plus rapides?
@AlecTeal Prenez le temps le plus court
Noam
Bien que cela ne réponde pas à la question et que cette question ait été probablement discutée avant que la table ne devienne aussi grande, je chercherais également un moyen de réduire la taille de cette table.
1
Quelle version de MySQL? C'est important comme l'ont fait certaines versions ALTER TABLE ONLINE. Avez-vous des clés étrangères référençant cette colonne? Il serait utile que vous montriez la SHOW CREATE TABLE tablename;sortie.
ypercubeᵀᴹ
2
Si des noms courts sur le terrain ont permis de réduire la taille de la table, il serait de 600 MB .
Jon of All Trades,

Réponses:

2

En supposant que votre table ne comporte aucun déclencheur, vous devriez envisager de l'utiliser, pt-online-schema-changecar cela vous permettra de MODIFIER la table sans la verrouiller.

Cela prendra encore pas mal de temps compte tenu de la taille de la table.

De plus, avec cette méthode ou avec, ALTER TABLEvous devrez vous assurer que vous disposez de 600 Go d'espace disque supplémentaire pour prendre en charge deux copies de la table pendant sa reconstruction.

Ike Walker
la source
Vous avez une estimation de temps? (Je sais que cela dépend de nombreux facteurs, mais si vous deviez deviner, quelle serait la plage)
Noam
@Noam vous n'avez pas besoin de copier le tableau. Si vous utilisez Alter table, le PIRE CAS est qu'il copie, si vous utilisez un moteur mature, il se fera juste une note que tout ce qui précède (un emplacement dans un fichier ou un enregistrement) utilise int, tout ce qui post utilise bigint, jusqu'à vous optimisez.
@AlecTeal Avez-vous une référence officielle à cela?
Noam
@Noam voir ma réponse.
1
@Noam, j'estime que cela ALTER TABLEpourrait prendre de 24 à 96 heures. Vous pouvez obtenir une meilleure estimation en exécutant ALTER TABLE dans un environnement de test.
Ike Walker
2

Utiliser la boîte à outils percona pt-online-schema-changeserait mon choix en production sans affecter l'utilisation. Cela ajoutera quelques déclencheurs pour obtenir vos deltas et une table temporelle qui serait renommée après cela.

exemple:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
Binlogic DBA
la source
pt est la voie à suivre. @Noam FYI: INT-> BIGINT migration sur une table ~ 270 Go avec beaucoup de lignes sur l'instance EC2 avec une activité d'écriture assez lourde sur cette table a pris 64 heures en utilisant pt-online-schema-change.
Jakub Głazik