Contexte
Je voudrais fournir le sous-ensemble de ma base de données nécessaire pour reproduire une select
requête. Mon objectif est de rendre mon flux de travail informatique reproductible (comme dans une recherche reproductible ).
Question
Est-il possible d'incorporer cette instruction select dans un script qui exporte les données demandées dans une nouvelle base de données, de telle sorte que la base de données puisse être installée sur un nouveau serveur mysql et que l'instruction fonctionne avec la nouvelle base de données? La nouvelle base de données ne doit pas contenir d’enregistrements en plus de ceux utilisés dans la requête.
Mise à jour: pour plus de précision, je ne suis pas intéressé par un vidage CSV des résultats de la requête. Ce que je dois être capable de faire est de vider le sous-ensemble de base de données afin qu'il puisse être installé sur une autre machine, puis la requête elle-même peut être reproductible (et modifiable par rapport au même ensemble de données).
Exemple
Par exemple, mon analyse peut interroger un sous-ensemble de données nécessitant des enregistrements de plusieurs tables (dans cet exemple 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');
Réponses:
mysqldump a l' option --where pour exécuter une clause WHERE pour une table donnée.
Bien qu'il ne soit pas possible de mysqldump une requête de jointure, vous pouvez exporter des lignes spécifiques de chaque table afin que chaque ligne extraite de chaque table soit impliquée ultérieurement dans la jointure.
Pour votre requête donnée, vous auriez besoin de mysqldump trois fois:
D'abord, mysqldump toutes les lignes de la table 3 avec le nom dans ('fee', 'fi', 'fo', 'fum'):
Ensuite, mysqldump toutes les lignes de la table2 ayant les valeurs table3_id correspondantes du premier mysqldump:
Ensuite, mysqldump toutes les lignes de la table 1 ayant les valeurs table1_id correspondantes dans le second mysqldump:
Note: Comme les deuxième et troisième mysqldumps nécessitent l'utilisation de plus d'une table, l'option --lock-all-tables doit être utilisée .
Créez votre nouvelle base de données:
Enfin, chargez les trois mysqldumps dans une autre base de données et tentez la jointure dans la nouvelle base de données.
Dans le client mysql, lancez votre requête de jointure
Essaie !!!
AVERTISSEMENT: S'ils ne sont pas indexés correctement, les deuxième et troisième mysqldumps peuvent prendre une éternité !!!
Juste au cas où, indexez les colonnes suivantes:
Je suppose que id est la clé primaire de table3.
la source
--where
clause dans la documentation; vous permettra de savoir comment cela fonctionne après avoir eu la chance de l'essayer.Je considérerais d’ utiliser un fichier 'outfile' dans votre SELECT au lieu de mysqldump pour résoudre ce problème. Vous pouvez produire l’instruction SELECT de votre choix, puis ajouter "INTO OUTFILE" /path/to/outfile.csv "..." à la fin avec la configuration appropriée pour la sortie de style CSV. Ensuite, vous pouvez simplement utiliser quelque chose comme la syntaxe ' LOAD DATA INFILE ...' pour charger les données dans votre nouvel emplacement de schéma.
Par exemple, en utilisant votre SQL:
N'oubliez pas que vous aurez besoin de suffisamment d'espace de stockage disponible sur la partition de disque cible.
la source
Load Data Infile
pour charger ce fichier .csv dans cette nouvelle base de données. Maintenant, la requête peut être exécutée.Mysqldump util a une option --tables qui vous permet de spécifier les tables à vider. Il vous permet de spécifier la liste des tables.
Je ne connais pas de manière plus simple (automatisée).
la source
delete from table1 where id not in (.....);
, si c'est le moyen le plus simple, tant que le script peut être automatisé, il n'est pas nécessaire que l'outil spécifique existe.Ce qui était utile pour moi était quelque chose comme:
De http://krosinski.blogspot.com/2012/12/using-table-join-with-mysqldump.html
la source
Avez-vous essayé la fonction de citation dans mysql?
enregistrer ce qui précède, en tant que query.sql
la source
En MySQL:
En ligne de commande:
Sur votre serveur de destination, configurez ~ / .my.cnf
Import sur le serveur de destination
la source
J'ai écrit un petit script pour un problème similaire, le voici: https://github.com/digitalist/mysql_slice
c'est à dire que vous avez cette requête :
vous avez ce dump :
la source