Estou configurando a replicação de uma instância externa do MySQL para RDS .
Tanto a instância externa do MySQL quanto o RDS executam o MySQL 5.7.10.
Eu segui o procedimento, mas ao despejar o banco de dados mysqldump
e enviá-lo para mysql
conectado ao RDS, recebo o seguinte erro:
ERRO 1215 (HY000) na linha 2081: Não é possível adicionar restrição de chave estrangeira
SHOW ENGINE InnoDB STATUS
nos programas RDS:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2016-03-25 01:38:56 0x2ad07ddcf700 Error in foreign key constraint of table db/Prospect:
FOREIGN KEY (`restaurantId`) REFERENCES `Restaurant` (`id`),
CONSTRAINT `FK_Prospect_Zone` FOREIGN KEY (`zoneId`) REFERENCES `Zone` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18292 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci:
Cannot resolve table name close to:
(`id`),
CONSTRAINT `FK_Prospect_Zone` FOREIGN KEY (`zoneId`) REFERENCES `Zone` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18292 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
OK, de fato o arquivo dump recria as tabelas em ordem alfabética, então a Prospect
tabela aparece antes Restaurant
e Zone
, o que pode explicar o erro.
Mas NÃO, porque mysqldump
adiciona SET FOREIGN_KEY_CHECKS=0
ao topo do arquivo, então deve funcionar de qualquer maneira.
Então, decidi testá-lo em uma instalação vanilla do MySQL 5.7 e, sem surpresa, o dump é importado com sucesso com exatamente os mesmos comandos.
O que causa esse erro especificamente no RDS e como evitá-lo?
Acabei de descobrir que esse era um bug que foi corrigido na próxima versão, MySQL 5.7.11.
Extraia do changelog:
Levei tempo para descobrir que o índice de texto completo era a origem do problema, tive que cortar meu arquivo de despejo linha por linha até que o despejo pudesse ser importado com sucesso.
Infelizmente, o RDS ainda não oferece suporte ao MySQL 5.7.11, então tive que contornar esse problema. Aqui está o que eu fiz:
mysqldump
como de costumeFULLTEXT KEY
linhasALTER TABLE
instruções para adicionar cada índice de texto completo que eu tinha em meu bloco de notas de volta à sua tabelaIsso funcionou perfeitamente bem e minhas tabelas estão totalmente sincronizadas agora.