Tenho uma tabela com cerca de 6.000.000 de registros. É feito backup a cada poucas horas. Recentemente, um script executado em cascata atualizou cerca de 2.000.000 dos registros mais antigos para valores inválidos. Eu extraí esses 2.000.000 registros do backup e os tenho prontos para reinserir, na forma de "INSERT INTO table (col, col) values (val, val)"
Agora, preciso de um mecanismo para inserir esses 2.000.000 registros, substituindo os dados inválidos pelos dados históricos, mantendo os IDs existentes (o que significa que REPLACE não é uma opção - pois exclui em duplicata e incrementa o ID). Além disso, preciso fazer isso sem interromper o acesso ao servidor por muito tempo (o que significa DROP TABLE, então --force trickery não é uma opção).
Tenho certeza de que estou perdendo alguma coisa, mas não consigo descobrir como substituir no local dentro dos parâmetros atuais. Pensamentos?
Usar INSERT (SELECT)...ON DUPLICATE KEY UPDATE deve permitir que você visite essas linhas e atualize-as com os valores originais. Além disso, você não está correto sobre REPLACE. Este é o mecanismo usado pelo pt-table-sync para corrigir o desvio de dados. A documentação detalha um REPLACE == DELETE AND INSERT, mas isso não é feito dentro do escopo de AUTO_INC.
Acho que você esperava ver algo como abaixo, mas esse não é o comportamento.
Mas isso não acontece como você pode ver de cima.