Volcado de Postgres de solo partes de tablas para una instantánea de desarrollo

95

En producción, nuestra base de datos tiene un tamaño de unos cientos de gigabytes. Para el desarrollo y las pruebas, necesitamos crear instantáneas de esta base de datos que sean funcionalmente equivalentes, pero que solo tengan un tamaño de 10 o 20 gigas.

El desafío es que los datos de nuestras entidades comerciales se encuentran dispersos en muchas tablas. Queremos crear algún tipo de instantánea filtrada para que solo algunos de las entidades se incluyan en el volcado. De esa manera, podemos obtener instantáneas nuevas cada mes para desarrollo y pruebas.

Por ejemplo, digamos que tenemos entidades que tienen estas relaciones de varios a varios:

  • La empresa tiene N divisiones
  • La división tiene N empleados
  • El empleado tiene N registros de asistencia

Quizás haya 1000 empresas, 2500 divisiones, 175000 empleados y decenas de millones de registros de asistencia. Queremos una forma replicable de extraer, digamos, las primeras 100 empresas y todas sus divisiones constituyentes, empleados y registros de asistencia. .

Actualmente usamos pg_dump para el esquema, y ​​luego ejecutamos pg_dump con --disable-triggers y --data-only para obtener todos los datos de las tablas más pequeñas. No queremos tener que escribir scripts personalizados para extraer parte de los datos porque tenemos un ciclo de desarrollo rápido y nos preocupa que los scripts personalizados sean frágiles y probablemente estén desactualizados.

¿Cómo podemos hacer esto? ¿Existen herramientas de terceros que puedan ayudar a extraer particiones lógicas de la base de datos? ¿Cómo se llaman estas herramientas?

¡Cualquier consejo general también se agradece!

Jonathan Peterson
fuente

Respuestas:

108

En sus tablas más grandes, puede usar el comando COPY para extraer subconjuntos ...

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

Debería considerar mantener un conjunto de datos de desarrollo en lugar de simplemente extraer un subconjunto de su producción. En el caso de que esté escribiendo pruebas unitarias, podría usar los mismos datos que se requieren para las pruebas, tratando de alcanzar todos los casos de uso posibles.

Ben
fuente
1
Usé esta técnica con gran éxito para hacer lo mismo que el OP. Para las ejecuciones de prueba, cargué COPY (SELECT ..) TO .. ​​datos restringidos en una base de datos de "plantilla" y usé CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX. Por supuesto, reduje los datos al mínimo para que la instantánea del producto cargada y las operaciones de creación de la base de datos de prueba sean lo suficientemente rápidas como para no ser un impedimento para el equipo.
Trey
5
¿Hay alguna forma de hacer que esto funcione si tiene varias tablas unidas de las que desea obtener instantáneas? COPY FROM no admite la importación de varias tablas.
mlissner
1
Tú eres el hombre ... Esto me facilita las cosas, pero con un propósito diferente. Lo usé para mover datos del esquema público al esquema específico del usuario en una aplicación de múltiples inquilinos. Gracias !
Jeremy F.
5
Tenga en cuenta que este método no actualiza las secuencias en las tablas copiadas, por lo que más inserciones pueden violar las restricciones de clave primaria.
user2859458
1
Tuve que usar en \copylugar de COPYtambién, porque este último era solo para superusuarios. Afortunadamente, todo lo demás funcionó perfectamente sin otros cambios en la 9.1.
PJSCopeland
8

No conozco ningún software que ya haga esto, pero puedo pensar en 3 soluciones alternativas. Desafortunadamente, todos requieren una codificación personalizada.

  1. Vuelva a crear todas las tablas en un esquema separado, luego copie en esas tablas solo el subconjunto de datos que le gustaría volcar, usar INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...y volcar eso.

  2. Escriba su propio script para volcar datos como declaraciones SQL. He usado este enfoque en el pasado y solo tomó alrededor de 20-30 líneas de PHP.

  3. Modifique pg_dump para que acepte una condición junto con el modificador -t al volcar una sola tabla.

Aleksander Kmetec
fuente
6

http://jailer.sourceforge.net/ hace esto.

Paul Legato
fuente
12
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si cambia la página enlazada.
talonmies
3
Eso realmente no tiene sentido aquí. El OP solicitó específicamente los nombres de las herramientas de terceros que hacen esto. Por lo tanto, la esencia de la respuesta es solo: "Hay una herramienta de terceros llamada 'Jailer' que hace esto, en esta URL". Ese enlace en sí mismo proporciona toda esa información esencial; no hay nada más que añadir. Si ese enlace deja de funcionar, se puede deducir fácilmente de la URL que "el programa se llama Jailer", por lo que sería redundante agregarlo.
Paul Legato
2
Por supuesto, el enlace ahora está roto y Google no muestra otra alternativa.
owensmartin
1
El enlace actualmente funciona para mí, y buscar en Google "postgres carcelero" también apareció en github.com/Wisser/Jailer .
Paul Legato
8
Tal vez si agrega una descripción útil del howuso de esta herramienta, podríamos entender cómo logra el objetivo
Bryan Ash