170 votes

Comment exécuter une commande MySQL à partir d'un script shell?

Comment puis-je exécuter une commande SQL par le biais d'un script shell, de sorte que je peux le faire automatiquement?

Je veux restaurer les données que j'ai recueillies dans un fichier SQL à l'aide d'un script shell. Je veux me connecter à un serveur et de restauration de données. La commande fonctionne lorsqu'il est exécuté séparément via SSH en ligne de commande.

C'est la commande que j'utilise:

mysql -h "server-name" -u root "password" "database-name" < "filename.sql"

C'est le script shell code qui crée le fichier ds_fbids.sql et tuyaux en mysql.

perl fb_apps_frm_fb.pl
perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql
mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql

Quelle est la bonne façon de le faire?

207voto

Bill Karwin Points 204877

Vous devez utiliser l' -p indicateur pour envoyer un mot de passe. Et c'est difficile parce que vous ne devez avoir aucun espace entre -p et le mot de passe.

$ mysql -h "server-name" -u "root" "-pXXXXXXXX" "database-name" < "filename.sql"

Si vous utilisez un espace après l' -p il rend le client mysql vous invite de manière interactive pour le mot de passe, et puis il interprète le prochain argument de la commande comme une base de données-nom:

$ mysql -h "server-name" -u "root" -p "XXXXXXXX" "database-name" < "filename.sql"
Enter password: <you type it in here>
ERROR 1049 (42000): Unknown database 'XXXXXXXX'

En fait, je préfère stocker l'utilisateur et le mot de passe dans ~/.mon.cnf donc je n'ai pas à le mettre sur la ligne de commande à tous:

[client]
user = root
password = XXXXXXXX

Alors:

$ mysql -h "server-name" "database-name" < "filename.sql"

Re votre commentaire:

- Je exécuter en mode batch les commandes mysql comme ci-dessus sur la ligne de commande et les scripts shell, tout le temps. Il est difficile de diagnostiquer ce qui ne va pas avec votre script shell, parce que vous n'avez pas partagé l'exacte script ou toute erreur de sortie. Je vous suggère de modifier l'original de votre question ci-dessus et de fournir des exemples de ce qui va mal.

Aussi quand je suis dépannage d'un shell script que j'utilise l' -x drapeau si je peux voir comment cela est l'exécution de chaque commande:

$ bash -x myscript.sh

143voto

Kshitij Sood Points 191

Utilisez cette syntaxe:

 mysql -u $user -p$passsword -Bse "command1;command2;....;commandn"
 

59voto

Jericon Points 1214

Toutes les réponses précédentes sont super. S'il s'agit d'une simple commande d'une ligne que vous souhaitez exécuter, vous pouvez également utiliser l'option -e.

 mysql -h <host> -u<user> -p<password> database -e \
  "SELECT * FROM blah WHERE foo='bar';"
 

22voto

Milinda Bandara Points 197

Comment exécuter un script SQL, utilisez cette syntaxe:

 mysql --host= localhost --user=root --password=xxxxxx  -e "source dbscript.sql"
 

Si vous utilisez host en tant qu'hôte local, vous n'avez pas besoin de le mentionner. Vous pouvez utiliser ceci:

 mysql --user=root --password=xxxxxx  -e "source dbscript.sql"
 

Cela devrait fonctionner pour Windows et Linux.

Si le contenu du mot de passe contient ! (point d'exclamation), vous devez ajouter un \ (barre oblique inverse) devant celui-ci.

5voto

vine Points 11
 mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file
 

(utilisez le chemin complet pour sql_script_file si nécessaire)

Si vous voulez rediriger la sortie vers un fichier

 mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file > out_file
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X