Fondo
Me gustaría proporcionar el subconjunto de mi base de datos requerido para reproducir una select
consulta. Mi objetivo es hacer que mi flujo de trabajo computacional sea reproducible (como en la investigación reproducible ).
Pregunta
¿Hay alguna manera de que pueda incorporar esta declaración de selección en un script que vuelca los datos consultados en una nueva base de datos, de modo que la base de datos se pueda instalar en un nuevo servidor mysql, y la declaración funcionaría con la nueva base de datos? La nueva base de datos no debe contener registros además de los que se han utilizado en la consulta.
Actualización: para aclarar, no estoy interesado en un volcado csv de resultados de consultas. Lo que necesito hacer es volcar el subconjunto de la base de datos para que pueda instalarse en otra máquina, y luego la consulta en sí puede ser reproducible (y modificable con respecto al mismo conjunto de datos).
Ejemplo
Por ejemplo, mi análisis podría consultar un subconjunto de datos que requiere registros de varias tablas (en este ejemplo 3):
select table1.id, table1.level, table2.name, table2.level
from table1 join table2 on table1.id = table2.table1_id
join table3 on table3.id = table2.table3_id
where table3.name in ('fee', 'fi', 'fo', 'fum');
Respuestas:
mysqldump tiene la --donde opción de ejecutar una cláusula WHERE de una tabla dada.
Aunque no es posible mysqldump una consulta de unión, puede exportar filas específicas de cada tabla para que cada fila obtenida de cada tabla participe en la unión más adelante.
Para su consulta dada, necesitaría mysqldump tres veces:
Primero, mysqldump todas las filas de table3 con nombre en ('tarifa', 'fi', 'fo', 'fum'):
A continuación, mysqldump todas las filas de table2 que tienen valores de table3_id coincidentes del primer mysqldump:
Luego, mysqldump todas las filas table1 que tienen valores table1_id coincidentes del segundo mysqldump:
Nota: Dado que el segundo y tercer mysqldumps requieren el uso de más de una tabla, se debe usar --lock-all-tables .
Crea tu nueva base de datos:
Finalmente, cargue los tres mysqldumps en otra base de datos e intente unirse allí en la nueva base de datos.
En el cliente mysql, ejecute su consulta de unión
Darle una oportunidad !!!
ADVERTENCIA: ¡Si no se indexa correctamente, el segundo y tercer mysqldumps pueden durar para siempre!
Por si acaso, indexe las siguientes columnas:
Asumiré que id es la clave principal de table3.
fuente
--where
cláusula en la documentación; te haré saber cómo funciona esto después de que tenga la oportunidad de probarlo.Consideraría usar un 'outfile' como parte de su SELECT en lugar de mysqldump para resolver este problema. Puede producir cualquier instrucción SELECT que desee y luego agregar "INTO OUTFILE '/path/to/outfile.csv' ..." al final con la configuración adecuada para la salida de estilo CSV. Luego, simplemente puede usar algo como la sintaxis ' CARGAR DATOS DE ARCHIVO ...' para cargar los datos en su nueva ubicación de esquema.
Por ejemplo, usando tu SQL:
Tenga en cuenta que necesitará suficiente espacio de almacenamiento disponible en la partición del disco de destino.
fuente
Load Data Infile
para cargar ese .csv en esa nueva base de datos. Ahora, la consulta se puede ejecutar.La utilidad mysqldump tiene una opción --tables que le permite especificar qué tablas volcar. Le permite especificar la lista de tablas.
No conozco ninguna forma más fácil (automatizada).
fuente
delete from table1 where id not in (.....);
, si esa es la forma más fácil, siempre que el script pueda automatizarse, no es necesario que exista la herramienta específica.Lo que fue útil para mí fue algo como:
De http://krosinski.blogspot.com/2012/12/using-table-join-with-mysqldump.html
fuente
¿Has probado la función de presupuesto en mysql?
guarde lo anterior, como query.sql
fuente
En MySQL:
En la línea de comando:
En su servidor de destino, configure ~ / .my.cnf
Importar en el servidor de destino
fuente
Escribí un pequeño script para un problema similar, aquí está: https://github.com/digitalist/mysql_slice
es decir, tienes esta consulta :
tienes este basurero :
fuente