Como posso exportar um subconjunto de dados tabled de um banco de dados de produção para o meu banco de dados de testes local?


10

Temos um db: ~ 20GB baseado em postgres de produção relativamente grande. O banco de dados PostgreSQL está hospedado no heroku.

Gostaria de copiar um pequeno subconjunto dos dados da tabela no meu banco de dados local para que eu possa executar alguns testes neles sem precisar trabalhar na produção.

Eu não quero gerar dados de amostra pessoalmente, mas usar os dados que já existem no ambiente de produção.

~ 100 linhas de cada tabela no banco de dados seriam suficientes. Existe uma maneira fácil de conseguir isso?


11
Por curiosidade, por que há 20 GB de espaço em disco demais? Eu tenho 100 GB alocados no meu disco de teste na minha VM para apenas espaço de trabalho do banco de dados.
Jcolebrand

Como às vezes não carrego meu hd externo comigo, meu ssd simplesmente não fornece espaço suficiente. Além disso, eu realmente só preciso de dados de amostra do meu banco de dados e não de todo o banco de dados.
jottr

11
Justo, mas eu encorajo você a ser criativo. Considere um cartão SD para encaixar no slot SD, pois nunca tive problemas em ter mais dados :-) mas isso é péssimo: - \ meu laptop pessoal está com os últimos 10 GB gratuitos.
Jcolebrand

Respostas:



1

O carcereiro pode ajudar nessa situação. Estou trabalhando no mesmo que o seu (tentando obter ~ 100 registros de cada tabela) e aqui estão as etapas que eu fiz: - Encontre a entidade raiz (a que está associada a quase tabelas) e obtenha um subconjunto dos registros de um linha raiz (por exemplo, raiz é pessoas, procurarei todos os registros relacionados a people.id = 1 ...) - Após concluir a etapa 1, inicie novamente com outra tabela (a que você gostaria que tivesse 100 registros ) e obtenha seu subconjunto do resultado acima.


1

Outra opção é algo que eu tenho apenas recentemente se deparar (concedido, ainda estou para usá-lo, mas plano para breve): rdbms-subsetter.

É um pouco mais simples e mais leve que o Jailer, com alguns recursos / vantagens interessantes:

  • CLI tão fácil de conectar às ferramentas existentes
  • Código aberto
  • Seguirá chaves estrangeiras para buscar um subconjunto coerente de dados
    • Se você não tiver chaves estrangeiras bem definidas, os relacionamentos poderão ser fornecidos por meio de um arquivo de configuração JSON. No meu caso, pretendo gerar essa configuração a partir de metadados do esquema armazenados em outro local (obrigado, Rails: \)
  • Você pode segmentar uma linha específica e obter todos os registros relacionados (por exemplo, um cliente específico está tendo problemas, para que você possa selecionar tudo para tornar a conta de trabalho dos dados acessíveis localmente)
  • Ele pode levar um número constante de registros por tabela ou um logaritmo para obter mais dados de tabelas maiores sem exagerar.

Vale mencionar outra opção especificamente para os bancos de dados Heroku, que usei bastante (como costumava trabalhar lá).

O Heroku é realmente muito rápido em criar um novo banco de dados com instantâneo, pois ele puxa os logs write-ahead primeiro para se preparar, depois se conecta ao banco de dados principal para recuperar o atraso e para de segui-lo. Você pode criar esses "garfos" nos aplicativos para evitar afetar demais a produção:

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

Em seguida, você pode inicializar seu aplicativo apontado localmente para esse instantâneo. Eu uso isso frequentemente para executar uma migração a seco de dados ou esquemas ou depurar problemas de clientes.

Nesse comando acima, se você tiver um banco de dados acessível com DATABASE_URLon your-production-app, você terminará com um banco de dados acessível com PRODUCTION_SNAPSHOT_URL(se você especificou --as) em um aplicativo diferente chamado some-other-app-to-own-forked-database.


0

Para obter um conjunto aleatório de linhas, você pode usar LIMIT assim:

SELECT * FROM my_table LIMIT 100

Este é o mais fácil e escolherá apenas as 100 primeiras linhas que o PostreSQL encontrou. Pode ser o último 100 inserido ou talvez o primeiro 100. Se você precisar de algo realmente aleatório, veja esta resposta do Stackoverflow .


Obrigado por tentar ajudar, mas isso não responde à minha pergunta.
jottr

Eu sei como limitar minha seleção. Meu problema é que preciso de uma maneira de clonar o banco de dados do heroku com um subconjunto de seus dados; Despejar o banco de dados inteiro, conforme descrito no manual do herokus, não é uma opção.
jottr

11
@elementz - Existe um motivo para você não poder simplesmente passar por cima das tabelas e COPIAR (SELECIONAR ... LIMITE 100) PARA 'nome do arquivo' ...? Você não pode copiar para o Heroku?
Rfusca

@rfusca - Eu não sabia que COPY TO existia. Vou tentar relatar de volta.
jottr

3
@rfusca: usar um simples LIMITnão vai lidar com referências FK. Por exemplo: 100 linhas da tabela de pedidos podem conter clientes que não estão presentes ao exportar 100 linhas da tabela de clientes.
a_horse_with_no_name
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.