web-dev-qa-db-fra.com

Une meilleure façon d'exécuter plusieurs commandes MySQL à l'aide du script Shell

Je voudrais écrire un script * .sh pour exécuter plusieurs commandes MySQL.

Actuellement, ce que je peux faire est quelque chose comme ceci

mysql -h$Host -u$user -p$password -e "drop database $dbname;"
mysql -h$Host -u$user -p$password -e "create database $dbname;"
mysql -h$Host -u$user -p$password -e "another MySQL command"
...

Existe-t-il un moyen d'éviter de taper "mysql -h $ Host -u $ user -p $ password -e" chaque fois que je veux exécuter une commande MySQL?

18
Brian

Je pense que vous pouvez exécuter des instructions MySQL à partir d'un fichier texte, par exemple

voici le fichier cmds.txt qui contient les commandes MySQL:

select colA from TableA;
select colB from TableB;
select colC from TableC;

Pour les exécuter à l'aide du script Shell, tapez

mysql -h$Host -u$user -p$password db_dbname < cmds.txt

De cette façon, vous séparez vos commandes MySQL de votre script Shell.

Vous souhaiterez peut-être que votre script affiche des informations de progression. Pour cela, vous pouvez invoquer mysql avec l'option "--verbose".

Pour plus d'informations, voir https://dev.mysql.com/doc/refman/5.6/en/mysql-batch-commands.html

22
EricWang

Vous pouvez utiliser une seule requête multiple:

mysql -h$Host -u$user -p$password -e "drop database $dbname;create database $dbname;another MySQL command;"

Écrivez simplement toutes vos requêtes séparées par ;. Ils seront exécutés l'un après l'autre.

13
chris p bacon

Notez que vous pouvez également utiliser un document ICI pour avoir les requêtes dans le même script:

mysql -h$Host -u$user -p$password db_dbname <<'EOF'
select colA from TableA;
select colB from TableB;
select colC from TableC;
EOF

Notez que j'ai utilisé 'EOF' plutôt que EOF dans la première ligne afin d'empêcher le contenu du script de désactiver la substitution de paramètres (en particulier le ` peut être problématique)

Notez également qu'il ne devrait y avoir aucun espace avant le EOF final (sauf si vous utilisez <<- plutôt que << - dans ce cas, les premiers caractères de tabulation sont supprimés):

mysql -h$Host -u$user -p$password db_dbname <<- 'EOF'
↠select colA from TableA;
↠select colB from TableB;
↠select colC from TableC;
↠EOF

(Remplacez le avec un caractère de tabulation).

Pour plus d'informations sur la syntaxe doc HERE, voir la documentation bash .

12
Erwin Wessels

Il y a plusieurs façons, sous Linux, vous avez:

Depuis le mysql cli:

mysql> source mycmds.sql

Utilisation de tuyaux:

echo "SELECT ..; INSERT ..;" | mysql ...

Exécution de commandes à partir d'un fichier à l'aide de canaux ou de redirection:

cat file.sql | mysql ... OR mysql .. < file.sql
10
Dave