Eu preciso sincronizar uma tabela grande ~ 500 milhões de linhas sem uma chave primária entre o SQL Server e o MySQL. A tabela possui apenas um índice não exclusivo composto em cluster.
Eu tenho uma conexão ODBC entre os servidores, mas uma importação de ~ 8 milhões de linhas levou cerca de 45 minutos; portanto, acredito que uma importação única maior não seria razoável, pois podem ocorrer interrupções a qualquer momento. Não consigo alterar a estrutura da tabela existente, posso adicionar outras tabelas. Após uma leitura mais aprofundada, o deslocamento / busca não é uma opção para tabelas grandes. "Selecionar ... onde x entre ... e ..." não é uma opção, pois não tenho uma chave exclusiva.
Como posso exportar a tabela em lotes com garantia de conter todas as linhas? Meu problema é que, como a chave em cluster não é exclusiva, ordenar depois não garantiria que as linhas físicas tenham a mesma ordem entre consultas consecutivas e ordenar depois que todas as colunas levariam muito tempo. E como você recomendaria migrar os lotes por meio de arquivos ODBC ou CSV?
fonte
Respostas:
Supondo que você não tenha atualizações ou exclusões na tabela de origem, tente o seguinte:
1. Faça uma cópia da tabela existente usando a sintaxe CTAS (para SQLServer é
SELECT * into source_table_copy FROM source_table
). Essa operação é muito rápida, mesmo para mesas enormes.2. Adicione um
after insert
gatilho parasource_table
copiar novos registros parasource_table_copy
.3. Agora, quando todos os novos registros
source_table
entraremsource_table_copy
também, e você pode mover os dados da tabela copiada para o Mysql em lotes. Por exemplo, se você tiver um link entre 2 servidores, tudo poderá ser feito dentro do corpo do procedimento armazenado TSQL.Por exemplo, um pedaço de código que move até 20 registros para o novo servidor pode parecer
Também é possível usar CURSOR para ler dados e depois excluir com a
where current of
cláusula.** Idealmente, você precisa impedir que os aplicativos insiram dados
source_table
durante a etapa 1. Se for absolutamente impossível, irei com umafter insert
gatilho que é adicionado logo antes da etapa 1 e removido logo após o término, que copia os dados para outra tabela que puder depois mesclar comsource_table_copy
.fonte