Em produção, nosso banco de dados tem algumas centenas de gigabytes de tamanho. Para desenvolvimento e teste, precisamos criar instantâneos desse banco de dados que sejam funcionalmente equivalentes, mas que tenham apenas 10 ou 20 GB de tamanho.
O desafio é que os dados de nossas entidades de negócios estão espalhados por muitas tabelas. Queremos criar algum tipo de instantâneo filtrado para que apenas algumas das entidades sejam incluídas no dump. Dessa forma, podemos obter novos instantâneos a cada mês ou mais para desenvolvimento e teste.
Por exemplo, digamos que temos entidades que têm esses relacionamentos muitos para muitos:
- Empresa tem N divisões
- Divisão tem N Funcionários
- O funcionário tem N registros de frequência
Existem talvez 1.000 empresas, 2.500 divisões, 175.000 funcionários e dezenas de milhões de registros de atendimento. Queremos uma maneira replicável de obter, digamos, as primeiras 100 empresas e todas as suas divisões constituintes, funcionários e registros de frequência .
Atualmente usamos o pg_dump para o esquema, e então executamos o pg_dump com --disable-triggers e --data-only para obter todos os dados das tabelas menores. Não queremos ter que escrever scripts personalizados para extrair parte dos dados porque temos um ciclo de desenvolvimento rápido e estamos preocupados que os scripts personalizados sejam frágeis e provavelmente desatualizados.
Como podemos fazer isso? Existem ferramentas de terceiros que podem ajudar a extrair partições lógicas do banco de dados? Como são chamadas essas ferramentas?
Qualquer conselho geral também será apreciado!
fonte
\copy
vez deCOPY
também, porque o último era apenas para superusuário. Felizmente, tudo funcionou perfeitamente sem outras alterações no 9.1.Não conheço nenhum software que já faça isso, mas posso pensar em 3 soluções alternativas. Infelizmente, todos eles exigem alguma codificação personalizada.
Recrie todas as tabelas em um esquema separado e, em seguida, copie nessas tabelas apenas o subconjunto de dados que você gostaria de despejar, usando
INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...
e despejando isso.Escreva seu próprio script para despejar dados como instruções SQL. Eu usei essa abordagem no passado e levou apenas cerca de 20-30 linhas de PHP.
Modifique o pg_dump para que ele aceite uma condição junto com a opção -t ao despejar uma única tabela.
fonte
http://jailer.sourceforge.net/ faz isso.
fonte
how
como usa essa ferramenta, possamos entender como ela atinge a meta