it-swarm.com.de

MySQL - SELECT * IN OUTFILE LOKAL?

MySQL ist großartig! Ich bin derzeit an einer großen Servermigration beteiligt und unsere kleine Datenbank wurde früher auf demselben Server gehostet wie der Client. 
Also haben wir das gemacht: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

Nun haben wir die Datenbank auf einen anderen Server verschoben und SELECT * INTO OUTFILE .... funktioniert nicht mehr, verständlich - Sicherheitsgründe glaube ich ..__, aber interessanterweise LOAD DATA INFILE .... kann in LOAD DATA LOCAL INFILE .... und bam geändert werden, es funktioniert.

Ich beschwere mich nicht und drücke auch keine Abscheu gegenüber MySQL aus. Die Alternative dazu fügte 2 zusätzliche Zeilen hinzu und ein Systemaufruf bildet ein SQL-Skript. Ich wollte nur wissen, warum LOAD DATA LOCAL INFILE funktioniert und warum gibt es keine SELECT INTO OUTFILE LOCAL?

Ich habe meine Hausaufgaben gemacht und konnte keine direkte Antwort auf meine Fragen finden. Ich konnte auch keine Funktionsanforderung in MySQL finden. Wenn jemand das klären kann, war das fantastisch! 

Kann MariaDB dieses Problem lösen?

37
ThinkCode

Aus dem Handbuch: Die Anweisung The SELECT ... INTO OUTFILE soll in erster Linie eine Tabelle sehr schnell in eine Textdatei auf dem Servercomputer sichern. Wenn Sie die resultierende Datei auf einem anderen Client-Host als dem Server-Host erstellen möchten, können Sie SELECT ... INTO OUTFILE nicht verwenden. In diesem Fall sollten Sie stattdessen einen Befehl wie mysql -e "SELECT ..." > file_name verwenden, um die Datei auf dem Client-Host zu generieren. " 

http://dev.mysql.com/doc/refman/5.0/de/select.html

Ein Beispiel:

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt
51
jerrygarciuh

Mit der Option -s (--silent) können Sie mit der mysql-Konsole erreichen, was Sie möchten.

Es ist wahrscheinlich eine gute Idee, auch die Option -r (--raw) zu übergeben, damit Sonderzeichen nicht maskiert werden. Sie können dies verwenden, um Abfragen so zu leiten, wie Sie möchten.

mysql -u Benutzername -h Hostname -p -s -r -e "select concat ('this', '', 'works')"

BEARBEITEN: Wenn Sie den Spaltennamen aus Ihrer Ausgabe entfernen möchten, fügen Sie einfach ein weiteres -s hinzu (mysql -ss -r usw.).

7
Waverly360

Der Pfad, den Sie LOAD DATA INFILE angeben, bezieht sich auf das Dateisystem auf dem Computer, auf dem der Server ausgeführt wird, und nicht auf den Computer, von dem aus Sie eine Verbindung herstellen. LOAD DATA LOCAL INFILE ist für den Client-Computer, der Server muss jedoch mit den richtigen Einstellungen gestartet werden. Andernfalls ist dies nicht zulässig. Sie können alles darüber hier lesen: http://dev.mysql.com/doc/refman/5.0/de/load-data-local.html

Was SELECT INTO OUTFILE angeht, bin ich mir nicht sicher, warum es keine lokale Version gibt. Außerdem ist es wahrscheinlich schwierig, die Verbindung über die Verbindung auszuführen. Sie können dieselbe Funktionalität über das Tool mysqldump erhalten, nicht jedoch über das Senden von SQL an den Server.

5
Theo

Re: SELECT * INTOFILE 

Überprüfen Sie, ob MySQL über Berechtigungen zum Schreiben einer Datei in das OUTFILE-Verzeichnis auf dem Server verfügt.

2
Snowcrash

Die Verwendung der mysql-CLI mit der Option -e, wie Waverly360 vorschlägt, ist eine gute, aber das könnte zu wenig Speicherplatz bringen und bei großen Ergebnissen zum Erliegen kommen. (Habe den Grund dafür nicht gefunden) . Wenn dies der Fall ist und Sie alle Datensätze benötigen, lautet meine Lösung: mysqldump + mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
mysqldump -u username -p --Host=hostname database table | python mysqldump_to_csv.py > table.csv
2
Vajk Hermecz

Da ich mich ziemlich regelmäßig auf die Suche nach diesem exakten Problem stelle (in der Hoffnung, dass ich vorher etwas vermisst habe ...), entschied ich mich schließlich, mir die Zeit zu nehmen und einen kleinen Gist zu schreiben, um MySQL-Abfragen als CSV-Dateien zu exportieren Wie https://stackoverflow.com/a/28168869 , aber basierend auf PHP und mit einigen weiteren Optionen. Dies war für meinen Anwendungsfall wichtig, da ich die CSV-Parameter (Trennzeichen, NULL-Wert-Behandlung) fein abstimmen muss UND die Dateien tatsächlich gültige CSV-Werte sein müssen, damit eine einfache CONCAT nicht ausreicht, da dies nicht der Fall ist. t Generieren Sie gültige CSV-Dateien, wenn die Werte Zeilenumbrüche oder das CSV-Trennzeichen enthalten.

Achtung: Erfordert, dass PHP auf dem Server installiert ist! (Kann über php -v überprüft werden)

"Installieren" mysql2csv über

wget https://Gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(Laden Sie den Inhalt der Gist herunter, prüfen Sie die Prüfsumme und machen Sie sie ausführbar.)

Verwendungsbeispiel

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

erzeugt die Datei /tmp/result.csv mit Inhalt

foo,bar
1,2

help for reference

./mysql2csv --help
Helper command to export data for an arbitrary mysql query into a CSV file.
Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
because the mysql server is running on a remote Host.

Usage example:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

cat /tmp/result.csv

Options:
        -q,--query=name [required]
                The query string to extract data from mysql.
        -h,--Host=name
                (Default: 127.0.0.1) The hostname of the mysql server.
        -D,--database=name
                The default database.
        -P,--port=name
                (Default: 3306) The port of the mysql server.
        -u,--user=name
                The username to connect to the mysql server.
        -p,--password=name
                The password to connect to the mysql server.
        -F,--file=name
                (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
        -L,--delimiter=name
                (Default: ,) The CSV delimiter.
        -C,--Enclosure=name
                (Default: ") The CSV Enclosure (that is used to enclose values that contain special characters).
        -E,--escape=name
                (Default: \) The CSV escape character.
        -N,--null=name
                (Default: \N) The value that is used to replace NULL values in the CSV file.
        -H,--header=name
                (Default: 1) If '0', the resulting CSV file does not contain headers.
        --help
                Prints the help for this command.
0
Hirnhamster