A maneira mais rápida de alterar um tipo de dados chave indexado em tabela de 600 GB de INT para BIGINT

12

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:

  1. ALTERAR A TABELA
  2. Copiando estrutura e INSERT INTO (SELECT *)
  3. Tabela de despejo e alteração das definições da tabela de arquivo de despejo
  4. 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
Noam
fonte
Definir dor, levar o menor tempo possível ....? Resultados mais rápidos?
@AlecTeal Tome o menor tempo possível
Noam
Embora não responda à pergunta e provavelmente tenha sido discutida antes da tabela ficar tão grande, eu também procuraria uma maneira de reduzir o tamanho dessa tabela.
1
Qual versão do MySQL? É importante como algumas versões ALTER TABLE ONLINE. Você tem chaves estrangeiras referenciando esta coluna? Ajudaria se você mostrasse a SHOW CREATE TABLE tablename;saída.
ypercubeᵀᴹ
2
Se nomes curtos de campos ajudassem a reduzir o tamanho da tabela, seria 600 MB .
Jon of All Trades

Respostas:

2

Supondo que sua tabela não tenha nenhum gatilho, considere usar, pt-online-schema-changepois 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 TABLEvocê, você precisará ter 600 GB de espaço em disco extra para suportar duas cópias da tabela enquanto ela estiver sendo reconstruída.

Ike Walker
fonte
Tem alguma estimativa de tempo? (Eu sei que depende de muitos fatores, mas se você tivesse que adivinhar, qual seria o alcance)
Noam
@ Noam, você não precisa copiar a tabela. Se você usar a tabela Alter, o PIOR CASE é que ele copia; se você estiver usando um mecanismo maduro, apenas notará que tudo antes (algum local no arquivo ou registro) usa int, qualquer coisa que postar usa bigint, até você otimiza.
@AlecTeal Você tem alguma referência formal a isso?
Noam
@ Noam, veja minha resposta.
1
@ Noam, eu estimaria que ALTER TABLEpoderia levar de 24 a 96 horas para ser executado. Você pode obter uma estimativa melhor executando o ALTER TABLE em um ambiente de teste.
Ike Walker
2

Usar o kit de ferramentas percona pt-online-schema-changeseria 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:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
DBA Binlogic
fonte
pt é o caminho a percorrer. A migração NoNo FYI: INT-> BIGINT em uma tabela de ~ 270 GB com muitas linhas na instância do EC2 com atividade de gravação bastante pesada nessa tabela levou 64 horas usando a alteração de esquema pt-online.
Jakub Głazik