Comment exécuter un script SQL dans MySQL?

409

Je veux exécuter un fichier texte contenant des requêtes SQL, dans MySQL.

J'ai essayé de courir source /Desktop/test.sqlet j'ai reçu l'erreur:

mysql>. \ home \ sivakumar \ Desktop \ test.sql ERREUR: impossible d'ouvrir le fichier '\ home \ sivakumar \ Desktop \ test.sql', erreur: 2

Une idée de ce que je fais mal?

user1160432
la source
fondamentalement, je pense que cela devrait être la réponse ici: \. /home/sivakumar/Desktop/test.sql
talsibony

Réponses:

434

Si vous êtes sur la ligne de commande MySQL, mysql>vous devez déclarer le fichier SQL comme source.

mysql> source \home\user\Desktop\test.sql;
Thomas Edwards
la source
29
Pour mysql 5.6.10 sur Mac, aucun guillemet simple n'est nécessaire pour le chemin du fichier.
RNA
3
pour Windows, utiliser '/' au lieu de '\' a fonctionné correctement pour moi. J'ai eu des erreurs lorsque j'ai utilisé à l'origine '/'. C'est ce qui a fonctionné pour moi ... source C: /Users/macombers/Downloads/midcoast_db.sql;
Zack Macomber du
Déposez également les citations sur Ubuntu (mysql Ver 14.14 debian-linux-gnu (x86_64) en utilisant le wrapper EditLine)
Siddhartha
1
@kapil Par rapport à quoi? Vous êtes à l'intérieur de MySQL à ce stade, donc il n'y a pas de parent, j'ai peur.
Thomas Edwards
1
@Sarah Vous pouvez utiliser \ avant l'espace ou envelopper le nom de fichier avec ".
Thomas Edwards
166

Vous avez beaucoup d'options:

  • utilisez le client de ligne de commande MySQL: mysql -h hostname -u user database < path/to/test.sql
  • Installez les outils de l'interface graphique MySQL et ouvrez votre fichier SQL, puis exécutez-le
  • Utilisez phpmysql si la base de données est disponible via votre serveur web
Eugen Rieck
la source
3
Qu'en est-il du mot de passe de l'utilisateur (option -p)?
Amir Katz
@AmirKatz Bien que le mot de passe puisse être donné avec l' -poption, ce n'est pas recommandé: d'autres utilisateurs sur le même hôte peuvent utiliser des outils système comme pspour le lire dans ce cas.
Eugen Rieck
1
@EugenRieck -psans argument vous invite à entrer le mot de passe sur la ligne suivante
Bobby Jack
130

vous pouvez exécuter des instructions mysql écrites dans un fichier texte à l'aide de la commande suivante:

mysql -u yourusername -p yourpassword yourdatabase < text_file

si votre base de données n'a pas encore été créée, connectez-vous d'abord à votre mysql en utilisant:

mysql -u yourusername -p yourpassword yourdatabase

puis:

mysql>CREATE DATABASE a_new_database_name

puis:

mysql -u yourusername -p yourpassword a_new_database_name < text_file

ça devrait le faire!

Plus d'informations ici: http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html

Paul Preibisch
la source
7
sous Windows: pour le mot de passe, j'ai dû utiliser des guillemets et aucun espace pour le faire fonctionner (le mot de passe lui-même ne contenait aucun espace ni caractère spécial):mysql -u yourusername -p"yourpassword"
TmTron
1
Si vous ne voulez pas que votre mot de passe s'affiche à l'invite, je pense que la méthode décrite ici fonctionnera: stackoverflow.com/questions/9293042/…
alex9311
59

Mon option préférée pour ce faire sera:

 mysql --user="username" --database="databasename" --password="yourpassword" < "filepath"

Je l 'utilise de cette façon parce que lorsque vous l' enchaînez avec "" vous évitez le mauvais chemin et les erreurs avec les espaces et - et probablement plus de problèmes avec les caractères que je n'ai pas rencontrés.


Avec le commentaire @elcuco, je suggère d'utiliser cette commande avec [espace] avant afin de dire à bash d'ignorer de l'enregistrer dans l'historique, cela fonctionnera par défaut dans la plupart des bash.

dans le cas où il enregistre toujours votre commande dans l'historique, veuillez consulter les solutions suivantes:

Exécuter une commande sans la conserver dans l'historique


modification de sécurité supplémentaire

Au cas où vous voudriez être plus sûr, vous pouvez utiliser la commande suivante et entrer le mot de passe dans la ligne de commande:

mysql --user="username" --database="databasename" -p < "filepath"
talsibony
la source
18
Je ne recommanderais pas de passer le mot de passe à la ligne de commande, car il sera enregistré dans le ~ / .bash_history, et peut être consulté par d'autres programmes via / proc /.
elcuco
Excellent conseil de @elcuco! En outre, utilisez probablement un autre indicateur après -p (ou que ce soit le dernier argument) afin qu'un autre paramètre ne soit pas pris à tort pour être le mot de passe prévu.
davernator
Veuillez noter que les arguments de la ligne de commande sont toujours visibles par les autres utilisateurs. Exemple: pour i dans / proc / * / cmdline; faire écho $ i; chat $ i; fait
elcuco
Cela ne recommence PAS car vous exposez le mot de passe de votre serveur à l'historique de la console
Alexius DIAKOGIANNIS
@AlexiusDiakogiannis pouvez-vous me donner un exemple comment pouvez-vous afficher la commande à partir de l'historique lorsque vous l'exécutez avec [espace] avant la commande?
talsibony
56

