Ich habe ein Bash-Skript, das eine CSV-Datei herunterlädt und dann in ein lokales MySQL importiert. Die Datenbank ist MySQL 5.6 auf Ubuntu 14.04. Ich lade Daten mit der folgenden Anweisung (Bash):
mysqlimport --ignore-lines=1 --lines-terminated-by='\n' --fields-terminated-by=',' --verbose --local --user=xx --password=xxxxxxxx mydb /var/www/mysite/data/daily_info.csv
Das Problem ist, dass das Skript, wenn ich es über die Befehlszeile mit demselben Benutzer starte, vom Download bis zur Importphase einwandfrei läuft. Ich habe einen Crontab-Eintrag hinzugefügt, um das Skript mit dem Befehl auszuführen
crontab -u theuser -e
Der Benutzer'der Benutzer'ist derselbe, der das Skript korrekt von der Kommandozeile aus startet. 'daily_info' ist auch der Name der Tabelle, zu der Daten durch denMySQL-ImportBefehl.
Ich würde erwarten, dass die Crontab-Aufgabe wie folgt ausgeführt wird:'der Benutzer'ermöglicht den Zugriff auf alle Ordner und Dateien,genau wie die interaktive Shell, aber das scheint nicht zu stimmen. Der geplante Job gibt mir diese Fehlermeldung
mysqlimport: Error: 1290, The MySQL server is running with the --secure-file-priv option so it cannot execute this statement, when using table: daily_info
Ich habe viele Fragen gefunden im Zusammenhang mit dersichere-Datei-privProblem, aber die Antworten passen nicht gut zu diesem Fall. Ich vermute, dass der Befehl in meinem Skript (mysqlimport) mit einem anderen Benutzer ausgeführt wird, aber ich kann es nicht diagnostizieren.
Für jede Hilfe wäre ich dankbar. Danke.
Antwort1
Ich habe keine Erklärung gefunden, bin aber zu einer (Teil-)Lösung für meine eigene Frage gekommen. Ich hoffe, dass andere dazu beitragen können, dies zu verbessern. Wenn es von der Kommandozeile ausgeführt wird, läuft das Skript einwandfrei, wenn es von crontab aus aktiviert wird, wendet es die Einstellungen insecure_file_privmysql-Variable. Also habe ich diemeine.cnfDatei, indem Sie eine Zeile unter dem[mysqld]Gruppe wie hier gezeigt:
[mysqld]
...other settings here...
secure-file-priv=/mypath/datafolder/
Danach müssen Sie MySQL neu starten und mit dieser Abfrage prüfen, ob die Änderung wirksam wird:
mysql> show variables like 'secure-file-priv';
+------------------+------------------------+
| Variable_name | Value |
+------------------+------------------------+
| secure_file_priv | /mypath/datafolder/ |
+------------------+------------------------+
1 row in set (0.01 sec)
Beachten Sie, dass beim Laden der Datenbank die.cnfDatei wird das Zeichen '-' in '_' (Unterstrich) umgewandelt.