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:
- MODIFIER TABLE
- Copie de la structure et
INSERT INTO (SELECT *)
- Table de vidage et modification des définitions de table de fichier de vidage
- 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
ALTER TABLE ONLINE
. Avez-vous des clés étrangères référençant cette colonne? Il serait utile que vous montriez laSHOW CREATE TABLE tablename;
sortie.Réponses:
En supposant que votre table ne comporte aucun déclencheur, vous devriez envisager de l'utiliser,
pt-online-schema-change
car 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 TABLE
vous 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.la source
ALTER TABLE
pourrait prendre de 24 à 96 heures. Vous pouvez obtenir une meilleure estimation en exécutant ALTER TABLE dans un environnement de test.Utiliser la boîte à outils percona
pt-online-schema-change
serait 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:
la source