Toutes les meilleures réponses sont bonnes. Mais juste au cas où quelqu'un voudrait exécuter la requête à partir d'un fichier texte sur un serveur distant ET enregistrer les résultats dans un fichier (au lieu de l'afficher sur la console), vous pouvez le faire:

mysql -u yourusername -p yourpassword yourdatabase < query_file > results_file

J'espère que cela aide quelqu'un.

Bhushan
la source
10
Je pense qu'il ne devrait pas y avoir d'espace entre -pet le mot de passe
webNeat
Si le but d'écrire dans un fichier est de prendre un vidage de données, je suppose que SELECT ... INTO OUTFILE /path/to/file.csvc'est un moyen plus efficace. Voir les options et la syntaxe ici - dev.mysql.com/doc/refman/5.7/en/select-into.html
Anis
20

Donnez le chemin du fichier .sql comme:

source c:/dump/SQL/file_name.sql;

Voir dans l'image:

Shubham Verma
la source
Merci beaucoup! cela fonctionne même si votre utilisateur n'a pas de droits SUDO et sur Amazon RDS distant
Volatil3
20

Je suis venu ici à la recherche de cette réponse également, et voici ce que j'ai trouvé qui fonctionne le mieux pour moi: Remarque: j'utilise Ubuntu 16.xx

  1. Accédez à mysql en utilisant:

mysql -u <your_user> - p

  1. À l'invite mysql, entrez:

source file_name.sql

J'espère que cela t'aides.

Zac Smith
la source
2
Au lieu de lancer l'invite, il pourrait même être utile de simplement combiner les deux étapes dans une seule commande:mysql -u<user> -p -e 'source filename.sql'
junix
Merci, @junix! L' option source utilisée de cette façon est ce que je cherchais.
ManuelJE
14
mysql> source C:\Users\admin\Desktop\fn_Split.sql

Ne spécifiez pas de guillemets simples.

Si la commande ci-dessus ne fonctionne pas, copiez le fichier sur le lecteur c: et réessayez. comme indiqué ci-dessous,

mysql> source C:\fn_Split.sql
Shankar Kalyankar
la source
13

Il n'est jamais recommandé de passer l'argument du mot de passe directement à partir de la ligne de commande, il est enregistré dans le ~/.bash_historyfichier et peut être accessible à partir d'autres applications.

Utilisez-le à la place:

mysql -u user --host host --port 9999 database_name < /scripts/script.sql -p
Enter password:
Jorge E. Hernández
la source
10
mysql -uusername -ppassword database-name < file.sql
Мартин Петров
la source
9

Très probablement, il vous suffit de changer la barre oblique / barre oblique noire: de

 \home\sivakumar\Desktop\test.sql

à

 /home/sivakumar/Desktop/test.sql

La commande serait donc:

source /home/sivakumar/Desktop/test.sql
Ben Lin
la source
6

utilisez ce qui suit à partir de l' invite de commande mysql -

source \\home\\user\\Desktop\\test.sql;

N'utilisez aucun devis. Même si le chemin contient de l'espace (''), n'utilisez aucune citation du tout .

Rajesh Paul
la source
5

au lieu de la redirection, je ferais ce qui suit

mysql -h <hostname> -u <username> --password=<password> -D <database> -e 'source <path-to-sql-file>'

Cela exécutera le chemin du fichier vers le fichier sql

DataGuru
la source
5

Tant de façons de le faire.

From Workbench: File > Run SQL Script -- then follow prompts

From Windows Command Line:
   Option 1: mysql -u usr -p
             mysql> source file_path.sql
   Option 2: mysql -u usr -p '-e source file_path.sql'
   Option 3: mysql -u usr -p < file_path.sql
   Option 4: put multiple 'source' statements inside of file_path.sql (I do this to drop and recreate schemas/databases which requires multiple files to be run)
             mysql -u usr -p < file_path.sql

Si vous obtenez des erreurs de la ligne de commande, assurez-vous que vous avez déjà exécuté

cd {!!>>mysqld.exe home directory here<<!!}
mysqld.exe --initialize 

Cela doit être exécuté à partir du répertoire mysqld.exe, d'où le CD.

J'espère que cela est utile et pas seulement redondant.

Donkey Kong
la source
3

Depuis mysql -u yourusername -p yourpassword yourdatabase < text_filene fonctionnait pas sur un serveur distant (EC2 d'Amazon) ...

Assurez-vous que la base de données est créée en premier.

Alors:

mysql --host=localhost --user=your_username --password=your_password your_database_name < pathTofilename.sql
Damir Olejar
la source
3

Pour référence future, j'ai trouvé que cela fonctionnait par rapport aux méthodes susmentionnées, sous Windows dans votre console msql:

mysql >>source c://path_to_file//path_to_file//file_name.sql;

Si votre lecteur racine ne s'appelle pas "c", échangez simplement avec le nom de votre lecteur. Essayez d'abord les barres obliques inverses, si elles ne fonctionnent pas, essayez la barre oblique. S'ils ne fonctionnent pas non plus, assurez-vous d'avoir votre chemin de fichier complet, l'extension .sql sur le nom du fichier, et si votre version insiste sur les points-virgules, assurez-vous qu'il est là et réessayez.

Chad Mx
la source
0

J'ai eu cette erreur et j'ai essayé tous les conseils que j'ai pu obtenir en vain.

Enfin, le problème était que mon dossier avait un espace dans le nom du dossier qui apparaissait comme une barre oblique dans le chemin du dossier, une fois que je l'ai trouvé et supprimé, cela a bien fonctionné.

user3753416
la source