Shell-Script -> MYSQL -> LOAD DATA INFILE geht nicht
Hallo zusammen, ich bastle grad an einem Shell-Skript, dass aus einem File Daten in eine MySQL-Tabelle mittels LOAD DATA INFILE laden soll. Trotz der MySQL-Doku bekomme ich es nicht hin, folgende Zeilen zum Laufen zu bringen: ----------------------------------------------------------------------- #!/bin/sh BACKUP_PATH=/tmp DBSERVER=localhost DBUSER=User DBPASSWD=12345 DB=Datenbank MYSQL_TXT="LOAD DATA INFILE '${BACKUP_PATH}/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\' LINES TERMINATED BY '\\r\\n';" mysql -h ${DBSERVER} -u ${DBUSER} -p"${DBPASSWD}" ${DB} < echo $MYSQL_TXT ----------------------------------------------------------------------- Nachdem das ganze mit phpMyAdmin funktioniert, sollte das ganze doch mittels eines Shell-Skript laufen, so dass ich dieses dann als Cronjob laufen lassen kann. Ich freue mich schon auf die Antworten der Profis. Gruss Andreas Rau
Hallo, Am Tue, 30 Dec 2003, Andreas Rau schrieb:
bekomme ich es nicht hin, folgende Zeilen zum Laufen zu bringen: [..] mysql -h ${DBSERVER} -u ${DBUSER} -p"${DBPASSWD}" ${DB} < echo $MYSQL_TXT ^^^^^^^^^^^^^^^^^ was zum Geier soll das denn sein?
echo "$MYSQL_TXT" | mysql ... -dnh -- "Don't these people watch Jackie Chan movies? *Everything*'s a weapon! Next thing, they'll ban ballpoint pens, 'coz you can stab somebody with them. Or laptops, because you could force someone to install Windows 3.1. With a ballpoint pen, presumably." -- Eric The Read
Hallo David, zunächst vielen Dank für Deine Antwort. Mit Deinem Vorschlag
echo "$MYSQL_TXT" | mysql ...
bekomme ich folgende Fehlermeldung: ERROR 1102 at line 1: Incorrect database name '\n'' Zur Erinnerung noch mal meine LOAD DATA INFILE Zeile: MYSQL_TXT="LOAD DATA INFILE '${BACKUP_PATH}/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\' LINES TERMINATED BY '\\r\\n';" Ehrlich gesagt kann ich oben genannte Meldung nicht nachvollziehen. Vielen Dank für weitere Anregungen Gruss und einen guten Rutsch Andreas Rau
Hallo,
Am Tue, 30 Dec 2003, Andreas Rau schrieb:
bekomme ich es nicht hin, folgende Zeilen zum Laufen zu bringen: [..] mysql -h ${DBSERVER} -u ${DBUSER} -p"${DBPASSWD}" ${DB} < echo $MYSQL_TXT ^^^^^^^^^^^^^^^^^ was zum Geier soll das denn sein?
Ja, geht auch ohne " bei $DBPASSWD
echo "$MYSQL_TXT" | mysql ...
Hallo, Am Mittwoch, 31. Dezember 2003 14:02 schrieb Andreas Rau:
zunächst vielen Dank für Deine Antwort. Mit Deinem Vorschlag
echo "$MYSQL_TXT" | mysql ... bekomme ich folgende Fehlermeldung: ERROR 1102 at line 1: Incorrect database name '\n''
Zur Erinnerung noch mal meine LOAD DATA INFILE Zeile:
MYSQL_TXT="LOAD DATA INFILE '${BACKUP_PATH}/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\' LINES ^^^^^^ TERMINATED BY '\\r\\n';"
Kann es sein, daß hier der "\" als Escapezeichen gewünscht ist? IMO müsste der dann selber escaped werden, da er ja so das nachfolgende Zeichen escaped und der dadurch das Statement wie folgt aussieht: LOAD DATA INFILE '/wo/auch/immer/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY ' LINES TERMINATED BY '\r\n';
Ehrlich gesagt kann ich oben genannte Meldung nicht nachvollziehen.
Möglicherweise versucht mysql dann den letzten Teil des Statements "\n'" als Dateiname zu interpretieren. Servus, Daniel
Hallo miteinander, ich wünsche allen erst mal ein gesundes neues Jahr. Trotz Eurer Hinweise, habe ich es mit meiner ursprünglich angedachten Vorgehensweise nicht geklappt. Nachdem ich nochmals die MySQL-Doku etwas intensiver durchforstet habe, bin ich zu folgender Lösung gekommen: mysqlimport --local -u ${DBUSER} -p${DBPASSWD} -d --fields-terminated-by=',' --fields-enclosed-by='"' --fields-escaped-by='\' --lines-terminated-by='\r\n' ${DB} ${BACKUP_PATH}/dvd Mit dieser Zeile werden die Daten anstandslos in meine Datenbank importiert. Vielen Dank für Eure Beteiligung. Gruss Andreas
Hallo,
Am Mittwoch, 31. Dezember 2003 14:02 schrieb Andreas Rau:
zunächst vielen Dank für Deine Antwort. Mit Deinem Vorschlag
echo "$MYSQL_TXT" | mysql ... bekomme ich folgende Fehlermeldung: ERROR 1102 at line 1: Incorrect database name '\n''
Zur Erinnerung noch mal meine LOAD DATA INFILE Zeile:
MYSQL_TXT="LOAD DATA INFILE '${BACKUP_PATH}/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\' LINES ^^^^^^ TERMINATED BY '\\r\\n';"
Kann es sein, daß hier der "\" als Escapezeichen gewünscht ist? IMO müsste der dann selber escaped werden, da er ja so das nachfolgende Zeichen escaped und der dadurch das Statement wie folgt aussieht: LOAD DATA INFILE '/wo/auch/immer/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY ' LINES TERMINATED BY '\r\n';
Ehrlich gesagt kann ich oben genannte Meldung nicht nachvollziehen.
Möglicherweise versucht mysql dann den letzten Teil des Statements "\n'" als Dateiname zu interpretieren.
Servus, Daniel
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo, Am Wed, 31 Dec 2003, Andreas Rau schrieb:
echo "$MYSQL_TXT" | mysql ...
bekomme ich folgende Fehlermeldung: ERROR 1102 at line 1: Incorrect database name '\n''
Dann stimmt das quoting noch nicht. Das habe ich auch nicht genauer angeschaut.
Am Tue, 30 Dec 2003, Andreas Rau schrieb:
bekomme ich es nicht hin, folgende Zeilen zum Laufen zu bringen: [..] mysql -h ${DBSERVER} -u ${DBUSER} -p"${DBPASSWD}" ${DB} < echo $MYSQL_TXT ^^^^^^^^^^^^^^^^^ was zum Geier soll das denn sein?
Ja, geht auch ohne " bei $DBPASSWD
Flasche Stelle. Du solltest deine Mails mit einem nicht-proportionalen Font lesen. Unterstrichen war alles ab dem "< echo". Und bitte produziere kein TOFU. -dnh -- A: Weil es die Lesbarkeit des Textes verschlechtert. F: Warum ist TOFU so schlimm? A: TOFU F: Was ist eins der groesste Aergernisse im Usenet?
Hallo Liste, Hallo Andreas, Am Di, 2003-12-30 um 22.33 schrieb Andreas Rau:
MYSQL_TXT="LOAD DATA INFILE '${BACKUP_PATH}/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\' LINES TERMINATED BY '\\r\\n';"
Muesste es nicht ... TERMINATED BY '\r\n'... heissen? Importierst Du DOS-Daten?
mysql -h ${DBSERVER} -u ${DBUSER} -p"${DBPASSWD}" ${DB} < echo $MYSQL_TXT
-----------------------------------------------------------------------
Entweder packst Du das "LOAD ..."-Statement in eine extra SQL-Datei: mysql -h ${DBSERVER} -u ${DBUSER} -p"${DBPASSWD}" ${DB} < stmt.sql oder mit e-Option im Skript sollte auch funktionieren: mysql -h ${DBSERVER} -u ${DBUSER} -p"${DBPASSWD}" -e $MYSQL_TXT ${DB} Gruss und Guten Rutsch Mario
Am Mittwoch, 31. Dezember 2003 16:06 schrieb Mario Heiner:
Hallo Liste, Hallo Andreas,
Am Di, 2003-12-30 um 22.33 schrieb Andreas Rau:
MYSQL_TXT="LOAD DATA INFILE '${BACKUP_PATH}/db_inserts' REPLACE INTO TABLE dvd FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\' LINES TERMINATED BY '\\r\\n';"
Muesste es nicht ... TERMINATED BY '\r\n'... heissen?
Ohne micht mit dem ursprünglichen Problem nähe auseinadern zu setzen,
zitiere ich mal wie ich in einem Shellscript importiere. Vielleicht
kannst du dir daraus was abschauen.
mysql --host=$MYSQLHOST -A --user=$MYSQLUSER --password=$MYSQLPWD
$MYSQLDB <
participants (5)
-
Al Bogner
-
Andreas Rau
-
Daniel Marquart
-
David Haller
-
Mario Heiner