¿Cómo puedo exportar un subconjunto de datos de tabla de una base de datos de producción a mi base de datos de prueba local?


10

Tenemos una producción relativamente grande basada en postgres db: ~ 20GB. La base de datos PostgreSQL está alojada en heroku.

Me gustaría copiar un pequeño subconjunto de los datos de la tabla a mi base de datos local para poder ejecutar algunas pruebas en ellos sin tener que trabajar en la producción.

No quiero generar datos de muestra yo mismo, sino utilizar los datos que ya existen en el entorno de producción.

~ 100 filas de cada tabla en la base de datos serían suficientes. ¿Hay una manera fácil de lograr esto?


1
Solo por curiosidad, ¿por qué 20 GB es demasiado espacio en disco? Tengo 100 GB asignados en mi disco de prueba en mi máquina virtual para solo el espacio de rascado de la base de datos.
jcolebrand

Como a veces no llevo mi disco duro externo conmigo, mi ssd simplemente no proporciona suficiente espacio. Además, realmente solo necesito datos de muestra de mi base de datos, y no toda la base de datos.
jottr

1
Es justo, pero te animo a que seas creativo. Considere una tarjeta SD para caber en la ranura SD, ya que nunca he tenido un problema con tener más datos :-) pero eso apesta: - \ mi computadora portátil personal se reduce a sus últimos 10GB gratis.
jcolebrand

Respuestas:



1

El carcelero puede ayudar en esta situación. Estoy trabajando en el mismo que el suyo (tratando de obtener ~ 100 registros de cada tabla) y estos son los pasos que hice: - Busque la entidad raíz (la que está asociada con casi tablas) y obtenga un subconjunto de los registros de un fila raíz (por ejemplo, la raíz es personas, luego buscaré todos los registros relacionados con people.id = 1 ...) - Después de finalizar el paso 1, comience nuevamente con otra tabla (la que le gustaría tener 100 registros ) y obtenga su subconjunto del resultado anterior.


1

Otra opción es algo que he encontrado recientemente (de acuerdo, sin embargo, yo estoy a usarlo, pero el plan de pronto): rdbms-subsetter.

Es un poco más simple y ligero que Jailer, con algunas características / ventajas agradables:

  • CLI tan fácil de conectar a herramientas existentes
  • Fuente abierta
  • Seguirá claves foráneas para obtener un subconjunto de datos coherente
    • Si no tiene claves externas bien definidas, las relaciones se pueden proporcionar a través de un archivo de configuración JSON. En mi caso, planeo generar esta configuración a partir de metadatos de esquema almacenados en otro lugar (gracias, Rails: \)
  • Puede apuntar a una fila específica y obtener todos los registros relacionados (por ejemplo, un cliente específico tiene problemas, por lo que puede desplegar todo para que los datos de trabajo de su cuenta sean accesibles localmente)
  • Puede tomar un número constante de registros por tabla o tomar un logaritmo para obtener más datos de tablas más grandes sin exagerar.

Vale la pena mencionar otra opción para las bases de datos de Heroku específicamente, que he usado mucho (como solía trabajar allí).

Heroku en realidad es bastante rápido en traer una nueva base de datos instantánea, ya que primero extrae los registros de escritura anticipada para prepararse, luego se conecta a la base de datos primaria para ponerse al día y luego deja de seguirla. Puede crear estos "tenedores" en todas las aplicaciones para evitar afectar demasiado la producción:

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

Luego, puede iniciar su aplicación localmente apuntando a esa instantánea. Utilizo esto con frecuencia para hacer una ejecución en seco de migraciones de datos o esquemas o depurar problemas de clientes.

En ese comando anterior, si tiene un DB accesible con DATABASE_URLactivado your-production-app, terminará con un DB accesible con PRODUCTION_SNAPSHOT_URL(si lo especificó --as) en una aplicación diferente llamada some-other-app-to-own-forked-database.


0

Para obtener un conjunto aleatorio de filas, puede usar LIMIT así:

SELECT * FROM my_table LIMIT 100

Esta es la más fácil y solo elegirá las 100 primeras filas que encontró PostreSQL. Puede ser el último 100 insertado o quizás el 100 primero. Si necesita algo realmente aleatorio, mire esta respuesta de Stackoverflow .


Gracias por intentar ayudar, pero esto no responde a mi pregunta.
jottr

Sí sé cómo limitar mi selección. Mi problema es que necesito alguna forma de clonar el db de heroku con un subconjunto de sus datos; Volcar todo el db como se describe en el manual de herokus no es una opción.
jottr

1
@elementz - ¿Hay alguna razón por la que no puedas simplemente pasar las tablas y COPIAR (SELECCIONAR ... LÍMITE 100) A 'nombre de archivo' ...? ¿No puedes COPIAR A en Heroku?
rfusca

@rfusca - No sabía que COPY TO existía. Intentaré informar de nuevo.
jottr

3
@rfusca: el uso de un simple LIMITno se ocupará de las referencias de FK. Por ejemplo: 100 filas de la tabla de pedidos pueden contener clientes que no están presentes al exportar 100 filas de la tabla de clientes.
a_horse_with_no_name
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.