Comment puis-je exécuter une commande SQL via un script shell afin de la rendre automatisée?
Je souhaite restaurer les données que j'ai collectées dans un fichier SQL à l'aide d'un script shell. Je souhaite 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"
C'est le code de script shell qui crée le fichier ds_fbids.sql
et le transforme 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 procéder?
+ mysql -h dbservername -u user-name -ppassword dbname</br> : No such file or directoryids.sql</br> + $'\r' : command not found2:
C'est le message d'erreur que j'ai reçu-p
si le mot de passe est une chaîne nulle ou vide, vous pouvez peut-être mettre à jour votre message? :)Utilisez cette syntaxe:
la source
"command1;command2;....;commandn"
partie de cette réponse ne fonctionnera pas. Son utilisation pour remplacer l'utilisation du fichier redirigé dans la syntaxe de l'OP peut fonctionner. J'ai abordé ce problème dans ma réponse à cette question.Toutes les réponses précédentes sont excellentes. S'il s'agit d'une simple commande sql d'une ligne que vous souhaitez exécuter, vous pouvez également utiliser l'option -e.
la source
Comment exécuter un script SQL, utilisez cette syntaxe:
Si vous utilisez host comme localhost, vous n'avez pas besoin de le mentionner. Vous pouvez utiliser ceci:
Cela devrait fonctionner pour Windows et Linux.
Si le contenu du mot de passe contient un
!
(point d'exclamation), vous devez ajouter une\
(barre oblique inverse) devant lui.la source
Le cœur de la question a déjà reçu une réponse à plusieurs reprises, j'ai juste pensé ajouter que les backticks (s) ont des beaning à la fois dans le script shell et SQL. Si vous avez besoin de les utiliser dans SQL pour spécifier un nom de table ou de base de données, vous devrez les échapper dans le script shell comme ceci:
Bien sûr, la génération de SQL via une entrée utilisateur concaténée (arguments passés) ne devrait pas être effectuée à moins que vous ne fassiez confiance à l'entrée utilisateur.Il serait beaucoup plus sûr de le mettre dans un autre langage de script avec prise en charge des paramètres / échapper correctement les chaînes pour l'insertion dans MySQL.
la source
(utilisez le chemin complet pour
sql_script_file
si nécessaire)Si vous souhaitez rediriger la sortie vers un fichier
la source
Vous avez oublié
-p
ou--password=
(ce dernier est mieux lisible):(Les guillemets ne sont pas nécessaires si vous êtes sûr que vos informations d'identification / noms ne contiennent pas d'espace ou de caractères spéciaux du 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.
la source
Comme indiqué précédemment, vous pouvez utiliser -p pour transmettre le mot de passe au serveur.
Mais je recommande ceci:
Notez que le mot de passe n'est pas là. Il vous demandera alors le mot de passe. Je voudrais alors le taper. Pour que votre mot de passe ne soit pas connecté à l'historique de la ligne de commande des serveurs.
Il s'agit d'une mesure de sécurité de base.
Si la sécurité n'est pas un problème, je supprimerais temporairement le mot de passe de l'utilisateur de la base de données. Ensuite, après l'importation, ajoutez-le à nouveau.
De cette façon, tous les autres comptes que vous pourriez avoir et partageant le même mot de passe ne seront pas 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é.
la source
perl fb_apps_frm_fb.pl
</br> perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql` </br>mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Utilisation
la source
Pour "automatiser" le processus d'importation du
.sql
fichier généré , tout en évitant tous les pièges qui peuvent être cachés en essayant de faire passer des fichiersstdin
etstdout
, dites simplement à MySQL d'exécuter le.sql
fichier généré en utilisant laSOURCE
commande dans MySQL.La syntaxe de la réponse courte, mais excellente, de Kshitij Sood , constitue le meilleur point de départ. En bref, modifiez la commande de l'OP selon la syntaxe de Kshitij Sood et remplacez les commandes en cela par la
SOURCE
commande:Si le nom de la base de données est inclus dans le
.sql
fichier généré , il peut être supprimé de la commande.La présomption ici est que le fichier généré est valide en tant que
.sql
fichier seul. En ne faisant pas que le fichier soit redirigé, redirigé ou de toute autre manière géré par le shell, il n'y a aucun problème avec le besoin d'échapper à l'un des caractères de la sortie générée à cause du shell. Les règles relatives à ce qui doit être échappé dans un.sql
fichier, bien sûr, s'appliquent toujours.Comment traiter les problèmes de sécurité autour du mot de passe sur la ligne de commande, ou dans un
my.cnf
fichier, etc., a été bien abordé dans d'autres réponses, avec d'excellentes suggestions. Ma réponse préférée , de Danny , couvre cela, y compris la façon de gérer le problème lors ducron
travail ou de toute autre chose.Pour répondre à un commentaire (question?) Sur la réponse courte que j'ai mentionnée: Non, elle ne peut pas être utilisée avec une syntaxe HEREDOC, car cette commande shell est donnée. HEREDOC peut être utilisé dans la syntaxe de la version de redirection , (sans l'
-Bse
option), car la redirection d'E / S est ce sur quoi HEREDOC est construit. Si vous avez besoin de la fonctionnalité de HEREDOC, il serait préférable de l'utiliser dans la création d'un.sql
fichier, même s'il s'agit d'un fichier temporaire, et d'utiliser ce fichier comme "commande" à exécuter avec la ligne de commandes MySQL.Gardez à l'esprit qu'en raison de l'expansion du shell, vous pouvez utiliser des variables de shell et d'environnement dans HEREDOC. L' inconvénient est que vous devez échapper à chaque backtick. MySQL les utilise comme délimiteurs pour les identificateurs mais le shell, qui obtient la chaîne en premier, les utilise comme délimiteurs de commandes exécutables. Manquez l'évasion sur un seul backtick des commandes MySQL, et le tout explose avec des erreurs. L'ensemble du problème peut être résolu en utilisant une LimitString citée pour le HEREDOC:
La suppression de l'extension du shell de cette façon élimine le besoin d'échapper aux backticks et aux autres caractères spéciaux du shell. Il supprime également la possibilité d'utiliser des variables de shell et d'environnement en son sein. Cela supprime à peu près les avantages de l'utilisation d'un HEREDOC dans le script shell pour commencer.
L'autre option consiste à utiliser les chaînes entre guillemets multilignes autorisées dans Bash avec la version de la syntaxe du lot (avec le
-Bse
). Je ne connais pas d'autres coques, donc je ne peux pas dire si elles y fonctionnent également. Vous devrez de toute façon l'utiliser pour exécuter plus d'un.sql
fichier avec laSOURCE
commande, car cela n'est pas terminé par un;
comme le sont les autres commandes MySQL, et un seul est autorisé par ligne. La chaîne multiligne peut être entre guillemets simples ou doubles, avec les effets normaux sur l'expansion du shell. Il comporte également les mêmes mises en garde que l'utilisation de la syntaxe HEREDOC pour les backticks, etc.Une solution potentiellement meilleure serait d'utiliser un langage de script, Perl, Python, etc., pour créer le
.sql
fichier, comme l'a fait l'OP, etSOURCE
ce fichier en utilisant la syntaxe de commande simple en haut. Les langages de script sont bien meilleurs pour la manipulation de chaînes que le shell, et la plupart ont des procédures intégrées pour gérer les guillemets et les échappements nécessaires lors de l'utilisation de MySQL.la source
Une considération importante pour accéder à mysql à partir d'un script shell utilisé dans cron, est que mysql regarde l'utilisateur connecté pour déterminer un .my.cnf à charger.
Cela ne fonctionne pas avec cron. Cela peut également prêter à confusion si vous utilisez su / sudo car l'utilisateur connecté n'est peut-être pas l'utilisateur sous lequel vous exécutez.
J'utilise quelque chose comme:
Assurez-vous simplement que la propriété et les autorisations des utilisateurs et des groupes sont définies de manière appropriée et stricte sur le fichier .my.cnf.
la source
la source
Comment exécuter une ligne de commande avec un mot de passe sécurisé? utilisez l'éditeur de configuration !!!
Depuis mysql 5.6.6, vous pouvez stocker le mot de passe dans un fichier de configuration, puis exécuter des commandes cli comme celle-ci ...
--login-path remplace les variables ... hôte, utilisateur ET mot de passe. excellent droit!
la source
J'ai écrit un script shell qui lira les données du fichier de propriétés, puis exécutera le script mysql sur le script shell. partager cela peut aider les autres.
la source