Dump MySQL par requête

220

Est-il possible de faire mysqldumpen single SQL query?

Je veux dire vider la base de données entière , comme phpmyadminlorsque vous exportez versSQL

Jakub Arnold
la source

Réponses:

285

pas mysqldump, mais mysql cli ...

mysql -e "select * from myTable" -u myuser -pxxxxxxxxx mydatabase

vous pouvez le rediriger vers un fichier si vous le souhaitez:

mysql -e "select * from myTable" -u myuser -pxxxxxxxx mydatabase > mydumpfile.txt

Mise à jour: le message d'origine a demandé s'il pouvait vider la base de données par requête. Ce qu'il a demandé et ce qu'il a voulu dire était différent. Il voulait vraiment juste mysqldump toutes les tables.

mysqldump --tables myTable --where="id < 1000"
Zak
la source
22
comment restaurer ce fichier txt vidé?
Vivek S
3
pour ceux qui essaient l'approche mysql -e. J'ai dû personnaliser un peu le script pour qu'il fonctionne pour moi. Celui-ci vous oblige à entrer le mot de passe SQL lors de l'exécution. mysql -e "select * from table WHERE query = 'asdasd'" -u root -p --database = DBNAME> text.txt
RichardW11
13
vous pouvez simplement créer une nouvelle table pour la requête (CREATE TABLE SELECT), puis vider cette table avec mysqldump. De cette façon, vous pouvez facilement le restaurer plus tard.
quano
1
pour ceux qui veulent utiliser mysqldump et restaurer le fichier, regardez ici: stackoverflow.com/a/2431936/411786
Syco
2
Pour importer des données qui sont exportées avec mysql -e avec l'option -B pour sortir comme délimitées par des tabulations, exécutez mysqlimport --ignore-lines = 1 --fields-terminated-by = '\ t'. Voir: stackoverflow.com/a/17071108/1676044
Kevin Borders
259

Cela devrait fonctionner

mysqldump --databases X --tables Y --where="1 limit 1000000"
Thomas Ahle
la source
4
Un meilleur exemple pourrait être quelque chose qui ressemble en fait à une clause where, comme --where = "myColumn <1000" - le premier million de lignes de chaque table semble être une chose étrange à demander;)
ijw
@ijw Si ce que vous voulez faire est d'effectuer une sauvegarde facilement réinsérable de votre table, vous n'avez probablement pas besoin d'une clause where pour autre chose que des limites.
Thomas Ahle
3
@Sagotharan: Eh bien, ce n'est pas une requête. Voilà probablement pourquoi.
Courses de légèreté en orbite
80
!!AVERTISSEMENT!! mysqldump ajoute une commande 'DROP TABLE' en haut du fichier exporté. Cela signifie que si vous effectuez une exportation partielle puis la réimportez, vous perdrez tout le reste. Eh bien, je l'ai fait.
Tamlyn
35
Oui, afin de ne pas supprimer toutes les données de votre table lors de la restauration à partir du fichier de données enregistré, assurez-vous d'ajouter l' --no-create-infooption. Voir ma réponse pour un exemple.
Gary
71

Vous pouvez vider une requête au format csv comme ceci:

SELECT * from myTable
INTO OUTFILE '/tmp/querydump.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
Gars
la source
8
Et si je veux vider plusieurs tables.
SIFE
11
Cela crée un fichier sur la machine sur laquelle la base de données MySQL s'exécute. Donc, si vous interrogez à partir d'une console distante, cette méthode échoue. S'il existe également un moyen de le faire à partir d'une console distante, faites-le moi savoir.
dknight
2
où enregistre-t-il le fichier?
Techlord
1
@dknight Je suppose que vous voulez dire une console distante via une console de terminal, auquel cas vous pouvez récupérer le fichier sauvegardé via une scpfois la connexion terminée. voici un exemple. scp [email protected]:/tmp/querydump.csv ~/local.csv
Luke
Il ne semble pas sûr: # 1290 - Le serveur MySQL fonctionne avec l'option --secure-file-priv, il ne peut donc pas exécuter cette instruction
mikep
64

Vider une table à l'aide d'une requête where:

mysqldump mydatabase mytable --where="mycolumn = myvalue" --no-create-info > data.sql

Vider une table entière:

mysqldump mydatabase mytable > data.sql

Remarques:

  • Remplacez mydatabase, mytableet l'instruction where par vos valeurs souhaitées.
  • Par défaut, mysqldumpinclura les instructions DROP TABLEet CREATE TABLEdans sa sortie. Par conséquent, si vous ne souhaitez pas supprimer toutes les données de votre table lors de la restauration à partir du fichier de données enregistré, assurez-vous d'utiliser l' --no-create-infooption.
  • Vous devrez peut - être ajouter les appropriés -h, -uet des -poptions à l'exemple commandes ci - dessus afin de préciser votre base de données hôte souhaité, l' utilisateur et le mot de passe, respectivement.
Gary
la source
38

Vous pouvez utiliser l'option --where sur mysqldump pour produire une sortie que vous attendez:

mysqldump -u root -p test t1 --where="1=1 limit 100" > arquivo.sql

Au plus 100 lignes de test.t1 seront vidées de la table de base de données.

À la vôtre, WB

Wagner Bianchi
la source
6

Si vous souhaitez exporter vos n derniers enregistrements dans un fichier, vous pouvez exécuter ce qui suit:

mysqldump -u user -p -h localhost --where "1=1 ORDER BY id DESC LIMIT 100" database table > export_file.sql

Ce qui précède enregistrera les 100 derniers enregistrements dans export_file.sql, en supposant que la table à partir de laquelle vous exportez possède une colonne d'identification auto-incrémentée.

Vous devrez modifier les valeurs utilisateur, localhost, base de données et table. Vous pouvez éventuellement modifier la colonne id et exporter le nom du fichier.

aullah
la source
5

MySQL Workbench a également cette fonctionnalité parfaitement dans l'interface graphique. Exécutez simplement une requête, cliquez sur l'icône d'enregistrement à côté d'Export / Import:

entrez la description de l'image ici

Choisissez ensuite "Instructions SQL INSERT (* .sql)" dans la liste.

entrez la description de l'image ici

Entrez un nom, cliquez sur enregistrer, confirmez le nom de la table et vous aurez votre fichier de vidage.

MPelletier
la source
3

Combiner une grande partie de ce qui précède ici est mon véritable exemple pratique, en sélectionnant des enregistrements en fonction de la métrique et de l'horodatage. J'ai besoin de cette commande depuis des années. S'exécute très rapidement.

mysqldump -uuser -ppassword main_dbo trHourly --where="MeterID =5406 AND TIMESTAMP<'2014-10-13 05:00:00'" --no-create-info --skip-extended-insert | grep  '^INSERT' > 5406.sql
zzapper
la source
-1

mysql Exporter la ligne de commande des résultats de la requête:

mysql -h120.26.133.63 -umiyadb -proot123 miya -e "select * from user where id=1" > mydumpfile.txt
lanni654321
la source
cela fonctionne pour moi dans ubuntu, commande: mysql -h localhost -u root -p dbname -e "select * from users where id = 1; select * from staffs where id = 1" --xml> / var / www / html / project / backups / db.xml
Ramesh