Um „Automate“ der Prozess der erzeugten Import - .sql
Datei, während all Fallen zu vermeiden, die bei dem Versuch , versteckt werden können Dateien durchlaufen stdin
und stdout
nur MySQL anweisen , die erzeugte auszuführen .sql
Datei mit dem SOURCE
Befehl in MySQL.
Die Syntax in der kurzen, aber ausgezeichneten Antwort von Kshitij Sood bietet den besten Ausgangspunkt. Kurz gesagt, ändern Sie den Befehl des OP gemäß der Syntax von Kshitij Sood und ersetzen Sie die darin enthaltenen Befehle durch den folgenden SOURCE
Befehl:
#!/bin/bash
mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql
SOURCE ds_fbidx.sql"
Wenn der Datenbankname in der generierten .sql
Datei enthalten ist, kann er aus dem Befehl entfernt werden.
Hierbei wird davon ausgegangen, dass die generierte Datei als eigenständige Datei gültig ist .sql
. Da die Datei nicht umgeleitet, weitergeleitet oder auf andere Weise von der Shell verarbeitet wird, ist es kein Problem, aufgrund der Shell eines der Zeichen in der generierten Ausgabe zu maskieren. Die Regeln in Bezug auf das, was in einem entkommen muss.sql
Datei maskiert werden muss, gelten natürlich weiterhin.
Der Umgang mit Sicherheitsproblemen rund um das Kennwort in der Befehlszeile oder in einer my.cnf
Datei usw. wurde in anderen Antworten mit einigen hervorragenden Vorschlägen ausführlich behandelt. Meine Lieblingsantwort von Danny behandelt dies, einschließlich des Umgangs mit dem Problem beim Umgang mit cron
Jobs oder irgendetwas anderem.
Um einen Kommentar (Frage?) Zu der kurzen Antwort zu adressieren, die ich erwähnt habe: Nein, sie kann nicht mit einer HEREDOC-Syntax verwendet werden, da dieser Shell-Befehl gegeben wird. HEREDOC kann in der Syntax der Umleitungsversion verwendet werden (ohne die -Bse
Option), da HEREDOC auf der E / A-Umleitung basiert. Wenn Sie die Funktionalität von HEREDOC benötigen, ist es besser, sie beim Erstellen einer .sql
Datei zu verwenden, auch wenn es sich um eine temporäre Datei handelt, und diese Datei als "Befehl" für die Ausführung mit der MySQL-Stapelzeile zu verwenden.
#!/bin/bash
cat >temp.sql <<SQL_STATEMENTS
...
SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
Beachten Sie, dass Sie aufgrund der Shell-Erweiterung Shell- und Umgebungsvariablen im HEREDOC verwenden können. Der Nachteil ist, dass Sie jedem Backtick entkommen müssen. MySQL verwendet sie als Trennzeichen für Bezeichner, aber die Shell, die zuerst die Zeichenfolge erhält, verwendet sie als Trennzeichen für ausführbare Befehle. Verpassen Sie die Flucht mit einem einzigen Backtick der MySQL-Befehle, und das Ganze explodiert mit Fehlern. Das gesamte Problem kann mithilfe eines zitierten LimitString für das HEREDOC gelöst werden:
#!/bin/bash
cat >temp.sql <<'SQL_STATEMENTS'
...
SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
Durch das Entfernen der Shell-Erweiterung auf diese Weise müssen die Backticks und andere Shell-Sonderzeichen nicht mehr entfernt werden. Außerdem wird die Möglichkeit entfernt, Shell- und Umgebungsvariablen darin zu verwenden. Damit entfallen die Vorteile der Verwendung eines HEREDOC im Shell-Skript.
Die andere Option besteht darin, die in Bash zulässigen mehrzeiligen Zeichenfolgen in Anführungszeichen mit der Batch-Syntaxversion (mit dem -Bse
) zu verwenden. Ich kenne keine anderen Muscheln, daher kann ich nicht sagen, ob sie auch darin funktionieren. Sie müssten dies ohnehin verwenden, um mehr als eine .sql
Datei mit dem SOURCE
Befehl auszuführen , da dies nicht;
wie andere MySQL-Befehle durch a beendet wird und nur eine pro Zeile zulässig ist. Die mehrzeilige Zeichenfolge kann entweder in einfachen oder doppelten Anführungszeichen stehen, mit den normalen Auswirkungen auf die Shell-Erweiterung. Es hat auch die gleichen Einschränkungen wie die Verwendung der HEREDOC-Syntax für Backticks usw.
Eine potenziell bessere Lösung wäre die Verwendung einer Skriptsprache, Perl, Python usw., um die .sql
Datei wie im OP zu erstellen , und SOURCE
diese Datei mit der einfachen Befehlssyntax oben. Die Skriptsprachen sind bei der Manipulation von Zeichenfolgen viel besser als die Shell und die meisten verfügen über integrierte Verfahren, um das Zitieren und Escape-Verhalten im Umgang mit MySQL zu bewältigen.