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

Comment puis-je exécuter une commande SQL via un script shell afin de le rendre automatisé?

Je veux restaurer les données que j’ai collectées dans un fichier SQL à l’aide d’un script shell. Je veux me connecter à un serveur et restaurer des données. La commande fonctionne lorsqu’elle est exécutée séparément via la ligne de commande SSH.

C’est la commande que j’utilise:

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

Ceci est le code du script shell qui crée le fichier ds_fbids.sql et le ds_fbids.sql dans 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 faire cela?

Vous devez utiliser l’ -p pour envoyer un mot de passe. Et c’est délicat car vous ne devez pas avoir d’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 -p , le client mysql vous demandera de manière interactive le mot de passe, puis interprétera l'argument de commande suivant sous la forme d'un nom de firebase database:

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

En fait, je préfère stocker l'utilisateur et le mot de passe dans ~ / .my.cnf pour ne pas avoir à le mettre sur la ligne de commande:

 [client] user = root password = XXXXXXXX 

Alors:

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

Re votre commentaire:

Je lance des commandes mysql en mode batch comme ci-dessus sur la ligne de commande et dans les scripts shell tout le temps. Il est difficile de diagnostiquer ce qui ne va pas avec votre script shell, car vous n'avez pas partagé le script exact ni aucune sortie d'erreur. Je vous suggère de modifier votre question initiale ci-dessus et de fournir des exemples de ce qui ne va pas.

Aussi, lorsque je dépanne un script shell, j'utilise l'indicateur -x pour voir comment il exécute chaque commande:

 $ bash -x myscript.sh 

Utilisez cette syntaxe:

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

Toutes les réponses précédentes sont excellentes. Si vous souhaitez exécuter une simple commande sql d’une ligne, vous pouvez également utiliser l’option -e.

 mysql -h  -u -p database -e \ "SELECT * FROM blah WHERE foo='bar';" 

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

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

Si vous utilisez host comme localhost, 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 un ! (Point d’exclamation) vous devez append un \ (backslash) devant lui.

Le cœur de la question a déjà été répondu à plusieurs resockets, j’ai juste pensé que j’appendais que les backticks (`s) ont un intérêt à la fois dans les scripts shell et SQL. Si vous devez les utiliser en SQL pour spécifier un nom de table ou de firebase database, vous devrez leur échapper dans le script shell, comme ceci:

 mysql -p=password -u "root" -Bse "CREATE DATABASE \`${1}_database\`; CREATE USER '$1'@'%' IDENTIFIED BY '$2'; GRANT ALL PRIVILEGES ON `${1}_database`.* TO '$1'@'%' WITH GRANT OPTION;" 

Bien sûr, la génération de SQL via une entrée utilisateur concaténée (arguments passés) ne devrait pas être faite à moins que vous ne fassiez confiance à l’utilisateur. Ce serait beaucoup plus sûr de le placer dans un autre langage de script dans MySQL.

Vous avez oublié -p ou --password= (ce dernier est mieux lisible):

 mysql -h "$server_name" "--user=$user" "--password=$password" "--database=$database_name" < "filename.sql" 

(Les guillemets ne sont pas nécessaires si vous êtes sûr que vos identifiants / noms ne contiennent pas de caractères spéciaux pour l'espace ou le shell.)

Notez que la page de manuel indique également que la fourniture des informations d'identification sur la ligne de commande n'est pas sécurisée. Alors, suivez les conseils de Bill concernant my.cnf.

Comme indiqué précédemment, vous pouvez utiliser -p pour transmettre le mot de passe au serveur.

Mais je recommande ceci:

 mysql -h "hostaddress" -u "username" -p "database-name" < "sqlfile.sql" 

Notez que le mot de passe n'est pas là. Il vous demanderait alors votre mot de passe. Je voudrais ensuite le saisir. Pour que votre mot de passe ne soit pas consigné dans l'historique de la ligne de commande du serveur.

C'est une mesure de sécurité de base.

Si la sécurité n'est pas un problème, je voudrais simplement supprimer temporairement le mot de passe de l'utilisateur de la firebase database. Ensuite, après l'importation - rajoutez-le.

De cette façon, aucun autre compte partageant le même mot de passe ne serait compromis.

Il semble également que dans votre script shell vous n'attendez pas / ne vérifiez pas si le fichier que vous essayez d'importer existe réellement. Le script perl n'est peut-être pas encore terminé.

 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 souhaitez redirect la sortie dans un fichier

 mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file > out_file 
 mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password 

Comment puis-je exécuter une ligne de commande avec un mot de passe sécurisé? utilisez l’éditeur de configuration !!!

A partir de mysql 5.6.6, vous pouvez stocker le mot de passe dans un fichier de configuration puis exécuter des commandes cli comme celles-ci ….

 mysql --login-path=storedPasswordKey .... 

–login-path remplace les variables … hôte, utilisateur ET mot de passe. excellent droit!

 #!/bin/sh #Procedures = update #Scheduled at : Every 00.05 v_path=/etc/database_jobs v_cnt=0 MAILTO="indd@abc.in joanson@abc.in sturt@abc.in" touch "$v_path/db_db_log.log" #test mysql -uusername -ppassword -h111.111.111.111 db_name -e "CALL functionName()" > $v_path/db_db_log.log 2>&1 if [ "$?" -eq 0 ] then v_cnt=`expr $v_cnt + 1` mail -s "db Attendance Update has been run successfully" $MAILTO < $v_path/db_db_log.log else mail -s "Alert : db Attendance Update has been failed" $MAILTO < $v_path/db_db_log.log exit fi 

Une considération importante pour accéder à mysql à partir d’un script shell utilisé dans cron est que mysql examine l’utilisateur connecté pour déterminer un fichier .my.cnf à charger.

Cela ne fonctionne pas avec cron. Cela peut également être source de confusion si vous utilisez su / sudo, car l’utilisateur connecté peut ne pas être l’utilisateur que vous utilisez.

J’utilise quelque chose comme:

 mysql --defaults-extra-file=/path/to/specific/.my.cnf -e 'SELECT something FROM sometable' 

Assurez-vous simplement que la propriété et les permissions des utilisateurs et des groupes sont définies de manière appropriée sur le fichier .my.cnf.

Utilisation

 echo "your sql script;" | mysql -u -p -h db_name