Eu preciso alterar um tipo de dados de INT para BIGINT em uma tabela MySQL de 600GB. A coluna possui um índice exclusivo. Eu posso ser bom com INT não assinado, mas presumo que mudar para isso ou BIGINT seja praticamente a mesma dor. O mecanismo da tabela é o InnoDB. O que seria mais fácil:
- ALTERAR A TABELA
- Copiando estrutura e
INSERT INTO (SELECT *)
- Tabela de despejo e alteração das definições da tabela de arquivo de despejo
- Algo mais?
UPDATE: Conforme solicitado, MySQL ver 5.5.15, sem chaves estrangeiras e criar tabela:
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
. Você tem chaves estrangeiras referenciando esta coluna? Ajudaria se você mostrasse aSHOW CREATE TABLE tablename;
saída.Respostas:
Supondo que sua tabela não tenha nenhum gatilho, considere usar,
pt-online-schema-change
pois permitirá ALTERAR a tabela sem travá-la.Ainda levará uma quantidade razoável de tempo, dado o tamanho da tabela.
Além disso, com esse método ou com
ALTER TABLE
você, você precisará ter 600 GB de espaço em disco extra para suportar duas cópias da tabela enquanto ela estiver sendo reconstruída.fonte
ALTER TABLE
poderia levar de 24 a 96 horas para ser executado. Você pode obter uma estimativa melhor executando o ALTER TABLE em um ambiente de teste.Usar o kit de ferramentas percona
pt-online-schema-change
seria minha escolha na produção sem afetar o uso. Isso adicionará alguns gatilhos para obter seus deltas e uma tabela temporal que renomeará depois que isso for feito.exemplo:
fonte