Frage

MySQL ist genial! Ich bin derzeit in einer großen Servermigration beteiligt und zuvor, unsere kleine Datenbank verwendet, um auf dem gleichen Server wie die Client gehostet werden.
So haben wir dies zu tun: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

Nun zogen wir die Datenbank auf einen anderen Server und SELECT * INTO OUTFILE .... nicht mehr funktioniert, verständlich - aus Sicherheitsgründen, glaube ich. Aber interessanter kann LOAD DATA INFILE .... zu LOAD DATA LOCAL INFILE .... und bam geändert werden, es funktioniert.

Ich beklage mich nicht noch bin ich Ekel gegenüber MySQL Ausdruck zu bringen. Die Alternative zu, die hinzugefügt 2 Zeilen zusätzlichen Code und ein Systemaufruf ein .sql Script bilden. Alles, was ich wissen wollte, weshalb LOAD DATA LOCAL INFILE funktioniert und warum ist es so etwas wie SELECT INTO OUTFILE LOCAL?

Ich habe meine Hausaufgaben, konnte keine direkte Antwort auf meine Fragen oben finden. Ich konnte kein Feature-Request @ MySQL entweder finden. Wenn jemand, dass aufklären kann, hatte das genial!

Is MariaDB Lage, dieses Problem zu umgehen?

War es hilfreich?

Lösung

Aus dem Handbuch: The SELECT ... INTO OUTFILE Erklärung soll Ihnen in erster Linie lassen sich sehr schnell eine Tabelle in eine Textdatei auf dem Server-Rechner auszugeben. Wenn Sie die resultierende Datei auf einem Client-Host als den Server-Host erstellen möchten, können Sie nicht SELECT ... INTO OUTFILE verwenden. In diesem Fall sollten Sie stattdessen einen Befehl wie mysql -e "SELECT ..." > file_name verwenden, um die Datei auf der 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

Andere Tipps

können Sie erreichen, was Sie mit der mysql-Konsole wollen mit der sie (--silent) Option übergeben.

Es ist wahrscheinlich eine gute Idee, auch in der -r (--raw) Option übergeben, so dass die Sonderzeichen nicht entkommen lassen. Sie können diese Abfragen Rohr verwenden wie Sie wollen.

mysql -u Benutzername h Host-Name -p es -r-„select concat ( 'this',‘‘, 'Werke')"

EDIT: Auch wenn Sie die Spaltennamen aus Ihrer Ausgabe zu entfernen, fügen Sie einfach eine anderes es (. Mysql -ss -r etc)

Der Weg, den Sie zu LOAD DATA INFILE geben für das Dateisystem auf der Maschine, auf der der Server läuft, nicht die Maschine verbinden Sie aus. LOAD DATA LOCAL INFILE ist für die Maschine des Kunden, aber es erfordert, dass der der Server mit den richtigen Einstellungen gestartet wurde, sonst ist es nicht erlaubt. Sie können sich alles um hier zu lesen: http: // dev .mysql.com / doc / refman / 5.0 / de / Last-data-local.html

Wie bei SELECT INTO OUTFILE Ich bin nicht sicher, warum es nicht eine lokale Version, außerdem ist es wahrscheinlich heikel ist, um die Verbindung zu tun über. Sie können die gleiche Funktionalität durch das mysqldump Werkzeug zu bekommen, aber nicht SQL Server durch das Senden.

Mit mysql CLI mit Option -e als Waverly360 vorschlägt, ist ein guter, aber das könnte der Speicher gehen und auf große Ergebnisse getötet. (Havent findet den Grund dahinter). Wenn das der Fall ist, und Sie müssen alle Datensätze, meine Lösung ist: 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

Re: SELECT * INTO OUTFILE

Überprüfen Sie, ob MySQL-Berechtigungen eine Datei in das OUTFILE Verzeichnis auf dem Server zu schreiben.

Da ich mich eher regelmäßig für dieses genaue Problem der Suche finden (in der Hoffnung, habe ich etwas verpasst, bis ...), habe ich endlich beschlossen, die Zeit zu nehmen und ein kleiner Kern zu exportieren MySQL-Abfragen als CSV-Dateien , ein bisschen wie https: //stackoverflow.com/a/28168869 sondern basiert auf PHP und mit ein paar mehr Optionen. Das war wichtig für meinen Anwendungsfall, denn ich brauchen die CSV-Parameter (Trennzeichen, NULL Wert Handling) und die Dateien auf der Feinabstimmung der Lage sein muß, tatsächlich gültig CSV sein, so dass eine einfache CONCAT nicht ausreichend ist, da es doesn‘ t erzeugen gültige CSV-Dateien, wenn die Werte Zeilenumbrüche oder die CSV-Trennzeichen enthalten.

Achtung: Benötigt PHP auf dem Server installiert werden (Kann über php -v geprü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

(Download-Inhalt des Wesentlichen, Check-Prüfsumme und machen es ausführbar)

Anwendungsbeispiel

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

erzeugt Datei /tmp/result.csv mit Inhalt

foo,bar
1,2

Hilfe Referenz

./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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top