Como você faz alterações de esquema em um banco de dados ativo sem tempo de inatividade?
Por exemplo, digamos que eu tenha um banco de dados PostgreSQL com uma tabela que inclua vários dados do usuário, como endereços de e-mail etc., todos associados a usuários específicos. Se eu quisesse mover os endereços de email para uma nova tabela dedicada, precisaria alterar o esquema e migrar os dados do email para a nova tabela. Como isso pode ser feito sem interromper as gravações na tabela original? Certamente, enquanto os dados são gravados da tabela antiga para a nova, novos dados continuam sendo gravados na tabela antiga e perdidos, certo?
Acho que esse problema surge com bastante frequência, mas não consigo encontrar nenhuma solução padrão para lidar com ele.
Este artigo lida com o problema, mas eu realmente não entendi a etapa 3. Ele diz para gravar nas duas tabelas e migrar os dados antigos da primeira para a nova. Como você garante que está migrando apenas dados antigos?
(Eu uso o PostgreSQL no Heroku .)
fonte
Respostas:
Você quase já tem sua resposta:
Quanto à etapa 3 , use algo como isto (em uma transação):
Insira o que ainda não existe:
Atualize o que mudou nesse meio tempo:
Novos dados não serão tocados, porque são idênticos nos dois lugares.
fonte