Executando verificação de segurança...
5

Migrar dados de produção para desenvolvimento e homologação. Quais melhores estratégias ?

Desejo que as bases de um sistema em ambiente de desenvolvimento e de homologação sejam atualizadas diariamente, ou quando precisar imediatamente, pegando dados de produção. De preferência não a base toda. Só uma amostra, e mantendo a integridade referencial. Para uma base total que possui uns 2 Tb.

Na minha empresa, os vários sistemas possuem suas bases emaranhadas. Sendo que para cada sistema, geralmente existe só um banco para escrita, mas há vários outros bancos de outros sistemas para leitura.

Soluções adotadas no mercado:

Uma solução praticada mais comum, é por ETL onde vc personaliza a carga. Um lado negativo disso que é que vc tem que personalizar a carga e atualizar o ETL quando for feito as alterações de estruturas de banco. Ou seja, um ETL pra casa sistema (que possui um grupo de bases).

Sei que existem soluções pagas como a Delphix, que é caro demais. Mas possui as vantagens: permite gerar sandbox de dados; replicar base de produção para quantas bases quiser, inclusive uma réplica de base para cada desenvolvedor; pode gerar bases pequenas com somente parte dos dados ou base completa gastando pouco armazenamento; permite anonimizar dados.

Existem os serviços como o DMS (data migration service) da AWS, por exemplo. Mas creio que replica e sinconiza a base toda. Mas não conheço profundamente, e nem o preço.

Minhas ideias

Se eu fosse implementar um ETL que faça essa replicação, a solução que imagino deve ser flexível para funcionar para qualquer sistema considerando os seus inúmeros bancos e forma de integração entre os bancos externos (de outros sistemas).

Ex: Vamos supor que para um sistema x, eu tenho um banco/esquema (sistemax) contendo as tabelas em Oracle: 



  • sistemax.nota_fiscal,
  • sistemax.produto_nota_fiscal,
  • base_central.empresas.

Consideremos que essas tabelas estejam conectadas, mas que a tabela empresas não é uma tabela do sistema x, estando no esquema base_central.

A ordem sugerida pra popular os registros é:

  • empresas
  • produto_nota_fiscal
  • nota_fiscal

Então, supondo que quero trazer todas as notas fiscais de um dia D.



A minha solução de migração deve navegar em todas as tabelas, começando pela tabela de nota_fical, e percorrer todas as outras tabelas via seus relacionamentos, inclusive se conetar a esquemas/bancos externos, trazer os dados na ordem de hierarquia de relacionamento (tabelas pai primeiro, filhas depois). E verificar se as estruturas de origem e destino estão equivalentes.

Seria perfeito se essa solução ETL conseguisse servir pra qualquer estrutura de banco. Passando por parâmetro apenas a tabela principal e data de registro que eu quero levar, bancos de origem e bancos de destino. O resto o ETL faz automaticamente, migrando a base toda e todas suas interligações.

Surgem alguns problemas no meio do caminho: ids que já são usados em dese, o que se faz ? E os sequences de ids ?
Daria pra desativar as sequences durante a inserção em dese ? Ou a única seria migrar para uma base de dese que esteja limpa ?

Conclusão:

Existem ou outros caminhos, estratégias e ferramentas que posso usar pra fazer essas migrações ?
Se a minha ideia for praticável, que ferramenta seria a melhor pra isso (Pentaho, Python) ?

Carregando publicação patrocinada...
2

Eu sempre fiz uma cópia simples da base de dados, porém para uma base grande como você disse (2tb?) se torna inviável.

Outra preocupação que tenho é que essa cópia nua e crua do banco acaba expondo os dados sensíveis a pessoas que não deveriam ter acesso a eles, por exemplo um programador pode ter acesso ao faturamento da empresa, e até salario dos colegas caso o sistema inclua informações de RH.

Portanto eu acho que a melhor solução é criar um script de seed da base de dados que alimenta o banco com dados fake.

É claro que essa solução nem sempre adianta, pois as vezes o bug só acontece nos dados em produção, por uma situação criada por um usuário. Mas para o desenvolvimento, ajuda bastante.

2

Achei interessante a abordagem 🤔. Eu nunca tinha parado pra pensar sobre porque no final, aqui onde trabalho, usamos um backup do banco de prod localmente (importante notar que fazemos isso pois não há dados sensiveis expostos nessa base). Então basicamente, há uma rotina de backup do banco de dados de prod e conseguimos puxar esse backup e upar no nosso postgres local pra trabalhar.

Provavelmente não é aplicável pra tí porque seu banco de dados tem 2TB.

Sobre o Amazon DMS

Sei que o DMS que você comentou faz migração parcial dos dados mas o problema de garantir que todas as relações estão "completas" (e.g. vir um usuário, mas por ventura na migração não vir a relação usuário-grupo) persiste. Seria uma complexidade a mais. Pesquisei rapidinho e vc pode ver os preços aqui. Basicamente o preço é por hora de computação. O lado bom é que tem free tier, então vc pode testar de graça por até 1 ano e ver se serve pra você 😄

Sobre a solução interna de ETL

Aqui é mais meus 2 cents em relação à solução que você pensou.

Acho que fazer algo genérico demais pra se encaixar em todas as situações levaria muito tempo e é complexo demais. Talvez pensar em algo mais específico pra sua squad/time. Se você realmente precisa de todas as tabelas, aí complica um pouco, mas se não precisa, procura usar só o que realmente importa pra você. Em relação ao que o nosso amigo @eliaseas disse aqui (e realmente é importante pensar nesses dados sensíveis), incluir nesse script algo que altere as colunas sensíveis (colocar valores fictícios) pode ser uma boa também pra não precisar fazer um registro 100% fake.

Outras coisas que encontrei

Dependendo da base que vc usa, tem recursos bons pra fazer o que vc ta querendo. O Postgres mesmo tem um recurso chamado "logical replication" que basicamente serve pra fazer esse sync parcial. Você pode também usar um query com "COPY" pra selecionar o que vc quer exportar exatamente (e.g. COPY (SELECT * FROM table WHERE condition) TO '/path/to/file.csv' WITH CSV;).

1

Talvez seja melhor voce desacoplar sua solucao com um sistema de mensageira ou streaming como o RabbitMQ. dessa maneira vc consegue ter a mesma informação em vários ambientes. Ficar de olho na LGPD caso esteja tratando dados pessoais.

1
1

Bom dia,

A solução de ETL é provavelmente a que faz mais sentido. Pelo que percebi o sistema está em Oracle e existem ferramentas no mercado para ajudar nessa tarefa.
Da própria Oracle existe o "Oracle Data Integrator" ODI que permite graficamente ir construindo as tarefas de ETL, que podem ser tão complexas quanto for necessário. A ferramenta tem opções de orquestração, de gestão de fluxo desses dados e de automatição de tarefas. Ponto contra, é pago e sendo Oracle nunca é uma solução barata...
Em alternativa, existe o pentaho community edition que é muito parecido em termos de utilização com o ODI. Não tenho grande experiencia com pentaho, mas é bastante conceituado no mercado e tem a vantagem de ser gratuito na vertente community edition.

Criar uma solução de raiz, e ainda por cima o mais genérica possivel é complicado e complexo, como alguém referiu mais abaixo. Usar uma destas ferramentas ou outras equivalentes é a melhor opção.